From ad798ded6f78a24efc853526493ed34d26f99bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 00:18:34 +0100 Subject: [PATCH 01/26] break tests by introducing problematic dollar --- .../3_0/kotlin/petstore-with-tags.yaml | 59 +++++++++++++++ .../petstore-with-x-kotlin-implements.yaml | 60 ++++++++++++++- .../.openapi-generator/FILES | 6 ++ .../kotlin/org/openapitools/api/ItemsApi.kt | 73 +++++++++++++++++++ .../openapitools/api/ItemsApiController.kt | 22 ++++++ .../org/openapitools/api/ItemsApiDelegate.kt | 28 +++++++ .../ItemWithDollarAttributesAndExamples.kt | 36 +++++++++ .../model/ItemsItemIdGet200Response.kt | 42 +++++++++++ .../ItemsItemIdGet200ResponseDetailsInfo.kt | 36 +++++++++ .../.openapi-generator/FILES | 4 + .../kotlin/org/openapitools/api/ItemsApi.kt | 68 +++++++++++++++++ .../ItemWithDollarAttributesAndExamples.kt | 36 +++++++++ .../model/ItemsItemIdGet200Response.kt | 42 +++++++++++ .../ItemsItemIdGet200ResponseDetailsInfo.kt | 36 +++++++++ 14 files changed, 547 insertions(+), 1 deletion(-) create mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt create mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt create mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml index 062ab023e2d0..cc9cef6857c9 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml @@ -654,6 +654,53 @@ paths: 404: description: User not found content: { } + /items/{item$Id}: + get: + summary: "Retrieve item by $Id" + description: "Get an item using the $symbol in parameter and property names." + parameters: + - name: "item$Id" + in: path + required: true + description: "The $prefixed ID of the item." + schema: + type: string + example: "item$123" + - name: "filter$Type" + in: query + required: false + description: "Optional $filter for item type." + schema: + type: string + example: "type$A" + responses: + '200': + description: "Successful $response" + content: + application/json: + schema: + type: object + properties: + item$Id: + type: string + description: "The $ID of the item." + example: "item$123" + name$Value: + type: string + description: "The $name of the item." + example: "Item$Name" + details$Info: + type: object + description: "Nested object with $keys." + properties: + detail$One: + type: string + description: "First $detail" + example: "Detail$1" + detail$Two: + type: integer + description: "Second $detail" + example: 42 components: schemas: Order: @@ -786,6 +833,18 @@ components: message: type: string description: Describes the result of uploading an image resource + ItemWithDollarAttributesAndExamples: + type: object + description: "A schema demonstrating $usage in properties." + properties: + $id: + type: string + description: "$ID property" + example: "$item123" + $name: + type: string + description: "$Name property" + example: "$ItemName" securitySchemes: petstore_auth: type: oauth2 diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml index b54ec0cd53ef..29820efcedc2 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml @@ -486,7 +486,53 @@ paths: description: Invalid username supplied '404': description: User not found - + /items/{item$Id}: + get: + summary: "Retrieve item by $Id" + description: "Get an item using the $symbol in parameter and property names." + parameters: + - name: "item$Id" + in: path + required: true + description: "The $prefixed ID of the item." + schema: + type: string + example: "item$123" + - name: "filter$Type" + in: query + required: false + description: "Optional $filter for item type." + schema: + type: string + example: "type$A" + responses: + '200': + description: "Successful $response" + content: + application/json: + schema: + type: object + properties: + item$Id: + type: string + description: "The $ID of the item." + example: "item$123" + name$Value: + type: string + description: "The $name of the item." + example: "Item$Name" + details$Info: + type: object + description: "Nested object with $keys." + properties: + detail$One: + type: string + description: "First $detail" + example: "Detail$1" + detail$Two: + type: integer + description: "Second $detail" + example: 42 components: securitySchemes: petstore_auth: @@ -644,3 +690,15 @@ components: type: string message: type: string + ItemWithDollarAttributesAndExamples: + type: object + description: "A schema demonstrating $usage in properties." + properties: + $id: + type: string + description: "$ID property" + example: "$item123" + $name: + type: string + description: "$Name property" + example: "$ItemName" \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES index 8b73d6497e4f..6e78c29b924d 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES @@ -8,6 +8,9 @@ pom.xml settings.gradle src/main/kotlin/org/openapitools/Application.kt src/main/kotlin/org/openapitools/api/ApiUtil.kt +src/main/kotlin/org/openapitools/api/ItemsApi.kt +src/main/kotlin/org/openapitools/api/ItemsApiController.kt +src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt src/main/kotlin/org/openapitools/api/PetApi.kt src/main/kotlin/org/openapitools/api/PetApiController.kt src/main/kotlin/org/openapitools/api/PetApiDelegate.kt @@ -22,6 +25,9 @@ src/main/kotlin/org/openapitools/model/Cat.kt src/main/kotlin/org/openapitools/model/Category.kt src/main/kotlin/org/openapitools/model/Color.kt src/main/kotlin/org/openapitools/model/Dog.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt new file mode 100644 index 000000000000..34019f84183f --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -0,0 +1,73 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.ItemsItemIdGet200Response +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid + +import kotlinx.coroutines.flow.Flow +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "items", description = "The items API") +interface ItemsApi { + + fun getDelegate(): ItemsApiDelegate + + + @ApiOperation( + value = "Retrieve item by $Id", + nickname = "itemsItemIdGet", + notes = "Get an item using the $symbol in parameter and property names.", + response = ItemsItemIdGet200Response::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "Successful $response", response = ItemsItemIdGet200Response::class)] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_GET /* "/items/{item\$Id}" */], + produces = ["application/json"] + ) + suspend fun itemsItemIdGet( + @ApiParam(value = "The $prefixed ID of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, + @ApiParam(value = "Optional $filter for item type.") @Valid @RequestParam(value = "filter$Type", required = false) filterDollarType: kotlin.String?, + @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange + ): ResponseEntity { + return getDelegate().itemsItemIdGet(itemDollarId, filterDollarType, exchange) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_GET: String = "/items/{item$Id}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiController.kt new file mode 100644 index 000000000000..32a891793f22 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -0,0 +1,22 @@ +package org.openapitools.api + +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestMapping +import java.util.Optional +import org.openapitools.api.ItemsApiController.Companion.BASE_PATH + +@javax.annotation.Generated(value = ["org.openapitools.codegen.languages.KotlinSpringServerCodegen"], comments = "Generator version: 7.18.0-SNAPSHOT") +@Controller +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class ItemsApiController( + private val delegate: ItemsApiDelegate +) : ItemsApi { + + override fun getDelegate(): ItemsApiDelegate = delegate + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + } + +} diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt new file mode 100644 index 000000000000..abe059ef7aac --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt @@ -0,0 +1,28 @@ +package org.openapitools.api + +import org.openapitools.model.ItemsItemIdGet200Response +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.web.context.request.NativeWebRequest +import kotlinx.coroutines.flow.Flow + +import java.util.Optional + +/** + * A delegate to be called by the {@link ItemsApiController}}. + * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. + */ +@javax.annotation.Generated(value = ["org.openapitools.codegen.languages.KotlinSpringServerCodegen"], comments = "Generator version: 7.18.0-SNAPSHOT") +interface ItemsApiDelegate { + + fun getRequest(): Optional = Optional.empty() + + /** + * @see ItemsApi#itemsItemIdGet + */ + suspend fun itemsItemIdGet(itemDollarId: kotlin.String, + filterDollarType: kotlin.String?, + exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity + +} diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..6d5007f695f7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A schema demonstrating $usage in properties. + * @param dollarId $ID property + * @param dollarName $Name property + */ +data class ItemWithDollarAttributesAndExamples( + + @ApiModelProperty(example = "\$item123", value = "\$ID property") + @get:JsonProperty("$id") val dollarId: kotlin.String? = null, + + @ApiModelProperty(example = "\$ItemName", value = "\$Name property") + @get:JsonProperty("$name") val dollarName: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt new file mode 100644 index 000000000000..9519c951ec61 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdGet200ResponseDetailsInfo +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param itemDollarId The $ID of the item. + * @param nameDollarValue The $name of the item. + * @param detailsDollarInfo + */ +data class ItemsItemIdGet200Response( + + @ApiModelProperty(example = "item\$123", value = "The \$ID of the item.") + @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = null, + + @ApiModelProperty(example = "Item\$Name", value = "The \$name of the item.") + @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = null, + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("details$Info") val detailsDollarInfo: ItemsItemIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..49f918607272 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * Nested object with $keys. + * @param detailDollarOne First $detail + * @param detailDollarTwo Second $detail + */ +data class ItemsItemIdGet200ResponseDetailsInfo( + + @ApiModelProperty(example = "Detail\$1", value = "First \$detail") + @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = null, + + @ApiModelProperty(example = "42", value = "Second \$detail") + @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES index 59aed4399e9f..3963f9d13b02 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES @@ -8,6 +8,7 @@ pom.xml settings.gradle src/main/kotlin/org/openapitools/api/ApiUtil.kt src/main/kotlin/org/openapitools/api/Exceptions.kt +src/main/kotlin/org/openapitools/api/ItemsApi.kt src/main/kotlin/org/openapitools/api/PetApi.kt src/main/kotlin/org/openapitools/api/StoreApi.kt src/main/kotlin/org/openapitools/api/UserApi.kt @@ -16,6 +17,9 @@ src/main/kotlin/org/openapitools/model/Cat.kt src/main/kotlin/org/openapitools/model/Category.kt src/main/kotlin/org/openapitools/model/Color.kt src/main/kotlin/org/openapitools/model/Dog.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt new file mode 100644 index 000000000000..930e8e64ded3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -0,0 +1,68 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.ItemsItemIdGet200Response +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "items", description = "The items API") +interface ItemsApi { + + + @ApiOperation( + value = "Retrieve item by $Id", + nickname = "itemsItemIdGet", + notes = "Get an item using the $symbol in parameter and property names.", + response = ItemsItemIdGet200Response::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "Successful $response", response = ItemsItemIdGet200Response::class)] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_GET /* "/items/{item\$Id}" */], + produces = ["application/json"] + ) + fun itemsItemIdGet( + @ApiParam(value = "The $prefixed ID of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, + @ApiParam(value = "Optional $filter for item type.") @Valid @RequestParam(value = "filter$Type", required = false) filterDollarType: kotlin.String?, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_GET: String = "/items/{item$Id}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..6d5007f695f7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A schema demonstrating $usage in properties. + * @param dollarId $ID property + * @param dollarName $Name property + */ +data class ItemWithDollarAttributesAndExamples( + + @ApiModelProperty(example = "\$item123", value = "\$ID property") + @get:JsonProperty("$id") val dollarId: kotlin.String? = null, + + @ApiModelProperty(example = "\$ItemName", value = "\$Name property") + @get:JsonProperty("$name") val dollarName: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt new file mode 100644 index 000000000000..9519c951ec61 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdGet200ResponseDetailsInfo +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param itemDollarId The $ID of the item. + * @param nameDollarValue The $name of the item. + * @param detailsDollarInfo + */ +data class ItemsItemIdGet200Response( + + @ApiModelProperty(example = "item\$123", value = "The \$ID of the item.") + @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = null, + + @ApiModelProperty(example = "Item\$Name", value = "The \$name of the item.") + @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = null, + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("details$Info") val detailsDollarInfo: ItemsItemIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..49f918607272 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * Nested object with $keys. + * @param detailDollarOne First $detail + * @param detailDollarTwo Second $detail + */ +data class ItemsItemIdGet200ResponseDetailsInfo( + + @ApiModelProperty(example = "Detail\$1", value = "First \$detail") + @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = null, + + @ApiModelProperty(example = "42", value = "Second \$detail") + @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + From b25bb651ff6f72e11c87c10a06bc68ef266ead8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 12:20:58 +0100 Subject: [PATCH 02/26] break everything by more defaults and dollars and double quotes --- ...otlin-spring-boot-x-kotlin-implements.yaml | 2 +- .../3_0/kotlin/petstore-with-tags.yaml | 95 ++++++-- .../petstore-with-x-kotlin-implements.yaml | 95 ++++++-- .../kotlin/org/openapitools/api/ItemsApi.kt | 41 +++- .../org/openapitools/api/ItemsApiDelegate.kt | 14 +- .../ItemWithDollarAttributesAndExamples.kt | 14 +- .../model/ItemsItemIdGet200Response.kt | 12 +- .../ItemsItemIdGet200ResponseDetailsInfo.kt | 12 +- .../.openapi-generator/FILES | 10 +- .../build.gradle.kts | 4 - .../pom.xml | 8 +- .../kotlin/org/openapitools/Application.kt | 13 + .../kotlin/org/openapitools/api/ItemsApi.kt | 10 +- .../openapitools/api/ItemsApiController.kt | 93 ++++++++ .../org/openapitools/api/PetApiController.kt | 224 ++++++++++++++++++ .../openapitools/api/StoreApiController.kt | 126 ++++++++++ .../org/openapitools/api/UserApiController.kt | 203 ++++++++++++++++ .../ItemWithDollarAttributesAndExamples.kt | 14 +- .../model/ItemsItemIdGet200Response.kt | 12 +- .../ItemsItemIdGet200ResponseDetailsInfo.kt | 12 +- .../org/openapitools/api/ItemsApiTest.kt | 46 ++++ 21 files changed, 957 insertions(+), 103 deletions(-) create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/Application.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt diff --git a/bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml b/bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml index 1d1218b58452..8d5911e56c37 100644 --- a/bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml +++ b/bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml @@ -9,7 +9,7 @@ additionalProperties: useSwaggerUI: false serviceImplementation: false skipDefaultInterface: true - interfaceOnly: true + interfaceOnly: false serializableModel: true beanValidations: true includeHttpRequestContext: true diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml index cc9cef6857c9..0107e77cb897 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml @@ -656,26 +656,41 @@ paths: content: { } /items/{item$Id}: get: - summary: "Retrieve item by $Id" - description: "Get an item using the $symbol in parameter and property names." + summary: "Retrieve item \"by\" $Id" + description: "Get an item using the $symbol in \"parameter\" and property names." parameters: - name: "item$Id" in: path required: true - description: "The $prefixed ID of the item." + description: "The $prefixed \"ID\" of the item." schema: type: string - example: "item$123" + example: "i\"te\"m$123" - name: "filter$Type" in: query required: false - description: "Optional $filter for item type." + description: "Optional $filter \"for\" item type." schema: type: string - example: "type$A" + example: "\"type$A\"" + "default": "\"type\"$ADefault" + - name: "X-Custom$Header" + in: header + required: false + description: "Header param with $" + schema: + type: string + example: "hdr$val" + - name: "session$Token" + in: cookie + required: false + description: "Cookie param with $dol\"lar\"" + schema: + type: string + example: "cookie$a\"bc\"" responses: '200': - description: "Successful $response" + description: "\"Successful $response\"" content: application/json: schema: @@ -683,24 +698,62 @@ paths: properties: item$Id: type: string - description: "The $ID of the item." - example: "item$123" + description: "The $ID of \"the\" item." + example: "\"item$123\"" + default: "Item$Id\"Default\"" name$Value: type: string - description: "The $name of the item." - example: "Item$Name" + description: "The $name \"of the \"item." + example: "\"Item\"$Name" + default: "Item$\"NameDefault\"" details$Info: type: object - description: "Nested object with $keys." + description: "Nested \"object\" with $keys." properties: detail$One: type: string - description: "First $detail" - example: "Detail$1" + description: "\"First $detail\"" + example: "\"Detail$1\"" + default: "\"Detail\"$1Default" detail$Two: type: integer - description: "Second $detail" + description: "\"Second\" $detail" example: 42 + /items: + post: + summary: "Create $it\"em\"" + description: "POST using form params and $every\"where\"." + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + form$Name: + type: string + description: "Form field with $issue \"fdsfsd\"" + example: "Name$X\"fsdfsd\"" + form$Value: + type: string + description: "Another $form \"field\"" + example: "Val$Y\"fdfsdf\"" + parameters: + - name: "X-Post$Header" + in: header + required: false + description: "Header \"param\" with $" + schema: + type: string + example: "hdr$po\"st\"" + + responses: + "201": + description: "$test \"created\"" + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" components: schemas: Order: @@ -835,16 +888,18 @@ components: description: Describes the result of uploading an image resource ItemWithDollarAttributesAndExamples: type: object - description: "A schema demonstrating $usage in properties." + description: "A schema \"demonstrating\" $usage in properties." properties: $id: type: string - description: "$ID property" - example: "$item123" + description: "\"$ID property\"" + example: "$item\"123\"" + default: "$item\"123Default\"" $name: type: string - description: "$Name property" - example: "$ItemName" + description: "$Name\" property\"" + example: "$Item\"Name" + default: "$ItemNameDefault\"" securitySchemes: petstore_auth: type: oauth2 diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml index 29820efcedc2..3565d8f0768d 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml @@ -488,26 +488,41 @@ paths: description: User not found /items/{item$Id}: get: - summary: "Retrieve item by $Id" - description: "Get an item using the $symbol in parameter and property names." + summary: "Retrieve item \"by\" $Id" + description: "Get an item using the $symbol in \"parameter\" and property names." parameters: - name: "item$Id" in: path required: true - description: "The $prefixed ID of the item." + description: "The $prefixed \"ID\" of the item." schema: type: string - example: "item$123" + example: "i\"te\"m$123" - name: "filter$Type" in: query required: false - description: "Optional $filter for item type." + description: "Optional $filter \"for\" item type." schema: type: string - example: "type$A" + example: "\"type$A\"" + "default": "\"type\"$ADefault" + - name: "X-Custom$Header" + in: header + required: false + description: "Header param with $" + schema: + type: string + example: "hdr$val" + - name: "session$Token" + in: cookie + required: false + description: "Cookie param with $dol\"lar\"" + schema: + type: string + example: "cookie$a\"bc\"" responses: '200': - description: "Successful $response" + description: "\"Successful $response\"" content: application/json: schema: @@ -515,24 +530,62 @@ paths: properties: item$Id: type: string - description: "The $ID of the item." - example: "item$123" + description: "The $ID of \"the\" item." + example: "\"item$123\"" + default: "Item$Id\"Default\"" name$Value: type: string - description: "The $name of the item." - example: "Item$Name" + description: "The $name \"of the \"item." + example: "\"Item\"$Name" + default: "Item$\"NameDefault\"" details$Info: type: object - description: "Nested object with $keys." + description: "Nested \"object\" with $keys." properties: detail$One: type: string - description: "First $detail" - example: "Detail$1" + description: "\"First $detail\"" + example: "\"Detail$1\"" + default: "\"Detail\"$1Default" detail$Two: type: integer - description: "Second $detail" + description: "\"Second\" $detail" example: 42 + /items: + post: + summary: "Create $it\"em\"" + description: "POST using form params and $every\"where\"." + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + form$Name: + type: string + description: "Form field with $issue \"fdsfsd\"" + example: "Name$X\"fsdfsd\"" + form$Value: + type: string + description: "Another $form \"field\"" + example: "Val$Y\"fdfsdf\"" + parameters: + - name: "X-Post$Header" + in: header + required: false + description: "Header \"param\" with $" + schema: + type: string + example: "hdr$po\"st\"" + + responses: + "201": + description: "$test \"created\"" + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" components: securitySchemes: petstore_auth: @@ -692,13 +745,15 @@ components: type: string ItemWithDollarAttributesAndExamples: type: object - description: "A schema demonstrating $usage in properties." + description: "A schema \"demonstrating\" $usage in properties." properties: $id: type: string - description: "$ID property" - example: "$item123" + description: "\"$ID property\"" + example: "$item\"123\"" + default: "$item\"123Default\"" $name: type: string - description: "$Name property" - example: "$ItemName" \ No newline at end of file + description: "$Name\" property\"" + example: "$Item\"Name" + default: "$ItemNameDefault\"" \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt index 34019f84183f..3320da5255ec 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -5,6 +5,7 @@ */ package org.openapitools.api +import org.openapitools.model.ItemWithDollarAttributesAndExamples import org.openapitools.model.ItemsItemIdGet200Response import io.swagger.annotations.Api import io.swagger.annotations.ApiOperation @@ -45,13 +46,13 @@ interface ItemsApi { @ApiOperation( - value = "Retrieve item by $Id", + value = "Retrieve item \"by\" $Id", nickname = "itemsItemIdGet", - notes = "Get an item using the $symbol in parameter and property names.", + notes = "Get an item using the $symbol in \"parameter\" and property names.", response = ItemsItemIdGet200Response::class ) @ApiResponses( - value = [ApiResponse(code = 200, message = "Successful $response", response = ItemsItemIdGet200Response::class)] + value = [ApiResponse(code = 200, message = "\"Successful $response\"", response = ItemsItemIdGet200Response::class)] ) @RequestMapping( method = [RequestMethod.GET], @@ -59,15 +60,43 @@ interface ItemsApi { produces = ["application/json"] ) suspend fun itemsItemIdGet( - @ApiParam(value = "The $prefixed ID of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, - @ApiParam(value = "Optional $filter for item type.") @Valid @RequestParam(value = "filter$Type", required = false) filterDollarType: kotlin.String?, + @ApiParam(value = "The $prefixed \"ID\" of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, + @ApiParam(value = "Optional $filter \"for\" item type.", defaultValue = "\"type\"$ADefault") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "\"type\"$ADefault") filterDollarType: kotlin.String, + @ApiParam(value = "Header param with $") @RequestHeader(value = "X-Custom$Header", required = false) xCustomDollarHeader: kotlin.String?, + @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange ): ResponseEntity { - return getDelegate().itemsItemIdGet(itemDollarId, filterDollarType, exchange) + return getDelegate().itemsItemIdGet(itemDollarId, filterDollarType, xCustomDollarHeader, sessionDollarToken, exchange) + } + + + @ApiOperation( + value = "Create $it\"em\"", + nickname = "itemsPost", + notes = "POST using form params and $every\"where\".", + response = ItemWithDollarAttributesAndExamples::class + ) + @ApiResponses( + value = [ApiResponse(code = 201, message = "$test \"created\"", response = ItemWithDollarAttributesAndExamples::class)] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + suspend fun itemsPost( + @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Post$Header", required = false) xPostDollarHeader: kotlin.String?, + @ApiParam(value = "Form field with $issue \\\"fdsfsd\\\"") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "Another $form \\\"field\\\"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String?, + @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange + ): ResponseEntity { + return getDelegate().itemsPost(xPostDollarHeader, formDollarName, formDollarValue, exchange) } companion object { //for your own safety never directly reuse these path definitions in tests const val PATH_ITEMS_ITEM_ID_GET: String = "/items/{item$Id}" + const val PATH_ITEMS_POST: String = "/items" } } diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt index abe059ef7aac..332684082fe5 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt @@ -1,5 +1,6 @@ package org.openapitools.api +import org.openapitools.model.ItemWithDollarAttributesAndExamples import org.openapitools.model.ItemsItemIdGet200Response import org.springframework.http.HttpStatus import org.springframework.http.MediaType @@ -22,7 +23,18 @@ interface ItemsApiDelegate { * @see ItemsApi#itemsItemIdGet */ suspend fun itemsItemIdGet(itemDollarId: kotlin.String, - filterDollarType: kotlin.String?, + filterDollarType: kotlin.String, + xCustomDollarHeader: kotlin.String?, + sessionDollarToken: kotlin.String?, exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity + + /** + * @see ItemsApi#itemsPost + */ + suspend fun itemsPost(xPostDollarHeader: kotlin.String?, + formDollarName: kotlin.String?, + formDollarValue: kotlin.String?, + exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity + } diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt index 6d5007f695f7..f130e20d4448 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -16,17 +16,17 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * A schema demonstrating $usage in properties. - * @param dollarId $ID property - * @param dollarName $Name property + * A schema \"demonstrating\" $usage in properties. + * @param dollarId \"$ID property\" + * @param dollarName $Name\" property\" */ data class ItemWithDollarAttributesAndExamples( - @ApiModelProperty(example = "\$item123", value = "\$ID property") - @get:JsonProperty("$id") val dollarId: kotlin.String? = null, + @ApiModelProperty(example = "\$item\"123\"", value = "\"$ID property\"") + @get:JsonProperty("$id") val dollarId: kotlin.String? = "$item\"123Default\"", - @ApiModelProperty(example = "\$ItemName", value = "\$Name property") - @get:JsonProperty("$name") val dollarName: kotlin.String? = null + @ApiModelProperty(example = "\$Item\"Name", value = "$Name\" property\"") + @get:JsonProperty("$name") val dollarName: kotlin.String? = "$ItemNameDefault\"" ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt index 9519c951ec61..d6cc8540cd38 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt @@ -18,17 +18,17 @@ import io.swagger.annotations.ApiModelProperty /** * - * @param itemDollarId The $ID of the item. - * @param nameDollarValue The $name of the item. + * @param itemDollarId The $ID of \"the\" item. + * @param nameDollarValue The $name \"of the \"item. * @param detailsDollarInfo */ data class ItemsItemIdGet200Response( - @ApiModelProperty(example = "item\$123", value = "The \$ID of the item.") - @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = null, + @ApiModelProperty(example = "\"item\$123\"", value = "The $ID of \"the\" item.") + @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = "Item$Id\"Default\"", - @ApiModelProperty(example = "Item\$Name", value = "The \$name of the item.") - @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = null, + @ApiModelProperty(example = "\"Item\"\$Name", value = "The $name \"of the \"item.") + @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = "Item$\"NameDefault\"", @field:Valid @ApiModelProperty(example = "null", value = "") diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt index 49f918607272..83e4cc53b514 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt @@ -16,16 +16,16 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * Nested object with $keys. - * @param detailDollarOne First $detail - * @param detailDollarTwo Second $detail + * Nested \"object\" with $keys. + * @param detailDollarOne \"First $detail\" + * @param detailDollarTwo \"Second\" $detail */ data class ItemsItemIdGet200ResponseDetailsInfo( - @ApiModelProperty(example = "Detail\$1", value = "First \$detail") - @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = null, + @ApiModelProperty(example = "\"Detail\$1\"", value = "\"First $detail\"") + @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = "\"Detail\"$1Default", - @ApiModelProperty(example = "42", value = "Second \$detail") + @ApiModelProperty(example = "42", value = "\"Second\" $detail") @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null ) : Serializable { diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES index 3963f9d13b02..edfc8025b478 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES @@ -6,12 +6,13 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/Application.kt src/main/kotlin/org/openapitools/api/ApiUtil.kt src/main/kotlin/org/openapitools/api/Exceptions.kt -src/main/kotlin/org/openapitools/api/ItemsApi.kt -src/main/kotlin/org/openapitools/api/PetApi.kt -src/main/kotlin/org/openapitools/api/StoreApi.kt -src/main/kotlin/org/openapitools/api/UserApi.kt +src/main/kotlin/org/openapitools/api/ItemsApiController.kt +src/main/kotlin/org/openapitools/api/PetApiController.kt +src/main/kotlin/org/openapitools/api/StoreApiController.kt +src/main/kotlin/org/openapitools/api/UserApiController.kt src/main/kotlin/org/openapitools/configuration/EnumConverterConfiguration.kt src/main/kotlin/org/openapitools/model/Cat.kt src/main/kotlin/org/openapitools/model/Category.kt @@ -25,3 +26,4 @@ src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt src/main/kotlin/org/openapitools/model/Tag.kt src/main/kotlin/org/openapitools/model/User.kt +src/main/resources/application.yaml diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/build.gradle.kts b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/build.gradle.kts index 10a80f14f0ff..70561b9c46ef 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/build.gradle.kts +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/build.gradle.kts @@ -20,10 +20,6 @@ tasks.withType { kotlinOptions.jvmTarget = "11" } -tasks.bootJar { - enabled = false -} - plugins { val kotlinVersion = "1.9.25" id("org.jetbrains.kotlin.jvm") version kotlinVersion diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/pom.xml b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/pom.xml index 067cb2bbd025..afa447d2d2a4 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/pom.xml +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/pom.xml @@ -24,17 +24,17 @@ ${project.basedir}/src/test/kotlin - org.apache.maven.plugins - maven-source-plugin + org.springframework.boot + spring-boot-maven-plugin - attach-sources - jar + repackage + kotlin-maven-plugin org.jetbrains.kotlin diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/Application.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/Application.kt new file mode 100644 index 000000000000..2fe6de62479e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/Application.kt @@ -0,0 +1,13 @@ +package org.openapitools + +import org.springframework.boot.runApplication +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.context.annotation.ComponentScan + +@SpringBootApplication +@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt index 930e8e64ded3..b5a8e5e5e14d 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -42,13 +42,13 @@ interface ItemsApi { @ApiOperation( - value = "Retrieve item by $Id", + value = "Retrieve item \"by\" $Id", nickname = "itemsItemIdGet", - notes = "Get an item using the $symbol in parameter and property names.", + notes = "Get an item using the $symbol in \"parameter\" and property names.", response = ItemsItemIdGet200Response::class ) @ApiResponses( - value = [ApiResponse(code = 200, message = "Successful $response", response = ItemsItemIdGet200Response::class)] + value = [ApiResponse(code = 200, message = "\"Successful $response\"", response = ItemsItemIdGet200Response::class)] ) @RequestMapping( method = [RequestMethod.GET], @@ -56,8 +56,8 @@ interface ItemsApi { produces = ["application/json"] ) fun itemsItemIdGet( - @ApiParam(value = "The $prefixed ID of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, - @ApiParam(value = "Optional $filter for item type.") @Valid @RequestParam(value = "filter$Type", required = false) filterDollarType: kotlin.String?, + @ApiParam(value = "The $prefixed \"ID\" of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, + @ApiParam(value = "Optional $filter \"for\" item type.", defaultValue = "\"type\"$ADefault") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "\"type\"$ADefault") filterDollarType: kotlin.String, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest ): ResponseEntity diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt new file mode 100644 index 000000000000..453ad81392cd --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -0,0 +1,93 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdGet200Response +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.ItemsApiController.Companion.BASE_PATH + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "items", description = "The items API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class ItemsApiController() { + + + @ApiOperation( + value = "Retrieve item \"by\" $Id", + nickname = "itemsItemIdGet", + notes = "Get an item using the $symbol in \"parameter\" and property names.", + response = ItemsItemIdGet200Response::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "\"Successful $response\"", response = ItemsItemIdGet200Response::class)]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_GET /* "/items/{item\$Id}" */], + produces = ["application/json"] + ) + fun itemsItemIdGet( + @ApiParam(value = "The $prefixed \"ID\" of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, + @ApiParam(value = "Optional $filter \"for\" item type.", defaultValue = "\"type\"$ADefault") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "\"type\"$ADefault") filterDollarType: kotlin.String, + @ApiParam(value = "Header param with $") @RequestHeader(value = "X-Custom$Header", required = false) xCustomDollarHeader: kotlin.String?, + @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Create $it\"em\"", + nickname = "itemsPost", + notes = "POST using form params and $every\"where\".", + response = ItemWithDollarAttributesAndExamples::class) + @ApiResponses( + value = [ApiResponse(code = 201, message = "$test \"created\"", response = ItemWithDollarAttributesAndExamples::class)]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + fun itemsPost( + @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Post$Header", required = false) xPostDollarHeader: kotlin.String?, + @ApiParam(value = "Form field with $issue \\\"fdsfsd\\\"") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "Another $form \\\"field\\\"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String?, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_ITEMS_ITEM_ID_GET: String = "/items/{item$Id}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt new file mode 100644 index 000000000000..8eab3c69bcc6 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -0,0 +1,224 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.PetApiController.Companion.BASE_PATH + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "pet", description = "The pet API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class PetApiController() { + + + @ApiOperation( + value = "Add a new pet to the store", + nickname = "addPet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ADD_PET /* "/pet" */], + consumes = ["application/json"] + ) + fun addPet( + @ApiParam(value = "", required = true) @Valid @RequestBody pet: Pet, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Deletes a pet", + nickname = "deletePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid pet value")]) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_PET /* "/pet/{petId}" */] + ) + fun deletePet( + @ApiParam(value = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "") @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String?, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Finds Pets by status", + nickname = "findPetsByStatus", + notes = "Multiple status values can be provided with comma separated strings", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], + produces = ["application/json"] + ) + fun findPetsByStatus( + @NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Finds Pets by tags", + nickname = "findPetsByTags", + notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], + produces = ["application/json"] + ) + fun findPetsByTags( + @NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Find pet by ID", + nickname = "getPetById", + notes = "Returns a single pet", + response = Pet::class, + authorizations = [Authorization(value = "api_key")]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], + produces = ["application/json"] + ) + fun getPetById( + @ApiParam(value = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Update an existing pet", + nickname = "updatePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_PET /* "/pet" */], + consumes = ["application/json"] + ) + fun updatePet( + @ApiParam(value = "", required = true) @Valid @RequestBody pet: Pet, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Updates a pet in the store with form data", + nickname = "updatePetWithForm", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], + consumes = ["application/x-www-form-urlencoded"] + ) + fun updatePetWithForm( + @ApiParam(value = "ID of pet that needs to be updated", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, + @ApiParam(value = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String?, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Uploads an image", + nickname = "uploadFile", + notes = "", + response = ModelApiResponse::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadFile( + @ApiParam(value = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String?, + @ApiParam(value = "file detail") @Valid @RequestPart("file", required = false) file: org.springframework.web.multipart.MultipartFile, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_ADD_PET: String = "/pet" + const val PATH_DELETE_PET: String = "/pet/{petId}" + const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" + const val PATH_FIND_PETS_BY_TAGS: String = "/pet/findByTags" + const val PATH_GET_PET_BY_ID: String = "/pet/{petId}" + const val PATH_UPDATE_PET: String = "/pet" + const val PATH_UPDATE_PET_WITH_FORM: String = "/pet/{petId}" + const val PATH_UPLOAD_FILE: String = "/pet/{petId}/uploadImage" + } +} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt new file mode 100644 index 000000000000..944a8f92c6ed --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -0,0 +1,126 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.StoreApiController.Companion.BASE_PATH + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "store", description = "The store API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class StoreApiController() { + + + @ApiOperation( + value = "Delete purchase order by ID", + nickname = "deleteOrder", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] + ) + fun deleteOrder( + @ApiParam(value = "", required = true) @PathVariable("orderId") orderId: kotlin.String, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Returns pet inventories by status", + nickname = "getInventory", + notes = "", + response = kotlin.Int::class, + responseContainer = "Map", + authorizations = [Authorization(value = "api_key")]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_INVENTORY /* "/store/inventory" */], + produces = ["application/json"] + ) + fun getInventory(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Find purchase order by ID", + nickname = "getOrderById", + notes = "", + response = Order::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], + produces = ["application/json"] + ) + fun getOrderById( + @Min(value=1) @Max(value=5) @ApiParam(value = "", required = true) @PathVariable("orderId") orderId: kotlin.Int, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Place an order for a pet", + nickname = "placeOrder", + notes = "", + response = Order::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_PLACE_ORDER /* "/store/order" */], + produces = ["application/json"], + consumes = ["application/json"] + ) + fun placeOrder( + @ApiParam(value = "", required = true) @Valid @RequestBody order: Order, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" + const val PATH_GET_INVENTORY: String = "/store/inventory" + const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" + const val PATH_PLACE_ORDER: String = "/store/order" + } +} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt new file mode 100644 index 000000000000..429bcf6a2682 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -0,0 +1,203 @@ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.UserApiController.Companion.BASE_PATH + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "user", description = "The user API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class UserApiController() { + + + @ApiOperation( + value = "Create user", + nickname = "createUser", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USER /* "/user" */], + consumes = ["application/json"] + ) + fun createUser( + @ApiParam(value = "", required = true) @Valid @RequestBody user: User, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithArrayInput", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */], + consumes = ["application/json"] + ) + fun createUsersWithArrayInput( + @ApiParam(value = "", required = true) @Valid @RequestBody user: kotlin.collections.List, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithListInput", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */], + consumes = ["application/json"] + ) + fun createUsersWithListInput( + @ApiParam(value = "", required = true) @Valid @RequestBody user: kotlin.collections.List, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Delete user", + nickname = "deleteUser", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_USER /* "/user/{username}" */] + ) + fun deleteUser( + @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Get user by user name", + nickname = "getUserByName", + notes = "", + response = User::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], + produces = ["application/json"] + ) + fun getUserByName( + @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Logs user into the system", + nickname = "loginUser", + notes = "", + response = kotlin.String::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGIN_USER /* "/user/login" */], + produces = ["application/json"] + ) + fun loginUser( + @NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, + @NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Logs out current logged in user session", + nickname = "logoutUser", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGOUT_USER /* "/user/logout" */] + ) + fun logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "Updated user", + nickname = "updateUser", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_USER /* "/user/{username}" */], + consumes = ["application/json"] + ) + fun updateUser( + @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, + @ApiParam(value = "", required = true) @Valid @RequestBody user: User, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_CREATE_USER: String = "/user" + const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" + const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" + const val PATH_DELETE_USER: String = "/user/{username}" + const val PATH_GET_USER_BY_NAME: String = "/user/{username}" + const val PATH_LOGIN_USER: String = "/user/login" + const val PATH_LOGOUT_USER: String = "/user/logout" + const val PATH_UPDATE_USER: String = "/user/{username}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt index 6d5007f695f7..f130e20d4448 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -16,17 +16,17 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * A schema demonstrating $usage in properties. - * @param dollarId $ID property - * @param dollarName $Name property + * A schema \"demonstrating\" $usage in properties. + * @param dollarId \"$ID property\" + * @param dollarName $Name\" property\" */ data class ItemWithDollarAttributesAndExamples( - @ApiModelProperty(example = "\$item123", value = "\$ID property") - @get:JsonProperty("$id") val dollarId: kotlin.String? = null, + @ApiModelProperty(example = "\$item\"123\"", value = "\"$ID property\"") + @get:JsonProperty("$id") val dollarId: kotlin.String? = "$item\"123Default\"", - @ApiModelProperty(example = "\$ItemName", value = "\$Name property") - @get:JsonProperty("$name") val dollarName: kotlin.String? = null + @ApiModelProperty(example = "\$Item\"Name", value = "$Name\" property\"") + @get:JsonProperty("$name") val dollarName: kotlin.String? = "$ItemNameDefault\"" ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt index 9519c951ec61..d6cc8540cd38 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt @@ -18,17 +18,17 @@ import io.swagger.annotations.ApiModelProperty /** * - * @param itemDollarId The $ID of the item. - * @param nameDollarValue The $name of the item. + * @param itemDollarId The $ID of \"the\" item. + * @param nameDollarValue The $name \"of the \"item. * @param detailsDollarInfo */ data class ItemsItemIdGet200Response( - @ApiModelProperty(example = "item\$123", value = "The \$ID of the item.") - @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = null, + @ApiModelProperty(example = "\"item\$123\"", value = "The $ID of \"the\" item.") + @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = "Item$Id\"Default\"", - @ApiModelProperty(example = "Item\$Name", value = "The \$name of the item.") - @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = null, + @ApiModelProperty(example = "\"Item\"\$Name", value = "The $name \"of the \"item.") + @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = "Item$\"NameDefault\"", @field:Valid @ApiModelProperty(example = "null", value = "") diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt index 49f918607272..83e4cc53b514 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt @@ -16,16 +16,16 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * Nested object with $keys. - * @param detailDollarOne First $detail - * @param detailDollarTwo Second $detail + * Nested \"object\" with $keys. + * @param detailDollarOne \"First $detail\" + * @param detailDollarTwo \"Second\" $detail */ data class ItemsItemIdGet200ResponseDetailsInfo( - @ApiModelProperty(example = "Detail\$1", value = "First \$detail") - @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = null, + @ApiModelProperty(example = "\"Detail\$1\"", value = "\"First $detail\"") + @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = "\"Detail\"$1Default", - @ApiModelProperty(example = "42", value = "Second \$detail") + @ApiModelProperty(example = "42", value = "\"Second\" $detail") @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null ) : Serializable { diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt new file mode 100644 index 000000000000..4e076731c962 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt @@ -0,0 +1,46 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdGet200Response +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class ItemsApiTest { + + private val api: ItemsApiController = ItemsApiController() + + /** + * To test ItemsApiController.itemsItemIdGet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsItemIdGetTest() { + val itemDollarId: kotlin.String = TODO() + val filterDollarType: kotlin.String = TODO() + val xCustomDollarHeader: kotlin.String? = TODO() + val sessionDollarToken: kotlin.String? = TODO() + val request: javax.servlet.http.HttpServletRequest = TODO() + val response: ResponseEntity = api.itemsItemIdGet(itemDollarId, filterDollarType, xCustomDollarHeader, sessionDollarToken, request) + + // TODO: test validations + } + + /** + * To test ItemsApiController.itemsPost + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsPostTest() { + val xPostDollarHeader: kotlin.String? = TODO() + val formDollarName: kotlin.String? = TODO() + val formDollarValue: kotlin.String? = TODO() + val request: javax.servlet.http.HttpServletRequest = TODO() + val response: ResponseEntity = api.itemsPost(xPostDollarHeader, formDollarName, formDollarValue, request) + + // TODO: test validations + } +} From 4c6e1869ede7da5f145e72663a3257d60b101921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 12:33:42 +0100 Subject: [PATCH 03/26] break everything even more --- .../src/test/resources/3_0/kotlin/petstore-with-tags.yaml | 8 ++++---- .../3_0/kotlin/petstore-with-x-kotlin-implements.yaml | 8 ++++---- .../src/main/kotlin/org/openapitools/api/ItemsApi.kt | 8 ++++---- .../main/kotlin/org/openapitools/api/ItemsApiDelegate.kt | 4 ++-- .../kotlin/org/openapitools/api/ItemsApiController.kt | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml index 0107e77cb897..0cfee7a78bc9 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml @@ -674,13 +674,13 @@ paths: type: string example: "\"type$A\"" "default": "\"type\"$ADefault" - - name: "X-Custom$Header" + - name: "X-Custom_Header" in: header required: false - description: "Header param with $" + description: "Header \"param\" with $" schema: type: string - example: "hdr$val" + example: "hdr$su\"val\"" - name: "session$Token" in: cookie required: false @@ -739,7 +739,7 @@ paths: description: "Another $form \"field\"" example: "Val$Y\"fdfsdf\"" parameters: - - name: "X-Post$Header" + - name: "X-Post_Header" in: header required: false description: "Header \"param\" with $" diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml index 3565d8f0768d..e45412d6ab6b 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml @@ -506,13 +506,13 @@ paths: type: string example: "\"type$A\"" "default": "\"type\"$ADefault" - - name: "X-Custom$Header" + - name: "X-Custom_Header" in: header required: false - description: "Header param with $" + description: "Header \"param\" with $" schema: type: string - example: "hdr$val" + example: "hdr$su\"val\"" - name: "session$Token" in: cookie required: false @@ -571,7 +571,7 @@ paths: description: "Another $form \"field\"" example: "Val$Y\"fdfsdf\"" parameters: - - name: "X-Post$Header" + - name: "X-Post_Header" in: header required: false description: "Header \"param\" with $" diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt index 3320da5255ec..b4bbdd607166 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -62,11 +62,11 @@ interface ItemsApi { suspend fun itemsItemIdGet( @ApiParam(value = "The $prefixed \"ID\" of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, @ApiParam(value = "Optional $filter \"for\" item type.", defaultValue = "\"type\"$ADefault") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "\"type\"$ADefault") filterDollarType: kotlin.String, - @ApiParam(value = "Header param with $") @RequestHeader(value = "X-Custom$Header", required = false) xCustomDollarHeader: kotlin.String?, + @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange ): ResponseEntity { - return getDelegate().itemsItemIdGet(itemDollarId, filterDollarType, xCustomDollarHeader, sessionDollarToken, exchange) + return getDelegate().itemsItemIdGet(itemDollarId, filterDollarType, xCustomHeader, sessionDollarToken, exchange) } @@ -86,12 +86,12 @@ interface ItemsApi { consumes = ["application/x-www-form-urlencoded"] ) suspend fun itemsPost( - @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Post$Header", required = false) xPostDollarHeader: kotlin.String?, + @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @ApiParam(value = "Form field with $issue \\\"fdsfsd\\\"") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, @ApiParam(value = "Another $form \\\"field\\\"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String?, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange ): ResponseEntity { - return getDelegate().itemsPost(xPostDollarHeader, formDollarName, formDollarValue, exchange) + return getDelegate().itemsPost(xPostHeader, formDollarName, formDollarValue, exchange) } companion object { diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt index 332684082fe5..0f52c33b1e0e 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt @@ -24,7 +24,7 @@ interface ItemsApiDelegate { */ suspend fun itemsItemIdGet(itemDollarId: kotlin.String, filterDollarType: kotlin.String, - xCustomDollarHeader: kotlin.String?, + xCustomHeader: kotlin.String?, sessionDollarToken: kotlin.String?, exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity @@ -32,7 +32,7 @@ interface ItemsApiDelegate { /** * @see ItemsApi#itemsPost */ - suspend fun itemsPost(xPostDollarHeader: kotlin.String?, + suspend fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String?, exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt index 453ad81392cd..6e9595ea6327 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -54,7 +54,7 @@ class ItemsApiController() { fun itemsItemIdGet( @ApiParam(value = "The $prefixed \"ID\" of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, @ApiParam(value = "Optional $filter \"for\" item type.", defaultValue = "\"type\"$ADefault") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "\"type\"$ADefault") filterDollarType: kotlin.String, - @ApiParam(value = "Header param with $") @RequestHeader(value = "X-Custom$Header", required = false) xCustomDollarHeader: kotlin.String?, + @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest ): ResponseEntity { @@ -76,7 +76,7 @@ class ItemsApiController() { consumes = ["application/x-www-form-urlencoded"] ) fun itemsPost( - @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Post$Header", required = false) xPostDollarHeader: kotlin.String?, + @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @ApiParam(value = "Form field with $issue \\\"fdsfsd\\\"") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, @ApiParam(value = "Another $form \\\"field\\\"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String?, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest From b4f370d31f30ca93af4d6aa6d6fa5ef3ead3b019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 13:08:51 +0100 Subject: [PATCH 04/26] break everything consistently to make CR easier --- .../3_0/kotlin/petstore-with-tags.yaml | 110 +++++++++++------- .../petstore-with-x-kotlin-implements.yaml | 110 +++++++++++------- .../.openapi-generator/FILES | 4 +- .../kotlin/org/openapitools/api/ItemsApi.kt | 44 +++---- .../org/openapitools/api/ItemsApiDelegate.kt | 14 ++- .../ItemWithDollarAttributesAndExamples.kt | 14 +-- ...sItemIdSomethingItemSubIdGet200Response.kt | 42 +++++++ ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 ++++++ .../.openapi-generator/FILES | 4 +- .../openapitools/api/ItemsApiController.kt | 42 ++++--- .../ItemWithDollarAttributesAndExamples.kt | 14 +-- ...sItemIdSomethingItemSubIdGet200Response.kt | 42 +++++++ ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 ++++++ 13 files changed, 370 insertions(+), 142 deletions(-) create mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml index 0cfee7a78bc9..4463a410df2a 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml @@ -654,43 +654,72 @@ paths: 404: description: User not found content: { } - /items/{item$Id}: + /items/{item$Id}/something/{item$SubId}: get: - summary: "Retrieve item \"by\" $Id" - description: "Get an item using the $symbol in \"parameter\" and property names." + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" parameters: - name: "item$Id" in: path required: true - description: "The $prefixed \"ID\" of the item." + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" schema: type: string - example: "i\"te\"m$123" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "item$SubId" + in: path + required: true + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' - name: "filter$Type" in: query required: false - description: "Optional $filter \"for\" item type." + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + "default": "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "filter$SubType" + in: query + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' schema: type: string - example: "\"type$A\"" - "default": "\"type\"$ADefault" + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + "default": 'SQ = "; SBS = \; DBS = \\; SD = $some' - name: "X-Custom_Header" in: header required: false - description: "Header \"param\" with $" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" schema: type: string - example: "hdr$su\"val\"" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "X-Custom_Header_two" + in: header + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' - name: "session$Token" in: cookie required: false - description: "Cookie param with $dol\"lar\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "session$TokenTwo" + in: cookie + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' schema: type: string - example: "cookie$a\"bc\"" + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' responses: '200': - description: "\"Successful $response\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" content: application/json: schema: @@ -698,31 +727,31 @@ paths: properties: item$Id: type: string - description: "The $ID of \"the\" item." - example: "\"item$123\"" - default: "Item$Id\"Default\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" name$Value: type: string - description: "The $name \"of the \"item." - example: "\"Item\"$Name" - default: "Item$\"NameDefault\"" + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + default: 'SQ = "; SBS = \; DBS = \\; SD = $some' details$Info: type: object - description: "Nested \"object\" with $keys." + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" properties: detail$One: type: string - description: "\"First $detail\"" - example: "\"Detail$1\"" - default: "\"Detail\"$1Default" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" detail$Two: type: integer - description: "\"Second\" $detail" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" example: 42 /items: post: - summary: "Create $it\"em\"" - description: "POST using form params and $every\"where\"." + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" requestBody: required: true content: @@ -732,24 +761,25 @@ paths: properties: form$Name: type: string - description: "Form field with $issue \"fdsfsd\"" - example: "Name$X\"fsdfsd\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" form$Value: type: string - description: "Another $form \"field\"" - example: "Val$Y\"fdfsdf\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" parameters: - name: "X-Post_Header" in: header required: false - description: "Header \"param\" with $" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" schema: type: string - example: "hdr$po\"st\"" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" responses: "201": - description: "$test \"created\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" content: application/json: schema: @@ -888,18 +918,18 @@ components: description: Describes the result of uploading an image resource ItemWithDollarAttributesAndExamples: type: object - description: "A schema \"demonstrating\" $usage in properties." + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" properties: $id: type: string - description: "\"$ID property\"" - example: "$item\"123\"" - default: "$item\"123Default\"" + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" $name: type: string - description: "$Name\" property\"" - example: "$Item\"Name" - default: "$ItemNameDefault\"" + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" securitySchemes: petstore_auth: type: oauth2 diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml index e45412d6ab6b..6977cdb8dce8 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml @@ -486,43 +486,72 @@ paths: description: Invalid username supplied '404': description: User not found - /items/{item$Id}: + /items/{item$Id}/something/{item$SubId}: get: - summary: "Retrieve item \"by\" $Id" - description: "Get an item using the $symbol in \"parameter\" and property names." + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" parameters: - name: "item$Id" in: path required: true - description: "The $prefixed \"ID\" of the item." + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" schema: type: string - example: "i\"te\"m$123" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "item$SubId" + in: path + required: true + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' - name: "filter$Type" in: query required: false - description: "Optional $filter \"for\" item type." + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + "default": "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "filter$SubType" + in: query + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' schema: type: string - example: "\"type$A\"" - "default": "\"type\"$ADefault" + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + "default": 'SQ = "; SBS = \; DBS = \\; SD = $some' - name: "X-Custom_Header" in: header required: false - description: "Header \"param\" with $" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" schema: type: string - example: "hdr$su\"val\"" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "X-Custom_Header_two" + in: header + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' - name: "session$Token" in: cookie required: false - description: "Cookie param with $dol\"lar\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "session$TokenTwo" + in: cookie + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' schema: type: string - example: "cookie$a\"bc\"" + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' responses: '200': - description: "\"Successful $response\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" content: application/json: schema: @@ -530,31 +559,31 @@ paths: properties: item$Id: type: string - description: "The $ID of \"the\" item." - example: "\"item$123\"" - default: "Item$Id\"Default\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" name$Value: type: string - description: "The $name \"of the \"item." - example: "\"Item\"$Name" - default: "Item$\"NameDefault\"" + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + default: 'SQ = "; SBS = \; DBS = \\; SD = $some' details$Info: type: object - description: "Nested \"object\" with $keys." + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" properties: detail$One: type: string - description: "\"First $detail\"" - example: "\"Detail$1\"" - default: "\"Detail\"$1Default" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" detail$Two: type: integer - description: "\"Second\" $detail" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" example: 42 /items: post: - summary: "Create $it\"em\"" - description: "POST using form params and $every\"where\"." + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" requestBody: required: true content: @@ -564,24 +593,25 @@ paths: properties: form$Name: type: string - description: "Form field with $issue \"fdsfsd\"" - example: "Name$X\"fsdfsd\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" form$Value: type: string - description: "Another $form \"field\"" - example: "Val$Y\"fdfsdf\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" parameters: - name: "X-Post_Header" in: header required: false - description: "Header \"param\" with $" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" schema: type: string - example: "hdr$po\"st\"" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" responses: "201": - description: "$test \"created\"" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" content: application/json: schema: @@ -745,15 +775,15 @@ components: type: string ItemWithDollarAttributesAndExamples: type: object - description: "A schema \"demonstrating\" $usage in properties." + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" properties: $id: type: string - description: "\"$ID property\"" - example: "$item\"123\"" - default: "$item\"123Default\"" + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" $name: type: string - description: "$Name\" property\"" - example: "$Item\"Name" - default: "$ItemNameDefault\"" \ No newline at end of file + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES index 6e78c29b924d..3cd6745be096 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES @@ -26,8 +26,8 @@ src/main/kotlin/org/openapitools/model/Category.kt src/main/kotlin/org/openapitools/model/Color.kt src/main/kotlin/org/openapitools/model/Dog.kt src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt -src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt -src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt index b4bbdd607166..9153cf0b0a70 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -6,7 +6,7 @@ package org.openapitools.api import org.openapitools.model.ItemWithDollarAttributesAndExamples -import org.openapitools.model.ItemsItemIdGet200Response +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response import io.swagger.annotations.Api import io.swagger.annotations.ApiOperation import io.swagger.annotations.ApiParam @@ -46,38 +46,42 @@ interface ItemsApi { @ApiOperation( - value = "Retrieve item \"by\" $Id", - nickname = "itemsItemIdGet", - notes = "Get an item using the $symbol in \"parameter\" and property names.", - response = ItemsItemIdGet200Response::class + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + nickname = "itemsItemIdSomethingItemSubIdGet", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + response = ItemsItemIdSomethingItemSubIdGet200Response::class ) @ApiResponses( - value = [ApiResponse(code = 200, message = "\"Successful $response\"", response = ItemsItemIdGet200Response::class)] + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)] ) @RequestMapping( method = [RequestMethod.GET], - value = [PATH_ITEMS_ITEM_ID_GET /* "/items/{item\$Id}" */], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */], produces = ["application/json"] ) - suspend fun itemsItemIdGet( - @ApiParam(value = "The $prefixed \"ID\" of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, - @ApiParam(value = "Optional $filter \"for\" item type.", defaultValue = "\"type\"$ADefault") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "\"type\"$ADefault") filterDollarType: kotlin.String, - @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + suspend fun itemsItemIdSomethingItemSubIdGet( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", required = true) @PathVariable("item$SubId") itemDollarSubId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") filterDollarType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @Valid @RequestParam(value = "filter$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") filterDollarSubType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange - ): ResponseEntity { - return getDelegate().itemsItemIdGet(itemDollarId, filterDollarType, xCustomHeader, sessionDollarToken, exchange) + ): ResponseEntity { + return getDelegate().itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo, exchange) } @ApiOperation( - value = "Create $it\"em\"", + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", nickname = "itemsPost", - notes = "POST using form params and $every\"where\".", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemWithDollarAttributesAndExamples::class ) @ApiResponses( - value = [ApiResponse(code = 201, message = "$test \"created\"", response = ItemWithDollarAttributesAndExamples::class)] + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemWithDollarAttributesAndExamples::class)] ) @RequestMapping( method = [RequestMethod.POST], @@ -86,9 +90,9 @@ interface ItemsApi { consumes = ["application/x-www-form-urlencoded"] ) suspend fun itemsPost( - @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, - @ApiParam(value = "Form field with $issue \\\"fdsfsd\\\"") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, - @ApiParam(value = "Another $form \\\"field\\\"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some", defaultValue = ""SQ = \"; SBS = \\; DBS = \\\\; SD = $some"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange ): ResponseEntity { return getDelegate().itemsPost(xPostHeader, formDollarName, formDollarValue, exchange) @@ -96,7 +100,7 @@ interface ItemsApi { companion object { //for your own safety never directly reuse these path definitions in tests - const val PATH_ITEMS_ITEM_ID_GET: String = "/items/{item$Id}" + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item$Id}/something/{item$SubId}" const val PATH_ITEMS_POST: String = "/items" } } diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt index 0f52c33b1e0e..507e56259ee4 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt @@ -1,7 +1,7 @@ package org.openapitools.api import org.openapitools.model.ItemWithDollarAttributesAndExamples -import org.openapitools.model.ItemsItemIdGet200Response +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response import org.springframework.http.HttpStatus import org.springframework.http.MediaType import org.springframework.http.ResponseEntity @@ -20,13 +20,17 @@ interface ItemsApiDelegate { fun getRequest(): Optional = Optional.empty() /** - * @see ItemsApi#itemsItemIdGet + * @see ItemsApi#itemsItemIdSomethingItemSubIdGet */ - suspend fun itemsItemIdGet(itemDollarId: kotlin.String, + suspend fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, + itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, + filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, + xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, - exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity + sessionDollarTokenTwo: kotlin.String?, + exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity /** @@ -34,7 +38,7 @@ interface ItemsApiDelegate { */ suspend fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, - formDollarValue: kotlin.String?, + formDollarValue: kotlin.String, exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity } diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt index f130e20d4448..364dd1544134 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -16,17 +16,17 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * A schema \"demonstrating\" $usage in properties. - * @param dollarId \"$ID property\" - * @param dollarName $Name\" property\" + * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some */ data class ItemWithDollarAttributesAndExamples( - @ApiModelProperty(example = "\$item\"123\"", value = "\"$ID property\"") - @get:JsonProperty("$id") val dollarId: kotlin.String? = "$item\"123Default\"", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", - @ApiModelProperty(example = "\$Item\"Name", value = "$Name\" property\"") - @get:JsonProperty("$name") val dollarName: kotlin.String? = "$ItemNameDefault\"" + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..060ddced2851 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("details$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..a1d5bcc0c16e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param detailDollarOne SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param detailDollarTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + + @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES index edfc8025b478..14defc430ae5 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES @@ -19,8 +19,8 @@ src/main/kotlin/org/openapitools/model/Category.kt src/main/kotlin/org/openapitools/model/Color.kt src/main/kotlin/org/openapitools/model/Dog.kt src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt -src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt -src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt index 6e9595ea6327..56790b478326 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -1,7 +1,7 @@ package org.openapitools.api import org.openapitools.model.ItemWithDollarAttributesAndExamples -import org.openapitools.model.ItemsItemIdGet200Response +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response import io.swagger.annotations.Api import io.swagger.annotations.ApiOperation import io.swagger.annotations.ApiParam @@ -40,35 +40,39 @@ class ItemsApiController() { @ApiOperation( - value = "Retrieve item \"by\" $Id", - nickname = "itemsItemIdGet", - notes = "Get an item using the $symbol in \"parameter\" and property names.", - response = ItemsItemIdGet200Response::class) + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + nickname = "itemsItemIdSomethingItemSubIdGet", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + response = ItemsItemIdSomethingItemSubIdGet200Response::class) @ApiResponses( - value = [ApiResponse(code = 200, message = "\"Successful $response\"", response = ItemsItemIdGet200Response::class)]) + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)]) @RequestMapping( method = [RequestMethod.GET], - value = [PATH_ITEMS_ITEM_ID_GET /* "/items/{item\$Id}" */], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */], produces = ["application/json"] ) - fun itemsItemIdGet( - @ApiParam(value = "The $prefixed \"ID\" of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, - @ApiParam(value = "Optional $filter \"for\" item type.", defaultValue = "\"type\"$ADefault") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "\"type\"$ADefault") filterDollarType: kotlin.String, - @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + fun itemsItemIdSomethingItemSubIdGet( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", required = true) @PathVariable("item$SubId") itemDollarSubId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") filterDollarType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @Valid @RequestParam(value = "filter$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") filterDollarSubType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity { + ): ResponseEntity { return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) } @ApiOperation( - value = "Create $it\"em\"", + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", nickname = "itemsPost", - notes = "POST using form params and $every\"where\".", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemWithDollarAttributesAndExamples::class) @ApiResponses( - value = [ApiResponse(code = 201, message = "$test \"created\"", response = ItemWithDollarAttributesAndExamples::class)]) + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemWithDollarAttributesAndExamples::class)]) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ITEMS_POST /* "/items" */], @@ -76,9 +80,9 @@ class ItemsApiController() { consumes = ["application/x-www-form-urlencoded"] ) fun itemsPost( - @ApiParam(value = "Header \"param\" with $") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, - @ApiParam(value = "Form field with $issue \\\"fdsfsd\\\"") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, - @ApiParam(value = "Another $form \\\"field\\\"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some", defaultValue = ""SQ = \"; SBS = \\; DBS = \\\\; SD = $some"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest ): ResponseEntity { return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) @@ -87,7 +91,7 @@ class ItemsApiController() { companion object { //for your own safety never directly reuse these path definitions in tests const val BASE_PATH: String = "/v2" - const val PATH_ITEMS_ITEM_ID_GET: String = "/items/{item$Id}" + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item$Id}/something/{item$SubId}" const val PATH_ITEMS_POST: String = "/items" } } diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt index f130e20d4448..364dd1544134 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -16,17 +16,17 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * A schema \"demonstrating\" $usage in properties. - * @param dollarId \"$ID property\" - * @param dollarName $Name\" property\" + * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some */ data class ItemWithDollarAttributesAndExamples( - @ApiModelProperty(example = "\$item\"123\"", value = "\"$ID property\"") - @get:JsonProperty("$id") val dollarId: kotlin.String? = "$item\"123Default\"", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", - @ApiModelProperty(example = "\$Item\"Name", value = "$Name\" property\"") - @get:JsonProperty("$name") val dollarName: kotlin.String? = "$ItemNameDefault\"" + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..060ddced2851 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("details$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..a1d5bcc0c16e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param detailDollarOne SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param detailDollarTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + + @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + From 884975aa83c75345d7d8cc9bdc2eaa12809ceb36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 13:23:18 +0100 Subject: [PATCH 05/26] fix as much as possible --- .../main/resources/kotlin-spring/api.mustache | 14 ++++----- .../kotlin-spring/apiInterface.mustache | 14 ++++----- .../kotlin-spring/bodyParams.mustache | 2 +- .../kotlin-spring/cookieParams.mustache | 2 +- .../kotlin-spring/dataClass.mustache | 4 +-- .../kotlin-spring/dataClassOptVar.mustache | 6 ++-- .../kotlin-spring/dataClassReqVar.mustache | 6 ++-- .../kotlin-spring/headerParams.mustache | 2 +- .../kotlin-spring/interfaceOptVar.mustache | 6 ++-- .../kotlin-spring/interfaceReqVar.mustache | 4 +-- .../apiInterface.mustache | 2 +- .../httpInterfaceBodyParams.mustache | 2 +- .../kotlin-spring/pathParams.mustache | 2 +- .../kotlin-spring/queryParams.mustache | 2 +- .../kotlin/org/openapitools/api/ItemsApi.kt | 30 +++++++++---------- .../ItemWithDollarAttributesAndExamples.kt | 14 ++++----- ...sItemIdSomethingItemSubIdGet200Response.kt | 14 ++++----- ...thingItemSubIdGet200ResponseDetailsInfo.kt | 14 ++++----- .../openapitools/api/ItemsApiController.kt | 30 +++++++++---------- .../ItemWithDollarAttributesAndExamples.kt | 14 ++++----- ...sItemIdSomethingItemSubIdGet200Response.kt | 14 ++++----- ...thingItemSubIdGet200ResponseDetailsInfo.kt | 14 ++++----- 22 files changed, 106 insertions(+), 106 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache index e73afb7f3630..6b1e24406649 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache @@ -73,25 +73,25 @@ class {{classname}}Controller({{#serviceInterface}}@Autowired(required = true) v }}{{/useResponseEntity}}{{! }}{{#swagger2AnnotationLibrary}}{{! }} @Operation( - summary = "{{{summary}}}", + summary = "{{#lambda.escapeDollar}}{{{summary}}}{{/lambda.escapeDollar}}", operationId = "{{{operationId}}}", description = """{{{unescapedNotes}}}""", responses = [{{#responses}} - ApiResponse(responseCode = "{{{code}}}", description = "{{{message}}}"{{#baseType}}, content = [Content({{#isArray}}array = ArraySchema({{/isArray}}schema = Schema(implementation = {{{baseType}}}::class)){{#isArray}}){{/isArray}}]{{/baseType}}){{^-last}},{{/-last}}{{/responses}} ]{{#hasAuthMethods}}, + ApiResponse(responseCode = "{{{code}}}", description = "{{#lambda.escapeDollar}}{{{message}}}{{/lambda.escapeDollar}}"{{#baseType}}, content = [Content({{#isArray}}array = ArraySchema({{/isArray}}schema = Schema(implementation = {{{baseType}}}::class)){{#isArray}}){{/isArray}}]{{/baseType}}){{^-last}},{{/-last}}{{/responses}} ]{{#hasAuthMethods}}, security = [ {{#authMethods}}SecurityRequirement(name = "{{name}}"{{#isOAuth}}, scopes = [ {{#scopes}}"{{scope}}"{{^-last}}, {{/-last}}{{/scopes}} ]{{/isOAuth}}){{^-last}},{{/-last}}{{/authMethods}} ]{{/hasAuthMethods}} ){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} @ApiOperation( - value = "{{{summary}}}", + value = "{{#lambda.escapeDollar}}{{{summary}}}{{/lambda.escapeDollar}}", nickname = "{{{operationId}}}", - notes = "{{{notes}}}"{{#returnBaseType}}, + notes = "{{#lambda.escapeDollar}}{{{notes}}}{{/lambda.escapeDollar}}"{{#returnBaseType}}, response = {{{.}}}::class{{/returnBaseType}}{{#returnContainer}}, responseContainer = "{{{.}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = [{{#authMethods}}Authorization(value = "{{name}}"{{#isOAuth}}, scopes = [{{#scopes}}AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{^-last}}, {{/-last}}{{/scopes}}]{{/isOAuth}}){{^-last}}, {{/-last}}{{/authMethods}}]{{/hasAuthMethods}}) @ApiResponses( - value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{{message}}}"{{#baseType}}, response = {{{.}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{.}}}"{{/containerType}}){{^-last}},{{/-last}}{{/responses}}]){{/swagger1AnnotationLibrary}} + value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{#lambda.escapeDollar}}{{{message}}}{{/lambda.escapeDollar}}"{{#baseType}}, response = {{{.}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{.}}}"{{/containerType}}){{^-last}},{{/-last}}{{/responses}}]){{/swagger1AnnotationLibrary}} @RequestMapping( method = [RequestMethod.{{httpMethod}}], - value = [PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}} /* "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" */]{{#singleContentTypes}}{{#hasProduces}}, + value = [PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}} /* "{{{path}}}" */]{{#singleContentTypes}}{{#hasProduces}}, produces = [{{#vendorExtensions.x-accepts}}"{{{.}}}"{{^-last}}, {{/-last}}{{/vendorExtensions.x-accepts}}]{{/hasProduces}}{{#hasConsumes}}, consumes = "{{{vendorExtensions.x-content-type}}}"{{/hasConsumes}}{{/singleContentTypes}}{{^singleContentTypes}}{{#hasProduces}}, produces = [{{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}}]{{/hasProduces}}{{#hasConsumes}}, @@ -111,7 +111,7 @@ class {{classname}}Controller({{#serviceInterface}}@Autowired(required = true) v const val BASE_PATH: String = "{{=<% %>=}}<%contextPath%><%={{ }}=%>" {{/useRequestMappingOnController}} {{#operation}} - const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{{path}}}" + const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" {{/operation}} } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/apiInterface.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/apiInterface.mustache index 0f1dcbd41551..e16282bf6964 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/apiInterface.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/apiInterface.mustache @@ -85,28 +85,28 @@ interface {{classname}} { }}{{#swagger2AnnotationLibrary}}{{! }} @Operation( tags = [{{#tags}}"{{{name}}}",{{/tags}}], - summary = "{{{summary}}}", + summary = "{{#lambda.escapeDollar}}{{{summary}}}{{/lambda.escapeDollar}}", operationId = "{{{operationId}}}", description = """{{{unescapedNotes}}}""", responses = [{{#responses}} - ApiResponse(responseCode = "{{{code}}}", description = "{{{message}}}"{{#baseType}}, content = [Content({{#isArray}}array = ArraySchema({{/isArray}}schema = Schema(implementation = {{{baseType}}}::class)){{#isArray}}){{/isArray}}]{{/baseType}}){{^-last}},{{/-last}}{{/responses}} + ApiResponse(responseCode = "{{{code}}}", description = "{{#lambda.escapeDollar}}{{{message}}}{{/lambda.escapeDollar}}"{{#baseType}}, content = [Content({{#isArray}}array = ArraySchema({{/isArray}}schema = Schema(implementation = {{{baseType}}}::class)){{#isArray}}){{/isArray}}]{{/baseType}}){{^-last}},{{/-last}}{{/responses}} ]{{#hasAuthMethods}}, security = [ {{#authMethods}}SecurityRequirement(name = "{{name}}"{{#isOAuth}}, scopes = [ {{#scopes}}"{{scope}}"{{^-last}}, {{/-last}}{{/scopes}} ]{{/isOAuth}}){{^-last}},{{/-last}}{{/authMethods}} ]{{/hasAuthMethods}} ){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} @ApiOperation( - value = "{{{summary}}}", + value = "{{#lambda.escapeDollar}}{{{summary}}}{{/lambda.escapeDollar}}", nickname = "{{{operationId}}}", - notes = "{{{notes}}}"{{#returnBaseType}}, + notes = "{{#lambda.escapeDollar}}{{{notes}}}{{/lambda.escapeDollar}}"{{#returnBaseType}}, response = {{{.}}}::class{{/returnBaseType}}{{#returnContainer}}, responseContainer = "{{{.}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = [{{#authMethods}}Authorization(value = "{{name}}"{{#isOAuth}}, scopes = [{{#scopes}}AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{^-last}}, {{/-last}}{{/scopes}}]{{/isOAuth}}){{^-last}}, {{/-last}}{{/authMethods}}]{{/hasAuthMethods}} ) @ApiResponses( - value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{{message}}}"{{#baseType}}, response = {{{.}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{.}}}"{{/containerType}}){{^-last}}, {{/-last}}{{/responses}}] + value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{#lambda.escapeDollar}}{{{message}}}{{/lambda.escapeDollar}}"{{#baseType}}, response = {{{.}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{.}}}"{{/containerType}}){{^-last}}, {{/-last}}{{/responses}}] ){{/swagger1AnnotationLibrary}} @RequestMapping( method = [RequestMethod.{{httpMethod}}], - value = [PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}} /* "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" */]{{#singleContentTypes}}{{#hasProduces}}, + value = [PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}} /* "{{{path}}}" */]{{#singleContentTypes}}{{#hasProduces}}, produces = [{{#vendorExtensions.x-accepts}}"{{{.}}}"{{^-last}}, {{/-last}}{{/vendorExtensions.x-accepts}}]{{/hasProduces}}{{#hasConsumes}}, consumes = "{{{vendorExtensions.x-content-type}}}"{{/hasConsumes}}{{/singleContentTypes}}{{^singleContentTypes}}{{#hasProduces}}, produces = [{{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}}]{{/hasProduces}}{{#hasConsumes}}, @@ -131,7 +131,7 @@ interface {{classname}} { const val BASE_PATH: String = "{{=<% %>=}}<%contextPath%><%={{ }}=%>" {{/useRequestMappingOnInterface}} {{#operation}} - const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{{path}}}" + const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" {{/operation}} } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache index b4f03475cd0b..c8f2f053320a 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache @@ -1 +1 @@ -{{#isBodyParam}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"], defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"]){{/defaultValue}}{{/allowableValues}}{{/isContainer}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}, allowableValues = "{{{.}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{{paramName}}}: {{^reactive}}{{>optionalDataType}}{{/reactive}}{{#reactive}}{{^isArray}}{{>optionalDataType}}{{/isArray}}{{#isArray}}Flow<{{{baseType}}}>{{/isArray}}{{/reactive}}{{/isBodyParam}} \ No newline at end of file +{{#isBodyParam}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"], defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"]){{/defaultValue}}{{/allowableValues}}{{/isContainer}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}, allowableValues = "{{{.}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{{paramName}}}: {{^reactive}}{{>optionalDataType}}{{/reactive}}{{#reactive}}{{^isArray}}{{>optionalDataType}}{{/isArray}}{{#isArray}}Flow<{{{baseType}}}>{{/isArray}}{{/reactive}}{{/isBodyParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache index 028264a18bcf..decfa98ac79c 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache @@ -1 +1 @@ -{{#isCookieParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}@CookieValue(name = "{{baseName}}"{{^required}}, required = false{{/required}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isCookieParam}} \ No newline at end of file +{{#isCookieParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}@CookieValue(name = "{{baseName}}"{{^required}}, required = false{{/required}}{{#defaultValue}}, defaultValue = "{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}"{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isCookieParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache index 5f597f12a591..dd5224fb60b8 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache @@ -1,7 +1,7 @@ /** - * {{{description}}} + * {{{unescapedDescription}}} {{#vars}} - * @param {{name}} {{{description}}} + * @param {{name}} {{{unescapedDescription}}} {{/vars}} */{{#discriminator}} {{>typeInfoAnnotation}}{{/discriminator}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache index ab575d4bf9d3..48119eac68c1 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache @@ -1,6 +1,6 @@ {{#useBeanValidation}}{{>beanValidation}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}} - @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} - @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#deprecated}} + @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} + @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger1AnnotationLibrary}}{{#deprecated}} @Deprecated(message = ""){{/deprecated}}{{#vendorExtensions.x-field-extra-annotation}} {{{.}}}{{/vendorExtensions.x-field-extra-annotation}} - @get:JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInPascalCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{^defaultValue}}null{{/defaultValue}}{{#defaultValue}}{{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}} \ No newline at end of file + @get:JsonProperty("{{#lambdaEscapeInNormalString}}{{{baseName}}}{{/lambdaEscapeInNormalString}}"){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInPascalCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{^defaultValue}}null{{/defaultValue}}{{#defaultValue}}{{^isNumber}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}"){{/isNumber}}{{/defaultValue}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache index 92e2875ac08a..2aa5b66a96f7 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache @@ -1,5 +1,5 @@ {{#useBeanValidation}}{{>beanValidation}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}} - @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = true, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} - @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = true, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} + @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = true, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} + @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = true, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} {{{.}}}{{/vendorExtensions.x-field-extra-annotation}} - @get:JsonProperty("{{{baseName}}}", required = true){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInPascalCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}} \ No newline at end of file + @get:JsonProperty("{{#lambdaEscapeInNormalString}}{{{baseName}}}{{/lambdaEscapeInNormalString}}", required = true){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInPascalCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}{{#defaultValue}} = {{^isNumber}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}"){{/isNumber}}{{/defaultValue}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache index 0c2678f1bf67..00bd70f7823a 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache @@ -1 +1 @@ -{{#isHeaderParam}}{{#useBeanValidation}}{{>beanValidationCore}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}", `in` = ParameterIn.HEADER{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}@RequestHeader(value = "{{baseName}}", required = {{#required}}true{{/required}}{{^required}}false{{/required}}{{#defaultValue}}, defaultValue = {{^isString}}"{{{.}}}"{{/isString}}{{#isString}}{{#isEnum}}"{{{.}}}"{{/isEnum}}{{^isEnum}}{{{.}}}{{/isEnum}}{{/isString}}{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isHeaderParam}} \ No newline at end of file +{{#isHeaderParam}}{{#useBeanValidation}}{{>beanValidationCore}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}", `in` = ParameterIn.HEADER{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}@RequestHeader(value = "{{baseName}}", required = {{#required}}true{{/required}}{{^required}}false{{/required}}{{#defaultValue}}, defaultValue = {{^isString}}"{{{.}}}"{{/isString}}{{#isString}}{{#isEnum}}"{{{.}}}"{{/isEnum}}{{^isEnum}}{{{.}}}{{/isEnum}}{{/isString}}{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isHeaderParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceOptVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceOptVar.mustache index 3fa63ad64876..a2e30f2d7e3f 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceOptVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceOptVar.mustache @@ -1,5 +1,5 @@ {{#swagger2AnnotationLibrary}} - @get:Schema({{#example}}example = "{{{.}}}", {{/example}}{{#required}}requiredMode = Schema.RequiredMode.REQUIRED, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} - @get:ApiModelProperty({{#example}}example = "{{{.}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} + @get:Schema({{#example}}example = "{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}", {{/example}}{{#required}}requiredMode = Schema.RequiredMode.REQUIRED, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} + @get:ApiModelProperty({{#example}}example = "{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} {{{.}}}{{/vendorExtensions.x-field-extra-annotation}} - {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? {{^discriminator}}= {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}}{{/discriminator}} + {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? {{^discriminator}}= {{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^defaultValue}}null{{/defaultValue}}{{/discriminator}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceReqVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceReqVar.mustache index 8f0fb71ba319..8e1fc992e14a 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceReqVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceReqVar.mustache @@ -1,5 +1,5 @@ {{#swagger2AnnotationLibrary}} - @get:Schema({{#example}}example = "{{{.}}}", {{/example}}{{#required}}requiredMode = Schema.RequiredMode.REQUIRED, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} - @get:ApiModelProperty({{#example}}example = "{{{.}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} + @get:Schema({{#example}}example = "{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}", {{/example}}{{#required}}requiredMode = Schema.RequiredMode.REQUIRED, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} + @get:ApiModelProperty({{#example}}example = "{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} {{{.}}}{{/vendorExtensions.x-field-extra-annotation}} {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/apiInterface.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/apiInterface.mustache index 876a558db0b9..1f0d5786ac67 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/apiInterface.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/apiInterface.mustache @@ -83,7 +83,7 @@ interface {{classname}} { const val BASE_PATH: String = "{{=<% %>=}}<%contextPath%><%={{ }}=%>" {{/useRequestMappingOnInterface}} {{#operation}} - const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{{path}}}" + const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" {{/operation}} } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/httpInterfaceBodyParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/httpInterfaceBodyParams.mustache index e884046f7d6d..168d0b9b7146 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/httpInterfaceBodyParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/httpInterfaceBodyParams.mustache @@ -1 +1 @@ -{{#isBodyParam}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"], defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"]){{/defaultValue}}{{/allowableValues}}{{/isContainer}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}, allowableValues = "{{{.}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{{paramName}}}: {{>optionalDataType}}{{/isBodyParam}} \ No newline at end of file +{{#isBodyParam}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"], defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"]){{/defaultValue}}{{/allowableValues}}{{/isContainer}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}, allowableValues = "{{{.}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue = "{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{{paramName}}}: {{>optionalDataType}}{{/isBodyParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache index 2e28d18c78fa..0693a20ec36e 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache @@ -1 +1 @@ -{{#isPathParam}}{{#useBeanValidation}}{{>beanValidationPathParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}@PathVariable("{{baseName}}") {{{paramName}}}: {{>optionalDataType}}{{/isPathParam}} \ No newline at end of file +{{#isPathParam}}{{#useBeanValidation}}{{>beanValidationPathParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}@PathVariable("{{#lambdaEscapeInNormalString}}{{baseName}}{{/lambdaEscapeInNormalString}}") {{{paramName}}}: {{>optionalDataType}}{{/isPathParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache index 27d7e286bb33..035e944ed193 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache @@ -1 +1 @@ -{{#isQueryParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}}{{^isModel}} @RequestParam(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/isModel}}{{#isDate}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE){{/isDate}}{{#isDateTime}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME){{/isDateTime}} {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}} \ No newline at end of file +{{#isQueryParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}}{{^isModel}} @RequestParam(value = "{{#lambdaEscapeInNormalString}}{{baseName}}{{/lambdaEscapeInNormalString}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/isModel}}{{#isDate}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE){{/isDate}}{{#isDateTime}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME){{/isDateTime}} {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}} \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt index 9153cf0b0a70..2d8f7b740b42 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -46,26 +46,26 @@ interface ItemsApi { @ApiOperation( - value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", nickname = "itemsItemIdSomethingItemSubIdGet", - notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class ) @ApiResponses( - value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)] + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)] ) @RequestMapping( method = [RequestMethod.GET], - value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], produces = ["application/json"] ) suspend fun itemsItemIdSomethingItemSubIdGet( - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", required = true) @PathVariable("item$SubId") itemDollarSubId: kotlin.String, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") filterDollarType: kotlin.String, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @Valid @RequestParam(value = "filter$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") filterDollarSubType: kotlin.String, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, @CookieValue(name = "session$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange @@ -75,13 +75,13 @@ interface ItemsApi { @ApiOperation( - value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", nickname = "itemsPost", - notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class ) @ApiResponses( - value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemWithDollarAttributesAndExamples::class)] + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)] ) @RequestMapping( method = [RequestMethod.POST], @@ -90,7 +90,7 @@ interface ItemsApi { consumes = ["application/x-www-form-urlencoded"] ) suspend fun itemsPost( - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some", defaultValue = ""SQ = \"; SBS = \\; DBS = \\\\; SD = $some"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange @@ -100,7 +100,7 @@ interface ItemsApi { companion object { //for your own safety never directly reuse these path definitions in tests - const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item$Id}/something/{item$SubId}" + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" const val PATH_ITEMS_POST: String = "/items" } } diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt index 364dd1544134..f09c9e4036f2 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -16,17 +16,17 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some */ data class ItemWithDollarAttributesAndExamples( - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt index 060ddced2851..ce959d5caa44 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -18,21 +18,21 @@ import io.swagger.annotations.ApiModelProperty /** * - * @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some * @param detailsDollarInfo */ data class ItemsItemIdSomethingItemSubIdGet200Response( - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", @field:Valid @ApiModelProperty(example = "null", value = "") - @get:JsonProperty("details$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt index a1d5bcc0c16e..f1572d669057 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -16,17 +16,17 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param detailDollarOne SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param detailDollarTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some */ data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null + @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt index 56790b478326..bf6b7420613b 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -40,24 +40,24 @@ class ItemsApiController() { @ApiOperation( - value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", nickname = "itemsItemIdSomethingItemSubIdGet", - notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class) @ApiResponses( - value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)]) + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)]) @RequestMapping( method = [RequestMethod.GET], - value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], produces = ["application/json"] ) fun itemsItemIdSomethingItemSubIdGet( - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", required = true) @PathVariable("item$SubId") itemDollarSubId: kotlin.String, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") filterDollarType: kotlin.String, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @Valid @RequestParam(value = "filter$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") filterDollarSubType: kotlin.String, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, @CookieValue(name = "session$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest @@ -67,12 +67,12 @@ class ItemsApiController() { @ApiOperation( - value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", nickname = "itemsPost", - notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class) @ApiResponses( - value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", response = ItemWithDollarAttributesAndExamples::class)]) + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)]) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ITEMS_POST /* "/items" */], @@ -80,7 +80,7 @@ class ItemsApiController() { consumes = ["application/x-www-form-urlencoded"] ) fun itemsPost( - @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some", defaultValue = ""SQ = \"; SBS = \\; DBS = \\\\; SD = $some"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest @@ -91,7 +91,7 @@ class ItemsApiController() { companion object { //for your own safety never directly reuse these path definitions in tests const val BASE_PATH: String = "/v2" - const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item$Id}/something/{item$SubId}" + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" const val PATH_ITEMS_POST: String = "/items" } } diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt index 364dd1544134..f09c9e4036f2 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -16,17 +16,17 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some */ data class ItemWithDollarAttributesAndExamples( - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt index 060ddced2851..ce959d5caa44 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -18,21 +18,21 @@ import io.swagger.annotations.ApiModelProperty /** * - * @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some * @param detailsDollarInfo */ data class ItemsItemIdSomethingItemSubIdGet200Response( - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", @field:Valid @ApiModelProperty(example = "null", value = "") - @get:JsonProperty("details$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null ) : Serializable { companion object { diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt index a1d5bcc0c16e..f1572d669057 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -16,17 +16,17 @@ import javax.validation.Valid import io.swagger.annotations.ApiModelProperty /** - * SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param detailDollarOne SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * @param detailDollarTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some */ data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( - @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null + @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null ) : Serializable { companion object { From 8f207b5b2f26e9982d1f35c13e5db4fab38b1dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 13:50:24 +0100 Subject: [PATCH 06/26] fix more places --- .../src/main/resources/kotlin-spring/formParams.mustache | 2 +- .../src/main/kotlin/org/openapitools/api/ItemsApi.kt | 4 ++-- .../main/kotlin/org/openapitools/api/ItemsApiController.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache index 456af893718f..5ff9f9ef436f 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache @@ -1 +1 @@ -{{#isFormParam}}{{^isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid {{/useBeanValidation}}{{#isModel}}@RequestPart{{/isModel}}{{^isModel}}@RequestParam{{/isModel}}(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{#isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}") {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "file detail") {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestPart("{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{/isFormParam}} \ No newline at end of file +{{#isFormParam}}{{^isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}KOKO{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}BUBU{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid {{/useBeanValidation}}{{#isModel}}@RequestPart{{/isModel}}{{^isModel}}@RequestParam{{/isModel}}(value = "{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{#isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}") {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "file detail") {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestPart("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{/isFormParam}} \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt index 2d8f7b740b42..18981ef12085 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -91,8 +91,8 @@ interface ItemsApi { ) suspend fun itemsPost( @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, - @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, - @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some", defaultValue = ""SQ = \"; SBS = \\; DBS = \\\\; SD = $some"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange ): ResponseEntity { return getDelegate().itemsPost(xPostHeader, formDollarName, formDollarValue, exchange) diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt index bf6b7420613b..0be438899627 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -81,8 +81,8 @@ class ItemsApiController() { ) fun itemsPost( @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, - @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some") @Valid @RequestParam(value = "form$Name", required = false) formDollarName: kotlin.String?, - @ApiParam(value = "SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some", defaultValue = ""SQ = \"; SBS = \\; DBS = \\\\; SD = $some"") @Valid @RequestParam(value = "form$Value", required = false) formDollarValue: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest ): ResponseEntity { return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) From 319c55d319d4de9c672b8e105b14a3df3d773cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 14:08:02 +0100 Subject: [PATCH 07/26] remove files --- .../model/ItemsItemIdGet200Response.kt | 42 ---- .../ItemsItemIdGet200ResponseDetailsInfo.kt | 36 --- .../kotlin/org/openapitools/api/ItemsApi.kt | 68 ------ .../kotlin/org/openapitools/api/PetApi.kt | 226 ------------------ .../model/ItemsItemIdGet200Response.kt | 42 ---- .../ItemsItemIdGet200ResponseDetailsInfo.kt | 36 --- 6 files changed, 450 deletions(-) delete mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt delete mode 100644 samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt delete mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt delete mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApi.kt delete mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt delete mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt deleted file mode 100644 index d6cc8540cd38..000000000000 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt +++ /dev/null @@ -1,42 +0,0 @@ -package org.openapitools.model - -import java.util.Locale -import java.util.Objects -import com.fasterxml.jackson.annotation.JsonProperty -import org.openapitools.model.ItemsItemIdGet200ResponseDetailsInfo -import java.io.Serializable -import javax.validation.constraints.DecimalMax -import javax.validation.constraints.DecimalMin -import javax.validation.constraints.Email -import javax.validation.constraints.Max -import javax.validation.constraints.Min -import javax.validation.constraints.NotNull -import javax.validation.constraints.Pattern -import javax.validation.constraints.Size -import javax.validation.Valid -import io.swagger.annotations.ApiModelProperty - -/** - * - * @param itemDollarId The $ID of \"the\" item. - * @param nameDollarValue The $name \"of the \"item. - * @param detailsDollarInfo - */ -data class ItemsItemIdGet200Response( - - @ApiModelProperty(example = "\"item\$123\"", value = "The $ID of \"the\" item.") - @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = "Item$Id\"Default\"", - - @ApiModelProperty(example = "\"Item\"\$Name", value = "The $name \"of the \"item.") - @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = "Item$\"NameDefault\"", - - @field:Valid - @ApiModelProperty(example = "null", value = "") - @get:JsonProperty("details$Info") val detailsDollarInfo: ItemsItemIdGet200ResponseDetailsInfo? = null -) : Serializable { - - companion object { - private const val serialVersionUID: kotlin.Long = 1 - } -} - diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt deleted file mode 100644 index 83e4cc53b514..000000000000 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt +++ /dev/null @@ -1,36 +0,0 @@ -package org.openapitools.model - -import java.util.Locale -import java.util.Objects -import com.fasterxml.jackson.annotation.JsonProperty -import java.io.Serializable -import javax.validation.constraints.DecimalMax -import javax.validation.constraints.DecimalMin -import javax.validation.constraints.Email -import javax.validation.constraints.Max -import javax.validation.constraints.Min -import javax.validation.constraints.NotNull -import javax.validation.constraints.Pattern -import javax.validation.constraints.Size -import javax.validation.Valid -import io.swagger.annotations.ApiModelProperty - -/** - * Nested \"object\" with $keys. - * @param detailDollarOne \"First $detail\" - * @param detailDollarTwo \"Second\" $detail - */ -data class ItemsItemIdGet200ResponseDetailsInfo( - - @ApiModelProperty(example = "\"Detail\$1\"", value = "\"First $detail\"") - @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = "\"Detail\"$1Default", - - @ApiModelProperty(example = "42", value = "\"Second\" $detail") - @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null -) : Serializable { - - companion object { - private const val serialVersionUID: kotlin.Long = 1 - } -} - diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt deleted file mode 100644 index b5a8e5e5e14d..000000000000 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApi.kt +++ /dev/null @@ -1,68 +0,0 @@ -/** - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). - * https://openapi-generator.tech - * Do not edit the class manually. -*/ -package org.openapitools.api - -import org.openapitools.model.ItemsItemIdGet200Response -import io.swagger.annotations.Api -import io.swagger.annotations.ApiOperation -import io.swagger.annotations.ApiParam -import io.swagger.annotations.ApiResponse -import io.swagger.annotations.ApiResponses -import io.swagger.annotations.Authorization -import io.swagger.annotations.AuthorizationScope -import org.springframework.http.HttpStatus -import org.springframework.http.MediaType -import org.springframework.http.ResponseEntity - -import org.springframework.web.bind.annotation.* -import org.springframework.validation.annotation.Validated -import org.springframework.web.context.request.NativeWebRequest -import org.springframework.beans.factory.annotation.Autowired - -import javax.validation.constraints.DecimalMax -import javax.validation.constraints.DecimalMin -import javax.validation.constraints.Email -import javax.validation.constraints.Max -import javax.validation.constraints.Min -import javax.validation.constraints.NotNull -import javax.validation.constraints.Pattern -import javax.validation.constraints.Size -import javax.validation.Valid - -import kotlin.collections.List -import kotlin.collections.Map - -@RestController -@Validated -@Api(value = "items", description = "The items API") -interface ItemsApi { - - - @ApiOperation( - value = "Retrieve item \"by\" $Id", - nickname = "itemsItemIdGet", - notes = "Get an item using the $symbol in \"parameter\" and property names.", - response = ItemsItemIdGet200Response::class - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "\"Successful $response\"", response = ItemsItemIdGet200Response::class)] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_ITEMS_ITEM_ID_GET /* "/items/{item\$Id}" */], - produces = ["application/json"] - ) - fun itemsItemIdGet( - @ApiParam(value = "The $prefixed \"ID\" of the item.", required = true) @PathVariable("item$Id") itemDollarId: kotlin.String, - @ApiParam(value = "Optional $filter \"for\" item type.", defaultValue = "\"type\"$ADefault") @Valid @RequestParam(value = "filter$Type", required = false, defaultValue = "\"type\"$ADefault") filterDollarType: kotlin.String, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - companion object { - //for your own safety never directly reuse these path definitions in tests - const val PATH_ITEMS_ITEM_ID_GET: String = "/items/{item$Id}" - } -} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApi.kt deleted file mode 100644 index 74927d98aeb4..000000000000 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApi.kt +++ /dev/null @@ -1,226 +0,0 @@ -/** - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). - * https://openapi-generator.tech - * Do not edit the class manually. -*/ -package org.openapitools.api - -import org.openapitools.model.ModelApiResponse -import org.openapitools.model.Pet -import io.swagger.annotations.Api -import io.swagger.annotations.ApiOperation -import io.swagger.annotations.ApiParam -import io.swagger.annotations.ApiResponse -import io.swagger.annotations.ApiResponses -import io.swagger.annotations.Authorization -import io.swagger.annotations.AuthorizationScope -import org.springframework.http.HttpStatus -import org.springframework.http.MediaType -import org.springframework.http.ResponseEntity - -import org.springframework.web.bind.annotation.* -import org.springframework.validation.annotation.Validated -import org.springframework.web.context.request.NativeWebRequest -import org.springframework.beans.factory.annotation.Autowired - -import javax.validation.constraints.DecimalMax -import javax.validation.constraints.DecimalMin -import javax.validation.constraints.Email -import javax.validation.constraints.Max -import javax.validation.constraints.Min -import javax.validation.constraints.NotNull -import javax.validation.constraints.Pattern -import javax.validation.constraints.Size -import javax.validation.Valid - -import kotlin.collections.List -import kotlin.collections.Map - -@RestController -@Validated -@Api(value = "pet", description = "The pet API") -interface PetApi { - - - @ApiOperation( - value = "Add a new pet to the store", - nickname = "addPet", - notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] - ) - @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")] - ) - @RequestMapping( - method = [RequestMethod.POST], - value = [PATH_ADD_PET /* "/pet" */], - consumes = ["application/json"] - ) - fun addPet( - @ApiParam(value = "", required = true) @Valid @RequestBody pet: Pet, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Deletes a pet", - nickname = "deletePet", - notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] - ) - @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid pet value")] - ) - @RequestMapping( - method = [RequestMethod.DELETE], - value = [PATH_DELETE_PET /* "/pet/{petId}" */] - ) - fun deletePet( - @ApiParam(value = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, - @ApiParam(value = "") @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String?, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Finds Pets by status", - nickname = "findPetsByStatus", - notes = "Multiple status values can be provided with comma separated strings", - response = Pet::class, - responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"), ApiResponse(code = 400, message = "Invalid status value")] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], - produces = ["application/json"] - ) - fun findPetsByStatus( - @NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity> - - - @ApiOperation( - value = "Finds Pets by tags", - nickname = "findPetsByTags", - notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", - response = Pet::class, - responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"), ApiResponse(code = 400, message = "Invalid tag value")] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], - produces = ["application/json"] - ) - fun findPetsByTags( - @NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity> - - - @ApiOperation( - value = "Find pet by ID", - nickname = "getPetById", - notes = "Returns a single pet", - response = Pet::class, - authorizations = [Authorization(value = "api_key")] - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class), ApiResponse(code = 400, message = "Invalid ID supplied"), ApiResponse(code = 404, message = "Pet not found")] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], - produces = ["application/json"] - ) - fun getPetById( - @ApiParam(value = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Update an existing pet", - nickname = "updatePet", - notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] - ) - @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"), ApiResponse(code = 404, message = "Pet not found"), ApiResponse(code = 405, message = "Validation exception")] - ) - @RequestMapping( - method = [RequestMethod.PUT], - value = [PATH_UPDATE_PET /* "/pet" */], - consumes = ["application/json"] - ) - fun updatePet( - @ApiParam(value = "", required = true) @Valid @RequestBody pet: Pet, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Updates a pet in the store with form data", - nickname = "updatePetWithForm", - notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] - ) - @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")] - ) - @RequestMapping( - method = [RequestMethod.POST], - value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], - consumes = ["application/x-www-form-urlencoded"] - ) - fun updatePetWithForm( - @ApiParam(value = "ID of pet that needs to be updated", required = true) @PathVariable("petId") petId: kotlin.Long, - @ApiParam(value = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, - @ApiParam(value = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String?, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Uploads an image", - nickname = "uploadFile", - notes = "", - response = ModelApiResponse::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] - ) - @RequestMapping( - method = [RequestMethod.POST], - value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], - produces = ["application/json"], - consumes = ["multipart/form-data"] - ) - fun uploadFile( - @ApiParam(value = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, - @ApiParam(value = "") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String?, - @ApiParam(value = "file detail") @Valid @RequestPart("file", required = false) file: org.springframework.web.multipart.MultipartFile, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - companion object { - //for your own safety never directly reuse these path definitions in tests - const val PATH_ADD_PET: String = "/pet" - const val PATH_DELETE_PET: String = "/pet/{petId}" - const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" - const val PATH_FIND_PETS_BY_TAGS: String = "/pet/findByTags" - const val PATH_GET_PET_BY_ID: String = "/pet/{petId}" - const val PATH_UPDATE_PET: String = "/pet" - const val PATH_UPDATE_PET_WITH_FORM: String = "/pet/{petId}" - const val PATH_UPLOAD_FILE: String = "/pet/{petId}/uploadImage" - } -} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt deleted file mode 100644 index d6cc8540cd38..000000000000 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200Response.kt +++ /dev/null @@ -1,42 +0,0 @@ -package org.openapitools.model - -import java.util.Locale -import java.util.Objects -import com.fasterxml.jackson.annotation.JsonProperty -import org.openapitools.model.ItemsItemIdGet200ResponseDetailsInfo -import java.io.Serializable -import javax.validation.constraints.DecimalMax -import javax.validation.constraints.DecimalMin -import javax.validation.constraints.Email -import javax.validation.constraints.Max -import javax.validation.constraints.Min -import javax.validation.constraints.NotNull -import javax.validation.constraints.Pattern -import javax.validation.constraints.Size -import javax.validation.Valid -import io.swagger.annotations.ApiModelProperty - -/** - * - * @param itemDollarId The $ID of \"the\" item. - * @param nameDollarValue The $name \"of the \"item. - * @param detailsDollarInfo - */ -data class ItemsItemIdGet200Response( - - @ApiModelProperty(example = "\"item\$123\"", value = "The $ID of \"the\" item.") - @get:JsonProperty("item$Id") val itemDollarId: kotlin.String? = "Item$Id\"Default\"", - - @ApiModelProperty(example = "\"Item\"\$Name", value = "The $name \"of the \"item.") - @get:JsonProperty("name$Value") val nameDollarValue: kotlin.String? = "Item$\"NameDefault\"", - - @field:Valid - @ApiModelProperty(example = "null", value = "") - @get:JsonProperty("details$Info") val detailsDollarInfo: ItemsItemIdGet200ResponseDetailsInfo? = null -) : Serializable { - - companion object { - private const val serialVersionUID: kotlin.Long = 1 - } -} - diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt deleted file mode 100644 index 83e4cc53b514..000000000000 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdGet200ResponseDetailsInfo.kt +++ /dev/null @@ -1,36 +0,0 @@ -package org.openapitools.model - -import java.util.Locale -import java.util.Objects -import com.fasterxml.jackson.annotation.JsonProperty -import java.io.Serializable -import javax.validation.constraints.DecimalMax -import javax.validation.constraints.DecimalMin -import javax.validation.constraints.Email -import javax.validation.constraints.Max -import javax.validation.constraints.Min -import javax.validation.constraints.NotNull -import javax.validation.constraints.Pattern -import javax.validation.constraints.Size -import javax.validation.Valid -import io.swagger.annotations.ApiModelProperty - -/** - * Nested \"object\" with $keys. - * @param detailDollarOne \"First $detail\" - * @param detailDollarTwo \"Second\" $detail - */ -data class ItemsItemIdGet200ResponseDetailsInfo( - - @ApiModelProperty(example = "\"Detail\$1\"", value = "\"First $detail\"") - @get:JsonProperty("detail$One") val detailDollarOne: kotlin.String? = "\"Detail\"$1Default", - - @ApiModelProperty(example = "42", value = "\"Second\" $detail") - @get:JsonProperty("detail$Two") val detailDollarTwo: kotlin.Int? = null -) : Serializable { - - companion object { - private const val serialVersionUID: kotlin.Long = 1 - } -} - From b41dc7079f05b3bad8f3aa65fb0af36762e55e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 14:18:02 +0100 Subject: [PATCH 08/26] removed some files --- .../kotlin/org/openapitools/api/StoreApi.kt | 128 ----------- .../kotlin/org/openapitools/api/UserApi.kt | 205 ------------------ 2 files changed, 333 deletions(-) delete mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApi.kt delete mode 100644 samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApi.kt diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApi.kt deleted file mode 100644 index 40c176b58ce1..000000000000 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApi.kt +++ /dev/null @@ -1,128 +0,0 @@ -/** - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). - * https://openapi-generator.tech - * Do not edit the class manually. -*/ -package org.openapitools.api - -import org.openapitools.model.Order -import io.swagger.annotations.Api -import io.swagger.annotations.ApiOperation -import io.swagger.annotations.ApiParam -import io.swagger.annotations.ApiResponse -import io.swagger.annotations.ApiResponses -import io.swagger.annotations.Authorization -import io.swagger.annotations.AuthorizationScope -import org.springframework.http.HttpStatus -import org.springframework.http.MediaType -import org.springframework.http.ResponseEntity - -import org.springframework.web.bind.annotation.* -import org.springframework.validation.annotation.Validated -import org.springframework.web.context.request.NativeWebRequest -import org.springframework.beans.factory.annotation.Autowired - -import javax.validation.constraints.DecimalMax -import javax.validation.constraints.DecimalMin -import javax.validation.constraints.Email -import javax.validation.constraints.Max -import javax.validation.constraints.Min -import javax.validation.constraints.NotNull -import javax.validation.constraints.Pattern -import javax.validation.constraints.Size -import javax.validation.Valid - -import kotlin.collections.List -import kotlin.collections.Map - -@RestController -@Validated -@Api(value = "store", description = "The store API") -interface StoreApi { - - - @ApiOperation( - value = "Delete purchase order by ID", - nickname = "deleteOrder", - notes = "" - ) - @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"), ApiResponse(code = 404, message = "Order not found")] - ) - @RequestMapping( - method = [RequestMethod.DELETE], - value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] - ) - fun deleteOrder( - @ApiParam(value = "", required = true) @PathVariable("orderId") orderId: kotlin.String, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Returns pet inventories by status", - nickname = "getInventory", - notes = "", - response = kotlin.Int::class, - responseContainer = "Map", - authorizations = [Authorization(value = "api_key")] - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_GET_INVENTORY /* "/store/inventory" */], - produces = ["application/json"] - ) - fun getInventory(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity> - - - @ApiOperation( - value = "Find purchase order by ID", - nickname = "getOrderById", - notes = "", - response = Order::class - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class), ApiResponse(code = 400, message = "Invalid ID supplied"), ApiResponse(code = 404, message = "Order not found")] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], - produces = ["application/json"] - ) - fun getOrderById( - @Min(value=1) @Max(value=5) @ApiParam(value = "", required = true) @PathVariable("orderId") orderId: kotlin.Int, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Place an order for a pet", - nickname = "placeOrder", - notes = "", - response = Order::class - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class), ApiResponse(code = 400, message = "Invalid Order")] - ) - @RequestMapping( - method = [RequestMethod.POST], - value = [PATH_PLACE_ORDER /* "/store/order" */], - produces = ["application/json"], - consumes = ["application/json"] - ) - fun placeOrder( - @ApiParam(value = "", required = true) @Valid @RequestBody order: Order, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - companion object { - //for your own safety never directly reuse these path definitions in tests - const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" - const val PATH_GET_INVENTORY: String = "/store/inventory" - const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" - const val PATH_PLACE_ORDER: String = "/store/order" - } -} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApi.kt deleted file mode 100644 index db017f3558b1..000000000000 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApi.kt +++ /dev/null @@ -1,205 +0,0 @@ -/** - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). - * https://openapi-generator.tech - * Do not edit the class manually. -*/ -package org.openapitools.api - -import org.openapitools.model.User -import io.swagger.annotations.Api -import io.swagger.annotations.ApiOperation -import io.swagger.annotations.ApiParam -import io.swagger.annotations.ApiResponse -import io.swagger.annotations.ApiResponses -import io.swagger.annotations.Authorization -import io.swagger.annotations.AuthorizationScope -import org.springframework.http.HttpStatus -import org.springframework.http.MediaType -import org.springframework.http.ResponseEntity - -import org.springframework.web.bind.annotation.* -import org.springframework.validation.annotation.Validated -import org.springframework.web.context.request.NativeWebRequest -import org.springframework.beans.factory.annotation.Autowired - -import javax.validation.constraints.DecimalMax -import javax.validation.constraints.DecimalMin -import javax.validation.constraints.Email -import javax.validation.constraints.Max -import javax.validation.constraints.Min -import javax.validation.constraints.NotNull -import javax.validation.constraints.Pattern -import javax.validation.constraints.Size -import javax.validation.Valid - -import kotlin.collections.List -import kotlin.collections.Map - -@RestController -@Validated -@Api(value = "user", description = "The user API") -interface UserApi { - - - @ApiOperation( - value = "Create user", - nickname = "createUser", - notes = "" - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")] - ) - @RequestMapping( - method = [RequestMethod.POST], - value = [PATH_CREATE_USER /* "/user" */], - consumes = ["application/json"] - ) - fun createUser( - @ApiParam(value = "", required = true) @Valid @RequestBody user: User, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Creates list of users with given input array", - nickname = "createUsersWithArrayInput", - notes = "" - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")] - ) - @RequestMapping( - method = [RequestMethod.POST], - value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */], - consumes = ["application/json"] - ) - fun createUsersWithArrayInput( - @ApiParam(value = "", required = true) @Valid @RequestBody user: kotlin.collections.List, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Creates list of users with given input array", - nickname = "createUsersWithListInput", - notes = "" - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")] - ) - @RequestMapping( - method = [RequestMethod.POST], - value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */], - consumes = ["application/json"] - ) - fun createUsersWithListInput( - @ApiParam(value = "", required = true) @Valid @RequestBody user: kotlin.collections.List, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Delete user", - nickname = "deleteUser", - notes = "" - ) - @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid username supplied"), ApiResponse(code = 404, message = "User not found")] - ) - @RequestMapping( - method = [RequestMethod.DELETE], - value = [PATH_DELETE_USER /* "/user/{username}" */] - ) - fun deleteUser( - @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Get user by user name", - nickname = "getUserByName", - notes = "", - response = User::class - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = User::class), ApiResponse(code = 400, message = "Invalid username supplied"), ApiResponse(code = 404, message = "User not found")] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], - produces = ["application/json"] - ) - fun getUserByName( - @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Logs user into the system", - nickname = "loginUser", - notes = "", - response = kotlin.String::class - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class), ApiResponse(code = 400, message = "Invalid username/password supplied")] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_LOGIN_USER /* "/user/login" */], - produces = ["application/json"] - ) - fun loginUser( - @NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, - @NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - - @ApiOperation( - value = "Logs out current logged in user session", - nickname = "logoutUser", - notes = "" - ) - @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")] - ) - @RequestMapping( - method = [RequestMethod.GET], - value = [PATH_LOGOUT_USER /* "/user/logout" */] - ) - fun logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity - - - @ApiOperation( - value = "Updated user", - nickname = "updateUser", - notes = "" - ) - @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid user supplied"), ApiResponse(code = 404, message = "User not found")] - ) - @RequestMapping( - method = [RequestMethod.PUT], - value = [PATH_UPDATE_USER /* "/user/{username}" */], - consumes = ["application/json"] - ) - fun updateUser( - @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, - @ApiParam(value = "", required = true) @Valid @RequestBody user: User, - @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity - - companion object { - //for your own safety never directly reuse these path definitions in tests - const val PATH_CREATE_USER: String = "/user" - const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" - const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" - const val PATH_DELETE_USER: String = "/user/{username}" - const val PATH_GET_USER_BY_NAME: String = "/user/{username}" - const val PATH_LOGIN_USER: String = "/user/login" - const val PATH_LOGOUT_USER: String = "/user/logout" - const val PATH_UPDATE_USER: String = "/user/{username}" - } -} From 907f8788b8de7604555db35dca990ea523187667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 14:21:46 +0100 Subject: [PATCH 09/26] fix one more place --- .../src/main/resources/kotlin-spring/cookieParams.mustache | 2 +- .../src/main/kotlin/org/openapitools/api/ItemsApi.kt | 4 ++-- .../main/kotlin/org/openapitools/api/ItemsApiController.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache index decfa98ac79c..9bc91ea16229 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache @@ -1 +1 @@ -{{#isCookieParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}@CookieValue(name = "{{baseName}}"{{^required}}, required = false{{/required}}{{#defaultValue}}, defaultValue = "{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}"{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isCookieParam}} \ No newline at end of file +{{#isCookieParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}@CookieValue(name = "{{#lambdaEscapeInNormalString}}{{{baseName}}}{{/lambdaEscapeInNormalString}}"{{^required}}, required = false{{/required}}{{#defaultValue}}, defaultValue = "{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}"{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isCookieParam}} \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt index 18981ef12085..a302ce3cea83 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -66,8 +66,8 @@ interface ItemsApi { @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, - @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, - @CookieValue(name = "session$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange ): ResponseEntity { return getDelegate().itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo, exchange) diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt index 0be438899627..1afe5147feaf 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -58,8 +58,8 @@ class ItemsApiController() { @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, - @CookieValue(name = "session$Token", required = false) sessionDollarToken: kotlin.String?, - @CookieValue(name = "session$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest ): ResponseEntity { return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) From c9ce225243f77d0a158a2f4eee4258ee3ff92436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 14:41:15 +0100 Subject: [PATCH 10/26] DRY tests --- .../spring/KotlinSpringServerCodegenTest.java | 2620 +++++++---------- 1 file changed, 1085 insertions(+), 1535 deletions(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index c9843b2a0169..c3895a6acde3 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -1,14 +1,11 @@ package org.openapitools.codegen.kotlin.spring; import com.google.common.collect.ImmutableMap; -import io.swagger.parser.OpenAPIParser; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.servers.Server; -import io.swagger.v3.parser.core.models.ParseOptions; import org.apache.commons.io.FileUtils; import org.assertj.core.api.Assertions; -import org.jetbrains.annotations.NotNull; import org.openapitools.codegen.ClientOptInput; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.DefaultGenerator; @@ -95,103 +92,85 @@ public void testInitialConfigValues() throws Exception { } @Test - public void testNoRequestMappingAnnotation_spring_cloud_default() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - - final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.setLibrary("spring-cloud"); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/feat13488_use_kotlinSpring_with_springCloud.yaml")) - .config(codegen)) - .generate(); - - // Check that the @RequestMapping annotation is not generated in the Api file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "@RequestMapping(\"\\${api.base-path" + public void testNoRequestMappingAnnotation_spring_cloud_default() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/feat13488_use_kotlinSpring_with_springCloud.yaml", + Map.of(CodegenConstants.LIBRARY, "spring-cloud"), + Map.of()); + assertGeneratedFilesNotContain( + Map.of( // Check that the @RequestMapping annotation is not generated in the Api file + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("@RequestMapping(\"\\${api.base-path") + ) ); } @Test - public void testNoRequestMappingAnnotationNone() throws IOException { - File output = generatePetstoreWithRequestMappingMode(KotlinSpringServerCodegen.RequestMappingMode.none); - - // Check that the @RequestMapping annotation is not generated in the Api file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"), - "@RequestMapping(\"\\${" - ); - // Check that the @RequestMapping annotation is not generated in the ApiController file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"), - "@RequestMapping(\"\\${" + public void testNoRequestMappingAnnotationNone() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + DELEGATE_PATTERN, true, + USE_TAGS, true, + REQUEST_MAPPING_OPTION, "none" + ), Map.of()); + assertGeneratedFilesNotContain( + Map.of( // Check that the @RequestMapping annotation is not generated in the Api file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("@RequestMapping(\"\\${"), + // Check that the @RequestMapping annotation is not generated in the ApiController file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("@RequestMapping(\"\\${") + ) ); } @Test - public void testNoRequestMappingAnnotationController() throws IOException { - File output = generatePetstoreWithRequestMappingMode(KotlinSpringServerCodegen.RequestMappingMode.controller); - - // Check that the @RequestMapping annotation is not generated in the Api file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"), - "@RequestMapping(\"\\${" + public void testNoRequestMappingAnnotationController() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + DELEGATE_PATTERN, true, + USE_TAGS, true, + REQUEST_MAPPING_OPTION, "controller" + ), Map.of()); + assertGeneratedFilesNotContain( + Map.of( // Check that the @RequestMapping annotation is not generated in the Api file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("@RequestMapping(\"\\${") + ) ); - // Check that the @RequestMapping annotation is generated in the ApiController file - assertFileContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"), - "@RequestMapping(\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\")", - " companion object {\n" - + " //for your own safety never directly reuse these path definitions in tests\n" - + " const val BASE_PATH: String = \"/v2\"\n" - + " }" + assertGeneratedFilesContain( + Map.of( // Check that the @RequestMapping annotation is generated in the ApiController file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("@RequestMapping(\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\")", + " companion object {\n" + + " //for your own safety never directly reuse these path definitions in tests\n" + + " const val BASE_PATH: String = \"/v2\"\n" + + " }") + ) ); } @Test - public void testNoRequestMappingAnnotationApiInterface() throws IOException { - File output = generatePetstoreWithRequestMappingMode(KotlinSpringServerCodegen.RequestMappingMode.api_interface); + public void testNoRequestMappingAnnotationApiInterface() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + DELEGATE_PATTERN, true, + USE_TAGS, true, + REQUEST_MAPPING_OPTION, "api_interface" + ), Map.of()); - // Check that the @RequestMapping annotation is generated in the Api file - assertFileContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"), - "@RequestMapping(\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\")", - " companion object {\n" - + " //for your own safety never directly reuse these path definitions in tests\n" - + " const val BASE_PATH: String = \"/v2\"" - ); - // Check that the @RequestMapping annotation is not generated in the ApiController file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"), - "@RequestMapping(\"\\${" + assertGeneratedFilesContain( + Map.of( + // Check that the @RequestMapping annotation is generated in the Api file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + "@RequestMapping(\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\")", + " companion object {\n" + + " //for your own safety never directly reuse these path definitions in tests\n" + + " const val BASE_PATH: String = \"/v2\"") + ) ); - } - - private static @NotNull File generatePetstoreWithRequestMappingMode(KotlinSpringServerCodegen.RequestMappingMode requestMappingMode) throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REQUEST_MAPPING_OPTION, requestMappingMode); - - new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen) + assertGeneratedFilesNotContain( + Map.of( + // Check that the @RequestMapping annotation is not generated in the ApiController file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + "@RequestMapping(\"\\${") ) - .generate(); - return output; + ); } @Test - public void testSettersForConfigValues() throws Exception { + public void testSettersForConfigValues() { final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); codegen.setModelPackage("xx.yyyyyyyy.model"); codegen.setApiPackage("xx.yyyyyyyy.api"); @@ -231,7 +210,7 @@ public void testSettersForConfigValues() throws Exception { } @Test - public void testAdditionalPropertiesPutForConfigValues() throws Exception { + public void testAdditionalPropertiesPutForConfigValues() { final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "xyz.yyyyy.mmmmm.model"); codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "xyz.yyyyy.aaaaa.api"); @@ -301,398 +280,235 @@ public void testDelegatePattern() { } @Test(description = "test delegate with tags") - public void delegateWithTags() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); //may be move to /build - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); + public void delegateWithTags() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue5497-use-tags-kotlin.yaml", Map.of( + KotlinSpringServerCodegen.DELEGATE_PATTERN, true, + KotlinSpringServerCodegen.USE_TAGS, true + ), Map.of()); + + assertGeneratedFilesExist(List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt") + )); + } - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue5497-use-tags-kotlin.yaml")) - .config(codegen) + @Test(description = "test delegate reactive with tags") + public void delegateReactiveWithTags() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue7325-use-delegate-reactive-tags-kotlin.yaml", Map.of( + KotlinSpringServerCodegen.DELEGATE_PATTERN, true, + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.USE_TAGS, true + ), Map.of()); + + assertGeneratedFilesExist(List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2Api.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3Api.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt") + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("suspend fun"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("suspend fun"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2Api.kt"), List.of("import kotlinx.coroutines.flow.Flow", "ResponseEntity>"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), List.of("import kotlinx.coroutines.flow.Flow", "ResponseEntity>"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3Api.kt"), List.of("import kotlinx.coroutines.flow.Flow", "requestBody: Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt"), List.of("import kotlinx.coroutines.flow.Flow", "suspend fun", "requestBody: Flow" + ) + ) + ); + assertGeneratedFilesNotContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("exchange"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("ApiUtil"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2Api.kt"), List.of("exchange"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), List.of("suspend fun", "ApiUtil"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3Api.kt"), List.of("exchange"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt"), List.of("ApiUtil" + ) ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt") ); } - @Test(description = "test delegate reactive with tags") - public void delegateReactiveWithTags() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); //may be move to /build - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue7325-use-delegate-reactive-tags-kotlin.yaml")) - .config(codegen) - ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV3Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV3ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt") - ); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "suspend fun"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "exchange"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "suspend fun"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "ApiUtil"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV2Api.kt"), - "import kotlinx.coroutines.flow.Flow", "ResponseEntity>"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV2Api.kt"), - "exchange"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), - "import kotlinx.coroutines.flow.Flow", "ResponseEntity>"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), - "suspend fun", "ApiUtil"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV3Api.kt"), - "import kotlinx.coroutines.flow.Flow", "requestBody: Flow"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV3Api.kt"), - "exchange"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt"), - "import kotlinx.coroutines.flow.Flow", "suspend fun", "requestBody: Flow"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt"), - "ApiUtil"); - } - - @Test - public void testNullableMultipartFile() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/kotlin/feat-multipartfile_nullable.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/NullableMultipartfileApiController.kt"), - "file: org.springframework.web.multipart.MultipartFile?" - + " )"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/NullableMultipartfileArrayApiController.kt"), - "files: Array?" - + " )"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/NonNullableMultipartfileApiController.kt"), - "file: org.springframework.web.multipart.MultipartFile" - + " )"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/NonNullableMultipartfileArrayApiController.kt"), - "files: Array" - + " )"); + @Test + public void testNullableMultipartFile() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/feat-multipartfile_nullable.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/NullableMultipartfileApiController.kt"), List.of( + "file: org.springframework.web.multipart.MultipartFile?" + + " )"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/NullableMultipartfileArrayApiController.kt"), List.of( + "files: Array?" + + " )"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/NonNullableMultipartfileApiController.kt"), List.of( + "file: org.springframework.web.multipart.MultipartFile" + + " )"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/NonNullableMultipartfileArrayApiController.kt"), List.of( + "files: Array" + + " )" + ) + ) + ); } @Test - public void arrayItemsCanBeNullable() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/array-nullable-items.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/ArrayWithNullableItemsModel.kt"), "List"); + public void arrayItemsCanBeNullable() { + Path apiSources = generateApiSources("src/test/resources/3_0/array-nullable-items.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/model/ArrayWithNullableItemsModel.kt"), List.of("List")) + ); } @Test - public void doNotGenerateRequestParamForObjectQueryParam() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/objectQueryParam.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileNotContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PonyApiController.kt"), "@RequestParam"); + public void doNotGenerateRequestParamForObjectQueryParam() { + Path apiSources = generateApiSources("src/test/resources/3_0/objectQueryParam.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesNotContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/PonyApiController.kt"), List.of("@RequestParam")) + ); } @Test - public void doGenerateRequestParamForSimpleParam() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/issue_3248.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/MonkeysApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ElephantsApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ZebrasApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/BearsApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/CamelsApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PandasApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/CrocodilesApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PolarBearsApiController.kt"), "@RequestParam"); + public void doGenerateRequestParamForSimpleParam() { + Path apiSources = generateApiSources("src/test/resources/3_0/issue_3248.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/MonkeysApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/ElephantsApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/ZebrasApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/BearsApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/CamelsApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PandasApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/CrocodilesApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PolarBearsApiController.kt"), List.of("@RequestParam") + ) + ); } @Test - public void generateFormatForDateAndDateTimeQueryParam() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/issue_2053.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - generator.opts(input).generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ElephantsApiController.kt"), - "@org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE)" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ZebrasApiController.kt"), - "@org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME)" + public void generateFormatForDateAndDateTimeQueryParam() { + Path apiSources = generateApiSources("src/test/resources/3_0/issue_2053.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ElephantsApiController.kt"), + List.of("@org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE)"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/ZebrasApiController.kt"), + List.of("@org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME)") + ) ); } @Test(description = "test bean qualifiers") - public void beanQualifiers() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.BEAN_QUALIFIERS, true); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/bean-qualifiers.yaml")) - .config(codegen)) - .generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PingApiController.kt"), - "@RestController(\"org.openapitools.api.PingApiController\")" + public void beanQualifiers() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/bean-qualifiers.yaml", Map.of(KotlinSpringServerCodegen.BEAN_QUALIFIERS, true), Map.of()); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/PingApiController.kt"), List.of("@RestController(\"org.openapitools.api.PingApiController\")")) ); } @Test(description = "test skip default interface") - public void skipDefaultInterface() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.INTERFACE_ONLY, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SKIP_DEFAULT_INTERFACE, true); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/skip-default-interface.yaml")) - .config(codegen)) - .generate(); - - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PingApi.kt"), - "return " + public void skipDefaultInterface() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/skip-default-interface.yaml", Map.of( + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.SKIP_DEFAULT_INTERFACE, true + ), Map.of()); + assertGeneratedFilesNotContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/PingApi.kt"), List.of("return ")) ); } @Test(description = "test cookie parameter generation on interface apis") - public void cookieParameterGenerationApis() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.INTERFACE_ONLY, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SKIP_DEFAULT_INTERFACE, true); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore-with-fake-endpoints-for-testing-with-cookie.yaml")) - .config(codegen)) - .generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/FakeApi.kt"), - "@CookieValue" - ); + public void cookieParameterGenerationApis() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-fake-endpoints-for-testing-with-cookie.yaml", Map.of( + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.SKIP_DEFAULT_INTERFACE, true + ), Map.of()); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/FakeApi.kt"), List.of("@CookieValue"))); } @Test(description = "test cookie parameter generation on controllers") - public void cookieParameterGenerationControllers() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore-with-fake-endpoints-for-testing-with-cookie.yaml")) - .config(codegen)) - .generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/FakeApiController.kt"), - "@CookieValue" - ); + public void cookieParameterGenerationControllers() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-fake-endpoints-for-testing-with-cookie.yaml", Map.of(), Map.of()); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/FakeApiController.kt"), List.of("@CookieValue"))); } @Test(description = "use Spring boot 3 & jakarta extension") - public void useSpringBoot3() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_SPRING_BOOT3, true); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/feat13578_use_springboot3_jakarta_extension.yaml")) - .config(codegen)) - .generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ApiUtil.kt"), - "import jakarta.servlet.http.HttpServletResponse" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/Exceptions.kt"), - "import jakarta.validation.ConstraintViolationException" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PingApiController.kt"), - "import jakarta.validation.Valid" + public void useSpringBoot3() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/feat13578_use_springboot3_jakarta_extension.yaml", Map.of( + KotlinSpringServerCodegen.USE_SPRING_BOOT3, true + ), Map.of()); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ApiUtil.kt"), List.of("import jakarta.servlet.http.HttpServletResponse"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/Exceptions.kt"), List.of("import jakarta.validation.ConstraintViolationException"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PingApiController.kt"), List.of("import jakarta.validation.Valid") + ) ); } @Test(description = "multi-line descriptions should be supported for operations") - public void multiLineOperationDescription() throws IOException { + public void multiLineOperationDescription() { testMultiLineOperationDescription(false); } @Test(description = "multi-line descriptions should be supported for operations (interface-only)") - public void multiLineOperationDescriptionInterfaceOnly() throws IOException { + public void multiLineOperationDescriptionInterfaceOnly() { testMultiLineOperationDescription(true); } - private static void testMultiLineOperationDescription(final boolean isInterfaceOnly) throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.INTERFACE_ONLY, - isInterfaceOnly); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue4111-multiline-operation-description.yaml")) - .config(codegen)) - .generate(); + private void testMultiLineOperationDescription(final boolean isInterfaceOnly) { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue4111-multiline-operation-description.yaml", Map.of( + KotlinSpringServerCodegen.INTERFACE_ONLY, isInterfaceOnly + ), Map.of()); final String pingApiFileName; if (isInterfaceOnly) { @@ -700,110 +516,63 @@ private static void testMultiLineOperationDescription(final boolean isInterfaceO } else { pingApiFileName = "PingApiController.kt"; } - assertFileContains( - Paths.get( - outputPath + "/src/main/kotlin/org/openapitools/api/" + pingApiFileName), - "description = \"\"\"# Multi-line descriptions\n" - + "\n" - + "This is an example of a multi-line description.\n" - + "\n" - + "It:\n" - + "- has multiple lines\n" - + "- uses Markdown (CommonMark) for rich text representation\"\"\"" + + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/" + pingApiFileName), + List.of( + "description = \"\"\"# Multi-line descriptions\n" + + "\n" + + "This is an example of a multi-line description.\n" + + "\n" + + "It:\n" + + "- has multiple lines\n" + + "- uses Markdown (CommonMark) for rich text representation\"\"\"") + ) ); } @Test(description = "use get Annotation use-site target on kotlin interface attributes") - public void useTargetOnInterfaceAnnotations() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue3596-use-correct-get-annotation-target.yaml")) - .config(codegen)) - .generate(); - - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@Schema(example = \"null\", description = \"\")" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@get:Schema(example = \"null\", description = \"\")" - ); - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@Schema(example = \"null\", requiredMode = Schema.RequiredMode.REQUIRED, description = \"\")" + public void useTargetOnInterfaceAnnotations() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue3596-use-correct-get-annotation-target.yaml", Map.of(), Map.of()); + Path animalDto = apiSources.resolve("src/main/kotlin/org/openapitools/model/Animal.kt"); + assertGeneratedFilesContain( + Map.of( + animalDto, List.of("@get:Schema(example = \"null\", description = \"\")", "@get:Schema(example = \"null\", requiredMode = Schema.RequiredMode.REQUIRED, description = \"\")") + ) ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@get:Schema(example = \"null\", requiredMode = Schema.RequiredMode.REQUIRED, description = \"\")" + assertGeneratedFilesNotContain( + Map.of( + animalDto, List.of("@Schema(example = \"null\", description = \"\")", "@Schema(example = \"null\", requiredMode = Schema.RequiredMode.REQUIRED, description = \"\")") + ) ); } @Test(description = "use get Annotation use-site target on kotlin interface attributes (swagger1)") - public void useTargetOnInterfaceAnnotationsWithSwagger1() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(ANNOTATION_LIBRARY, AnnotationLibrary.SWAGGER1.toCliOptValue()); - codegen.additionalProperties().put(DOCUMENTATION_PROVIDER, DocumentationProvider.SPRINGFOX.toCliOptValue()); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue3596-use-correct-get-annotation-target.yaml")) - .config(codegen)) - .generate(); - - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@ApiModelProperty(example = \"null\", value = \"\")" + public void useTargetOnInterfaceAnnotationsWithSwagger1() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue3596-use-correct-get-annotation-target.yaml", Map.of( + ANNOTATION_LIBRARY, AnnotationLibrary.SWAGGER1.toCliOptValue(), + DOCUMENTATION_PROVIDER, DocumentationProvider.SPRINGFOX.toCliOptValue() + ), Map.of()); + Path animalDto = apiSources.resolve("src/main/kotlin/org/openapitools/model/Animal.kt"); + assertGeneratedFilesContain( + Map.of(animalDto, List.of("@get:ApiModelProperty(example = \"null\", value = \"\")", "@get:ApiModelProperty(example = \"null\", required = true, value = \"\")")) ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@get:ApiModelProperty(example = \"null\", value = \"\")" - ); - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@ApiModelProperty(example = \"null\", required = true, value = \"\")" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@get:ApiModelProperty(example = \"null\", required = true, value = \"\")" + assertGeneratedFilesNotContain( + Map.of(animalDto, List.of("@ApiModelProperty(example = \"null\", value = \"\")", "@ApiModelProperty(example = \"null\", required = true, value = \"\")")) ); } @Test - public void useBeanValidationGenerateAnnotationsForRequestBody() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/bugs/issue_13932.yml", null, new ParseOptions()).getOpenAPI(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.INTERFACE_ONLY, "true"); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_BEANVALIDATION, "true"); - codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "xyz.model"); - codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "xyz.controller"); - - ClientOptInput input = new ClientOptInput() - .openAPI(openAPI) - .config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - Map files = generator.opts(input).generate().stream() - .collect(Collectors.toMap(File::getName, Function.identity())); - - assertFileContains( - Paths.get(files.get("AddApi.kt").getAbsolutePath()), - "@Min(value=2)" + public void useBeanValidationGenerateAnnotationsForRequestBody() { + Path apiSources = generateApiSources("src/test/resources/bugs/issue_13932.yml", Map.of( + KotlinSpringServerCodegen.INTERFACE_ONLY, "true", + KotlinSpringServerCodegen.USE_BEANVALIDATION, "true", + CodegenConstants.MODEL_PACKAGE, "xyz.model", + CodegenConstants.API_PACKAGE, "xyz.controller" + ), Map.of()); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/xyz/controller/AddApi.kt"), List.of("@Min(value=2)")) ); } @@ -842,571 +611,370 @@ public void contractWithResolvedInnerEnumContainsEnumConverter() throws IOExcept } @Test - public void givenMultipartFormArray_whenGenerateDelegateAndService_thenParameterIsCreatedAsListOfMultipartFile() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/kotlin/petstore-with-tags.yaml"); - final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOpenAPI(openAPI); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.setDelegatePattern(true); - codegen.setServiceInterface(true); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path delegateFile = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"); - assertFileContains(delegateFile, "additionalMetadata: kotlin.String?"); - assertFileContains(delegateFile, "images: Array"); - - Path controllerFile = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApi.kt"); - assertFileContains(controllerFile, "images: Array"); - - Path serviceFile = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApiService.kt"); - assertFileContains(serviceFile, "images: Array"); - } - - @Test - public void givenOctetStreamResponseType_whenGenerateServer_thenReturnTypeIsResource() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/kotlin/petstore-with-tags.yaml"); - final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOpenAPI(openAPI); - codegen.setOutputDir(output.getAbsolutePath()); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path outputFilepath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"); - - assertFileContains(outputFilepath, "): ResponseEntity"); - } - - @Test - public void givenMultipartForm_whenGenerateReactiveServer_thenParameterAreCreatedAsRequestPart() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/kotlin/petstore-with-tags.yaml"); - final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOpenAPI(openAPI); - codegen.setOutputDir(output.getAbsolutePath()); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path outputFilepath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"); - - assertFileContains(outputFilepath, - "@Parameter(description = \"Additional data to pass to server\") @Valid @RequestParam(value = \"additionalMetadata\", required = false) additionalMetadata: kotlin.String?"); - assertFileContains(outputFilepath, - "@Parameter(description = \"image to upload\") @Valid @RequestPart(\"image\", required = false) image: org.springframework.web.multipart.MultipartFile"); - - } + public void givenMultipartFormArray_whenGenerateDelegateAndService_thenParameterIsCreatedAsListOfMultipartFile() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-tags.yaml", Map.of( + KotlinSpringServerCodegen.SERVICE_INTERFACE, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of("additionalMetadata: kotlin.String?", "images: Array"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("images: Array"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiService.kt"), List.of("images: Array") + ) + ); + } @Test - public void overridePropertyFunction() throws IOException { - - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.SERIALIZABLE_MODEL, true); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/bugs/issue_20228.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Pony.kt"), - "override val nameOpt", "override val nameReq" + public void givenOctetStreamResponseType_whenGenerateServer_thenReturnTypeIsResource() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-tags.yaml", Map.of(), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("): ResponseEntity") + ) ); } @Test - public void generateSerializableModel() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.SERIALIZABLE_MODEL, true); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Pet.kt"); - assertFileContains( - path, - "import java.io.Serializable", - ") : Serializable {", - "private const val serialVersionUID: kotlin.Long = 1" + public void givenMultipartForm_whenGenerateReactiveServer_thenParameterAreCreatedAsRequestPart() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-tags.yaml", Map.of(), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), + List.of("@Parameter(description = \"Additional data to pass to server\") @Valid @RequestParam(value = \"additionalMetadata\", required = false) additionalMetadata: kotlin.String?", + "@Parameter(description = \"image to upload\") @Valid @RequestPart(\"image\", required = false) image: org.springframework.web.multipart.MultipartFile") + ) ); } @Test - public void generateSerializableModelWithXimplements() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.SERIALIZABLE_MODEL, true); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Dog.kt"); - assertFileContains( - path, - "import java.io.Serializable", - "@get:JsonProperty(\"likesFetch\", required = true) override val likesFetch: kotlin.Boolean,", - ") : Pet, Serializable, com.some.pack.Fetchable {", - "private const val serialVersionUID: kotlin.Long = 1" - ); + public void overridePropertyFunction() { + Path apiSources = generateApiSources("src/test/resources/bugs/issue_20228.yaml", Map.of( + CodegenConstants.SERIALIZABLE_MODEL, true + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "false", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/model/Pony.kt"), List.of("override val nameOpt", "override val nameReq"))); } @Test - public void generateHttpInterfaceReactiveWithReactorResponseEntity() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, true); - codegen.additionalProperties().put(DECLARATIVE_INTERFACE_REACTIVE_MODE, "reactor"); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, true); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - "import reactor.core.publisher.Flux\n" - + "import reactor.core.publisher.Mono", - " @HttpExchange(\n" - + " url = PATH_GET_INVENTORY /* \"/store/inventory\" */,\n" - + " method = \"GET\"\n" - + " )\n" - + " fun getInventory(\n" - + " ): Mono>>", - " @HttpExchange(\n" - + " url = PATH_DELETE_ORDER /* \"/store/order/{orderId}\" */,\n" - + " method = \"DELETE\"\n" - + " )\n" - + " fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): Mono>", - " @HttpExchange(\n" - + " url = PATH_PLACE_ORDER /* \"/store/order\" */,\n" - + " method = \"POST\"\n" - + " )\n" - + " fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): Mono>", - " companion object {\n" - + " //for your own safety never directly reuse these path definitions in tests\n" - + " const val PATH_DELETE_ORDER: String = \"/store/order/{orderId}\"\n" - + " const val PATH_GET_INVENTORY: String = \"/store/inventory\"\n" - + " const val PATH_GET_ORDER_BY_ID: String = \"/store/order/{orderId}\"\n" - + " const val PATH_PLACE_ORDER: String = \"/store/order\"\n" - + " }" - ); - assertFileNotContains( - path, - "suspend" - ); - } - - @Test - public void generateHttpInterfaceReactiveWithCoroutinesResponseEntity() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, true); - codegen.additionalProperties().put(DECLARATIVE_INTERFACE_REACTIVE_MODE, "coroutines"); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, true); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - " suspend fun getInventory(\n" - + " ): ResponseEntity>", - " suspend fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): ResponseEntity", - " suspend fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): ResponseEntity" + public void generateSerializableModel() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.SERIALIZABLE_MODEL, true + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "false", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/model/Pet.kt"), + List.of("import java.io.Serializable", + ") : Serializable {", + "private const val serialVersionUID: kotlin.Long = 1") + ) ); } @Test - public void generateHttpInterfaceReactiveWithReactor() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, true); - codegen.additionalProperties().put(DECLARATIVE_INTERFACE_REACTIVE_MODE, "reactor"); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, false); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - "import reactor.core.publisher.Flux\n" - + "import reactor.core.publisher.Mono", - " fun getInventory(\n" - + " ): Mono>", - " fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): Mono", - " fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): Mono" - ); - assertFileNotContains( - path, - "suspend" + public void generateSerializableModelWithXimplements() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml", Map.of( + CodegenConstants.SERIALIZABLE_MODEL, true + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "false", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/model/Dog.kt"), + List.of("import java.io.Serializable", + "@get:JsonProperty(\"likesFetch\", required = true) override val likesFetch: kotlin.Boolean,", + ") : Pet, Serializable, com.some.pack.Fetchable {", + "private const val serialVersionUID: kotlin.Long = 1") + ) ); } @Test - public void generateHttpInterfaceReactiveWithCoroutines() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, true); - codegen.additionalProperties().put(DECLARATIVE_INTERFACE_REACTIVE_MODE, "coroutines"); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, false); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - " suspend fun getInventory(\n" - + " ): Map", - " suspend fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): Unit", - " suspend fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): Order" + public void generateHttpInterfaceReactiveWithReactorResponseEntity() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, true, + DECLARATIVE_INTERFACE_REACTIVE_MODE, "reactor", + USE_RESPONSE_ENTITY, true, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path storeApiClient = apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); + assertGeneratedFilesContain( + Map.of( + storeApiClient, + List.of( + "import reactor.core.publisher.Flux\n" + + "import reactor.core.publisher.Mono", + " @HttpExchange(\n" + + " url = PATH_GET_INVENTORY /* \"/store/inventory\" */,\n" + + " method = \"GET\"\n" + + " )\n" + + " fun getInventory(\n" + + " ): Mono>>", + " @HttpExchange(\n" + + " url = PATH_DELETE_ORDER /* \"/store/order/{orderId}\" */,\n" + + " method = \"DELETE\"\n" + + " )\n" + + " fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): Mono>", + " @HttpExchange(\n" + + " url = PATH_PLACE_ORDER /* \"/store/order\" */,\n" + + " method = \"POST\"\n" + + " )\n" + + " fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): Mono>", + " companion object {\n" + + " //for your own safety never directly reuse these path definitions in tests\n" + + " const val PATH_DELETE_ORDER: String = \"/store/order/{orderId}\"\n" + + " const val PATH_GET_INVENTORY: String = \"/store/inventory\"\n" + + " const val PATH_GET_ORDER_BY_ID: String = \"/store/order/{orderId}\"\n" + + " const val PATH_PLACE_ORDER: String = \"/store/order\"\n" + + " }") + ) ); + assertGeneratedFilesNotContain( + Map.of(storeApiClient, List.of("suspend"))); } @Test - public void generateHttpInterfaceResponseEntity() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, false); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, true); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - " fun getInventory(\n" - + " ): ResponseEntity>", - " fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): ResponseEntity", - " fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): ResponseEntity" - ); - assertFileNotContains( - path, - "suspend" + public void generateHttpInterfaceReactiveWithCoroutinesResponseEntity() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, true, + DECLARATIVE_INTERFACE_REACTIVE_MODE, "coroutines", + USE_RESPONSE_ENTITY, true, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"), + List.of(" suspend fun getInventory(\n" + + " ): ResponseEntity>", + " suspend fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): ResponseEntity", + " suspend fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): ResponseEntity") + ) ); } @Test - public void generateHttpInterface() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, false); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, false); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "api_interface"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - "@HttpExchange(\n" - + "\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\"\n" - + ")", - " fun getInventory(\n" - + " ): Map", - " fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): Unit", - " fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): Order" - ); - assertFileNotContains( - path, - "suspend" + public void generateHttpInterfaceReactiveWithReactor() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, true, + DECLARATIVE_INTERFACE_REACTIVE_MODE, "reactor", + USE_RESPONSE_ENTITY, false, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path storeApiClient = apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); + assertGeneratedFilesContain( + Map.of( + storeApiClient, + List.of("import reactor.core.publisher.Flux\n" + + "import reactor.core.publisher.Mono", + " fun getInventory(\n" + + " ): Mono>", + " fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): Mono", + " fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): Mono") + ) ); + assertGeneratedFilesNotContain( + Map.of(storeApiClient, List.of("suspend"))); } @Test - public void generateNonSerializableModelWithXimplements() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Dog.kt"); - assertFileContains( - path, - "@get:JsonProperty(\"likesFetch\", required = true) override val likesFetch: kotlin.Boolean,", - ") : Pet, com.some.pack.Fetchable {" - ); - assertFileNotContains( - path, - "import java.io.Serializable", - ") : Pet, Serializable, com.some.pack.Fetchable {", - ") : Pet, Serializable {", - "private const val serialVersionUID: kotlin.Long = 1" + public void generateHttpInterfaceReactiveWithCoroutines() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, true, + DECLARATIVE_INTERFACE_REACTIVE_MODE, "coroutines", + USE_RESPONSE_ENTITY, false, + REQUEST_MAPPING_OPTION, "api_interface", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"), + List.of("@HttpExchange(\n" + + "\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\"\n" + + ")", + " suspend fun getInventory(\n" + + " ): Map", + " suspend fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): Unit", + " suspend fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): Order") + ) ); } - private Path generateApiSources( - Map additionalProperties, - Map generatorPropertyDefaults - ) throws Exception { - File outputDir = Files.createTempDirectory("test").toFile().getCanonicalFile(); - outputDir.deleteOnExit(); - String outputPath = outputDir.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(outputDir.getAbsolutePath()); - codegen.additionalProperties().putAll(additionalProperties); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - for (var entry : generatorPropertyDefaults.entrySet()) { - generator.setGeneratorPropertyDefault(entry.getKey(), entry.getValue()); - } - generator.opts(input).generate(); - - return Paths.get(outputPath); + @Test + public void generateHttpInterfaceResponseEntity() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, false, + USE_RESPONSE_ENTITY, true, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path storeApiClient = apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); + assertGeneratedFilesContain( + Map.of( + storeApiClient, + List.of(" fun getInventory(\n" + + " ): ResponseEntity>", + " fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): ResponseEntity", + " fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): ResponseEntity") + ) + ); + assertGeneratedFilesNotContain(Map.of(storeApiClient, List.of("suspend"))); } - private void verifyGeneratedFilesContain(Map> expectedSnippetsByPathsToFiles) { - for (var expectedSnippetsByPathToFile : expectedSnippetsByPathsToFiles.entrySet()) { - assertFileContains(expectedSnippetsByPathToFile.getKey(), expectedSnippetsByPathToFile.getValue().toArray(new String[0])); - } + @Test + public void generateHttpInterface() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, false, + USE_RESPONSE_ENTITY, false, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path storeApiClient = apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); + assertGeneratedFilesContain( + Map.of( + storeApiClient, List.of( + " fun getInventory(\n" + + " ): Map", + " fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): Unit", + " fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): Order") + ) + ); + assertGeneratedFilesNotContain(Map.of(storeApiClient, List.of("suspend"))); } - private void verifyGeneratedFilesNotContain(Map> unexpectedSnippetsByPathsToFiles) { - for (var unexpectedSnippetsByPathToFile : unexpectedSnippetsByPathsToFiles.entrySet()) { - assertFileNotContains(unexpectedSnippetsByPathToFile.getKey(), unexpectedSnippetsByPathToFile.getValue().toArray(new String[0])); - } + @Test + public void generateNonSerializableModelWithXimplements() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml", Map.of(), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "false", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path dogDto = apiSources.resolve("src/main/kotlin/org/openapitools/model/Dog.kt"); + assertGeneratedFilesContain( + Map.of( + dogDto, List.of( + "@get:JsonProperty(\"likesFetch\", required = true) override val likesFetch: kotlin.Boolean,", + ") : Pet, com.some.pack.Fetchable {") + ) + ); + assertGeneratedFilesNotContain( + Map.of( + dogDto, List.of( + "import java.io.Serializable", + ") : Pet, Serializable, com.some.pack.Fetchable {", + ") : Pet, Serializable {", + "private const val serialVersionUID: kotlin.Long = 1") + ) + ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1420,9 +988,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1432,15 +1000,15 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDeleg + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(@Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange)") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1454,9 +1022,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDele CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1466,15 +1034,15 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDele + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(@ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1488,9 +1056,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1500,15 +1068,15 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1522,9 +1090,9 @@ public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -1532,15 +1100,15 @@ public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDeleg "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1554,9 +1122,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDe CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1566,15 +1134,15 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDe + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(@Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1588,9 +1156,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoD CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1600,15 +1168,15 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoD + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1622,9 +1190,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1634,15 +1202,15 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg + " @PathVariable(\"petId\") petId: kotlin.Long," + " request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1656,9 +1224,9 @@ public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDe CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -1666,15 +1234,15 @@ public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDe "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1688,9 +1256,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelega CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1700,15 +1268,15 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelega + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1722,9 +1290,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1734,15 +1302,15 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDeleg + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1756,9 +1324,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate( CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1768,15 +1336,15 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate( + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1790,9 +1358,9 @@ public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelega CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -1800,15 +1368,15 @@ public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelega "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1822,9 +1390,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDel CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1834,15 +1402,15 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDel + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1856,9 +1424,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDe CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1868,15 +1436,15 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDe + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1890,9 +1458,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelega CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1902,15 +1470,15 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelega + " @PathVariable(\"petId\") petId: kotlin.Long," + " request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegateWithApiTests() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegateWithApiTests() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1925,9 +1493,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg CodegenConstants.API_TESTS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1937,12 +1505,12 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg + " @PathVariable(\"petId\") petId: kotlin.Long," + " request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/test/kotlin/org/openapitools/api/PetApiTest.kt"), List.of( + apiSources.resolve("src/test/kotlin/org/openapitools/api/PetApiTest.kt"), List.of( "val request: javax.servlet.http.HttpServletRequest = TODO()", "api.deletePet(petId, apiKey, request)"), - root.resolve("src/test/kotlin/org/openapitools/api/UserApiTest.kt"), List.of( + apiSources.resolve("src/test/kotlin/org/openapitools/api/UserApiTest.kt"), List.of( "val request: javax.servlet.http.HttpServletRequest = TODO()", "api.logoutUser(request)") ) @@ -1950,8 +1518,8 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegateWithApiTests() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegateWithApiTests() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1966,9 +1534,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate CodegenConstants.API_TESTS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1978,12 +1546,12 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange)"), - root.resolve("src/test/kotlin/org/openapitools/api/PetApiTest.kt"), List.of( + apiSources.resolve("src/test/kotlin/org/openapitools/api/PetApiTest.kt"), List.of( "val exchange: org.springframework.web.server.ServerWebExchange = TODO()", "api.deletePet(petId, apiKey, exchange)"), - root.resolve("src/test/kotlin/org/openapitools/api/UserApiTest.kt"), List.of( + apiSources.resolve("src/test/kotlin/org/openapitools/api/UserApiTest.kt"), List.of( "val exchange: org.springframework.web.server.ServerWebExchange = TODO()", "api.logoutUser(exchange)") ) @@ -1991,8 +1559,8 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate } @Test - public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2006,9 +1574,9 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDel CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2016,15 +1584,15 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDel "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2038,9 +1606,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegat CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2050,20 +1618,20 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegat + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2077,9 +1645,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delega CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2089,20 +1657,20 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delega + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2116,9 +1684,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2128,20 +1696,20 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2155,9 +1723,9 @@ public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegat CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2165,20 +1733,20 @@ public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegat "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "apiKey: kotlin.String?): ResponseEntity", "petId: kotlin.Long): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "(): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2192,9 +1760,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerDele CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2204,20 +1772,20 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerDele + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2231,9 +1799,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1Del CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2243,20 +1811,20 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1Del + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2270,9 +1838,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneDelegat CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "fun deletePet(\n" + " @PathVariable(\"petId\") petId: kotlin.Long,\n" + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?,\n" @@ -2282,20 +1850,20 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneDelegat + " @PathVariable(\"petId\") petId: kotlin.Long,\n" + " request: javax.servlet.http.HttpServletRequest\n" + " ): ResponseEntity {"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2309,9 +1877,9 @@ public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneDele CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2319,20 +1887,20 @@ public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneDele "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "apiKey: kotlin.String?): ResponseEntity", "petId: kotlin.Long): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "(): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2346,9 +1914,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2358,20 +1926,20 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2385,9 +1953,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegat CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2397,20 +1965,20 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegat + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2424,9 +1992,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2436,20 +2004,20 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2463,9 +2031,9 @@ public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2473,20 +2041,20 @@ public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "apiKey: kotlin.String?): ResponseEntity", "petId: kotlin.Long): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "(): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2500,9 +2068,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2512,20 +2080,20 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDeleg + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2539,9 +2107,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Dele CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2551,20 +2119,20 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Dele + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2578,9 +2146,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2590,20 +2158,20 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate + " @PathVariable(\"petId\") petId: kotlin.Long," + " request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2617,9 +2185,9 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2627,12 +2195,12 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDeleg "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "apiKey: kotlin.String?): ResponseEntity", "petId: kotlin.Long): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "(): ResponseEntity") ) ); @@ -2640,20 +2208,21 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDeleg @Test public void reactiveWithoutResponseEntity() throws Exception { - Path root = generateApiSources(Map.of( - KotlinSpringServerCodegen.REACTIVE, true, - KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", - KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", - KotlinSpringServerCodegen.INTERFACE_ONLY, true, - KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, false - ), Map.of( - CodegenConstants.MODELS, "false", - CodegenConstants.MODEL_TESTS, "false", - CodegenConstants.MODEL_DOCS, "false", - CodegenConstants.APIS, "true", - CodegenConstants.SUPPORTING_FILES, "false" - )); - verifyGeneratedFilesContain( + Path root = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, false + ), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "@ResponseStatus(HttpStatus.BAD_REQUEST)", @@ -2678,20 +2247,21 @@ public void reactiveWithoutResponseEntity() throws Exception { @Test public void nonReactiveWithoutResponseEntity() throws Exception { - Path root = generateApiSources(Map.of( - KotlinSpringServerCodegen.REACTIVE, false, - KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", - KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", - KotlinSpringServerCodegen.INTERFACE_ONLY, true, - KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, false - ), Map.of( - CodegenConstants.MODELS, "false", - CodegenConstants.MODEL_TESTS, "false", - CodegenConstants.MODEL_DOCS, "false", - CodegenConstants.APIS, "true", - CodegenConstants.SUPPORTING_FILES, "false" - )); - verifyGeneratedFilesContain( + Path root = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, false, + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, false + ), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "@ResponseStatus(HttpStatus.BAD_REQUEST)", @@ -2713,7 +2283,7 @@ public void nonReactiveWithoutResponseEntity() throws Exception { ) ); - verifyGeneratedFilesNotContain( + assertGeneratedFilesNotContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("suspend"), root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of("suspend"), @@ -2724,20 +2294,22 @@ public void nonReactiveWithoutResponseEntity() throws Exception { @Test public void reactiveWithResponseEntity() throws Exception { - Path root = generateApiSources(Map.of( - KotlinSpringServerCodegen.REACTIVE, true, - KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", - KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", - KotlinSpringServerCodegen.INTERFACE_ONLY, true, - KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, true - ), Map.of( - CodegenConstants.MODELS, "false", - CodegenConstants.MODEL_TESTS, "false", - CodegenConstants.MODEL_DOCS, "false", - CodegenConstants.APIS, "true", - CodegenConstants.SUPPORTING_FILES, "false" - )); - verifyGeneratedFilesContain( + Path root = generateApiSources( + "src/test/resources/3_0/kotlin/petstore.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, true + ), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "suspend fun deletePet(" @@ -2755,7 +2327,7 @@ public void reactiveWithResponseEntity() throws Exception { ) ); - verifyGeneratedFilesNotContain( + assertGeneratedFilesNotContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("@ResponseStatus(HttpStatus."), root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of("@ResponseStatus(HttpStatus."), @@ -2766,7 +2338,7 @@ public void reactiveWithResponseEntity() throws Exception { @Test public void nonReactiveWithResponseEntity() throws Exception { - Path root = generateApiSources(Map.of( + Path root = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", @@ -2779,7 +2351,7 @@ public void nonReactiveWithResponseEntity() throws Exception { CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "fun deletePet(" @@ -2790,14 +2362,14 @@ public void nonReactiveWithResponseEntity() throws Exception { + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( - "fun logoutUser(): ResponseEntity" + "fun logoutUser(): ResponseEntity" ), root.resolve("src/main/kotlin/org/openapitools/api/StoreApi.kt"), List.of( "fun getInventory(): ResponseEntity>") ) ); - verifyGeneratedFilesNotContain( + assertGeneratedFilesNotContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("suspend", "@ResponseStatus(HttpStatus."), root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of("suspend", "@ResponseStatus(HttpStatus."), @@ -2807,283 +2379,261 @@ public void nonReactiveWithResponseEntity() throws Exception { } @Test - public void reactiveWithoutFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void reactiveWithoutFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, false, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); } @Test - public void reactiveWithFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void reactiveWithFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "List"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); } @Test - public void reactiveWithDefaultValueFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, true); - // should use default 'true' instead - // codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void reactiveWithDefaultValueFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "List"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); } @Test - public void nonReactiveWithoutFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, false); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void nonReactiveWithoutFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, false, + KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, false, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); } @Test - public void nonReactiveWithFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, false); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void nonReactiveWithFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, false, + KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); } @Test - public void testValidationsInQueryParams_issue21238_Controller() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml")) - .config(codegen) + public void testValidationsInQueryParams_issue21238_Controller() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml", + Map.of(), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/PetApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/UserApiController.kt") ); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"), - "@NotNull", "@Valid"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/UserApiController.kt"), - "@NotNull", "@Valid", - "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")", - "@Parameter(description = \"The user name for login\", required = true)", - "@Parameter(description = \"The password for login in clear text\", required = true)"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("@NotNull", "@Valid"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + "@NotNull", + "@Valid", + "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")", + "@Parameter(description = \"The user name for login\", required = true)", + "@Parameter(description = \"The password for login in clear text\", required = true)" + ) + )); } @Test - public void testValidationsInQueryParams_issue21238_Api_Delegate() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + public void testValidationsInQueryParams_issue21238_Api_Delegate() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml", + Map.of(KotlinSpringServerCodegen.DELEGATE_PATTERN, true), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + ) + ); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("@NotNull", "@Valid"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + "@NotNull", + "@Valid", + "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")" + ) + )); + } + + private Path generateApiSources( + String specFilePath, + Map additionalProperties, + Map generatorPropertyDefaults + ) { + File outputDir; + try { + outputDir = Files.createTempDirectory("test").toFile().getCanonicalFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + outputDir.deleteOnExit(); + String outputPath = outputDir.getAbsolutePath().replace('\\', '/'); + KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); + codegen.setOutputDir(outputDir.getAbsolutePath()); + codegen.additionalProperties().putAll(additionalProperties); - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml")) - .config(codegen) - ) - .generate(); + ClientOptInput input = new ClientOptInput() + .openAPI(TestUtils.parseSpec(specFilePath)) + .config(codegen); - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/PetApi.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/UserApi.kt") - ); + DefaultGenerator generator = new DefaultGenerator(); + for (var entry : generatorPropertyDefaults.entrySet()) { + generator.setGeneratorPropertyDefault(entry.getKey(), entry.getValue()); + } + generator.opts(input).generate(); + + return Paths.get(outputPath); + } + + private static void assertGeneratedFilesContain(Map> expectedSnippetsByPathsToFiles) { + for (var expectedSnippetsByPathToFile : expectedSnippetsByPathsToFiles.entrySet()) { + assertFileContains(expectedSnippetsByPathToFile.getKey(), expectedSnippetsByPathToFile.getValue().toArray(new String[0])); + } + } + + private static void assertGeneratedFilesNotContain(Map> unexpectedSnippetsByPathsToFiles) { + for (var unexpectedSnippetsByPathToFile : unexpectedSnippetsByPathsToFiles.entrySet()) { + assertFileNotContains(unexpectedSnippetsByPathToFile.getKey(), unexpectedSnippetsByPathToFile.getValue().toArray(new String[0])); + } + } - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"), - "@NotNull", "@Valid"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/UserApi.kt"), - "@NotNull", "@Valid", "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")"); + private static void assertGeneratedFilesExist(List files) { + for (Path file : files) { + Assertions.assertThat(Files.exists(file)) + .withFailMessage("Expected file %s to exist but was not found", file.toAbsolutePath()) + .isTrue(); + } } @DataProvider From a86a9f19f3c083dfc47281670468c5a1e9e96dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 14:56:30 +0100 Subject: [PATCH 11/26] add unit test --- .../org/openapitools/codegen/TestUtils.java | 2 +- .../spring/KotlinSpringServerCodegenTest.java | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/TestUtils.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/TestUtils.java index b0b0396a2ab9..5068672415f2 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/TestUtils.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/TestUtils.java @@ -208,7 +208,7 @@ public static void assertFileNotContains(Path path, String... lines) { String file = linearize(generatedFile); assertNotNull(file); for (String line : lines) - assertFalse(file.contains(linearize(line))); + assertFalse(file.contains(linearize(line)), "File '" + path + "' contains line [" + line + "] when it should not"); } public static void assertFileNotExists(Path path) { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index c3895a6acde3..115465eb653a 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -2585,6 +2585,60 @@ public void testValidationsInQueryParams_issue21238_Api_Delegate() { )); } + + @Test + public void testDollarsAndQuotesSwagger1() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", + Map.of( + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springfox", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger1", + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + ) + ); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), + List.of("value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@PathVariable(\"item\\$Id\")", + "@PathVariable(\"item\\$SubId\")", + "@RequestParam(value = \"filter\\$Type\"", + "@RequestParam(value = \"filter\\$SubType\"", + "@CookieValue(name = \"session\\$Token\"", + "@CookieValue(name = \"session\\$TokenTwo\"", + "@RequestParam(value = \"form\\$Name\"", + "@RequestParam(value = \"form\\$Value\"", + "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item\\$Id}/something/{item\\$SubId}\"", + "/* \"/items/{item$Id}/something/{item$SubId}\" */" + ) + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "@PathVariable(\"item$Id\")", + "@PathVariable(\"item$SubId\")", + "@RequestParam(value = \"filter$Type\"", + "@RequestParam(value = \"filter$SubType\"", + "@CookieValue(name = \"session$Token\"", + "@CookieValue(name = \"session$TokenTwo\"", + "@RequestParam(value = \"form$Name\"", + "@RequestParam(value = \"form$Value\"", + "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item$Id}/something/{item$SubId}\"", + "/* \"/items/{item\\$Id}/something/{item\\$SubId}\" */" + ) + )); + } + private Path generateApiSources( String specFilePath, Map additionalProperties, From 5485eabeac87bec9fd44165f7de2798ff8a1acbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 15:13:48 +0100 Subject: [PATCH 12/26] improve unit test --- .../spring/KotlinSpringServerCodegenTest.java | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index 115465eb653a..60eb44e42600 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -2616,7 +2616,25 @@ public void testDollarsAndQuotesSwagger1() { "@RequestParam(value = \"form\\$Value\"", "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item\\$Id}/something/{item\\$SubId}\"", "/* \"/items/{item$Id}/something/{item$SubId}\" */" - ) + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"details\\$Info\")", + "@param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "@param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "* SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "* @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "* @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + ) )); assertGeneratedFilesNotContain(Map.of( apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), @@ -2635,7 +2653,26 @@ public void testDollarsAndQuotesSwagger1() { "@RequestParam(value = \"form$Value\"", "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item$Id}/something/{item$SubId}\"", "/* \"/items/{item\\$Id}/something/{item\\$SubId}\" */" - ) + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "item$Id", + "name$Value", + "details$Info" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "\"$id\"", + "\"$name\"" + ) )); } From b89a2f1097f06f44bf770210fc571181bfa8d8a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 15:47:16 +0100 Subject: [PATCH 13/26] add dollar escaping for multiline strings --- .../languages/AbstractKotlinCodegen.java | 3 +- .../main/resources/kotlin-spring/api.mustache | 2 +- .../kotlin-spring/apiInterface.mustache | 2 +- .../spring/KotlinSpringServerCodegenTest.java | 89 +++++++++++++++++++ 4 files changed, 93 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java index 09b03e1a1f95..5e024d05f71e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java @@ -1131,7 +1131,8 @@ protected void updateModelForObject(CodegenModel m, Schema schema) { @Override protected ImmutableMap.Builder addMustacheLambdas() { return super.addMustacheLambdas() - .put("escapeDollar", new EscapeChar("(? additionalProperties, From d2e3ba1bfe91809ba5f6cbff0668abd9e50bc173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 15:52:51 +0100 Subject: [PATCH 14/26] add dollar escaping for multiline strings and test --- .../spring/KotlinSpringServerCodegenTest.java | 69 +++++++++---------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index 3f8c120cdff2..d28873bb0148 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -2725,44 +2725,37 @@ public void testDollarsAndQuotesSwagger2() { "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"" ) )); -// assertGeneratedFilesNotContain(Map.of( -// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some", -// "@PathVariable(\"item$Id\")", -// "@PathVariable(\"item$SubId\")", -// "@RequestParam(value = \"filter$Type\"", -// "@RequestParam(value = \"filter$SubType\"", -// "@CookieValue(name = \"session$Token\"", -// "@CookieValue(name = \"session$TokenTwo\"", -// "@RequestParam(value = \"form$Name\"", -// "@RequestParam(value = \"form$Value\"", -// "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item$Id}/something/{item$SubId}\"", -// "/* \"/items/{item\\$Id}/something/{item\\$SubId}\" */" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some", -// "item$Id", -// "name$Value", -// "details$Info" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some", -// "\"$id\"", -// "\"$name\"" -// ) -// )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "@PathVariable(\"item$Id\") itemDollarId: kotlin.String", + "@PathVariable(\"item$SubId\") itemDollarSubId: kotlin.String", + "@RequestParam(value = \"filter$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarType: kotlin.String", + "@RequestParam(value = \"filter$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarSubType: kotlin.String", + "@CookieValue(name = \"session$Token\"", + "@CookieValue(name = \"session$TokenTwo\"" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some", + "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some" + ) + )); } private Path generateApiSources( From 9622dddeaa89c29e60e11519f93378e9002026fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 16:19:10 +0100 Subject: [PATCH 15/26] add more compilation tests and extend some current compilations to also test for the dollar issue --- .../samples-kotlin-server-jdk17.yaml | 2 + ...n-spring-boot-3-dollar-issue-swagger2.yaml | 14 + ...lin-spring-boot-dollar-issue-swagger1.yaml | 13 + ...arative-interface-reactive-coroutines.yaml | 2 +- ...ve-interface-reactive-reactor-wrapped.yaml | 2 +- ...-spring-declarative-interface-wrapped.yaml | 2 +- .../kotlin-spring-declarative-interface.yaml | 2 +- .../3_0/kotlin/petstore-with-tags.yaml | 6 +- .../resources/3_0/petstore-with-dollars.yaml | 885 ++++++++++++++ .../.openapi-generator/FILES | 4 + .../org/openapitools/api/DefaultApiClient.kt | 63 + .../ItemWithDollarAttributesAndExamples.kt | 36 + ...sItemIdSomethingItemSubIdGet200Response.kt | 42 + ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 + .../.openapi-generator/FILES | 4 + .../org/openapitools/api/DefaultApiClient.kt | 65 + .../ItemWithDollarAttributesAndExamples.kt | 36 + ...sItemIdSomethingItemSubIdGet200Response.kt | 42 + ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 + .../.openapi-generator/FILES | 4 + .../org/openapitools/api/DefaultApiClient.kt | 63 + .../ItemWithDollarAttributesAndExamples.kt | 36 + ...sItemIdSomethingItemSubIdGet200Response.kt | 42 + ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 + .../.openapi-generator/FILES | 4 + .../org/openapitools/api/DefaultApiClient.kt | 63 + .../ItemWithDollarAttributesAndExamples.kt | 36 + ...sItemIdSomethingItemSubIdGet200Response.kt | 42 + ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 + .../.openapi-generator-ignore | 23 + .../.openapi-generator/FILES | 40 + .../.openapi-generator/VERSION | 1 + .../README.md | 21 + .../build.gradle.kts | 43 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../gradlew | 249 ++++ .../gradlew.bat | 92 ++ .../pom.xml | 149 +++ .../settings.gradle | 15 + .../kotlin/org/openapitools/Application.kt | 13 + .../kotlin/org/openapitools/HomeController.kt | 12 + .../openapitools/SpringDocConfiguration.kt | 42 + .../kotlin/org/openapitools/api/ApiUtil.kt | 19 + .../kotlin/org/openapitools/api/Exceptions.kt | 30 + .../openapitools/api/ItemsApiController.kt | 87 ++ .../org/openapitools/api/ItemsApiService.kt | 36 + .../openapitools/api/ItemsApiServiceImpl.kt | 16 + .../org/openapitools/api/PetApiController.kt | 253 ++++ .../org/openapitools/api/PetApiService.kt | 114 ++ .../org/openapitools/api/PetApiServiceImpl.kt | 48 + .../openapitools/api/StoreApiController.kt | 116 ++ .../org/openapitools/api/StoreApiService.kt | 48 + .../openapitools/api/StoreApiServiceImpl.kt | 23 + .../org/openapitools/api/UserApiController.kt | 205 ++++ .../org/openapitools/api/UserApiService.kt | 95 ++ .../openapitools/api/UserApiServiceImpl.kt | 43 + .../kotlin/org/openapitools/model/Category.kt | 36 + .../ItemWithDollarAttributesAndExamples.kt | 36 + ...sItemIdSomethingItemSubIdGet200Response.kt | 42 + ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 + .../openapitools/model/ModelApiResponse.kt | 40 + .../kotlin/org/openapitools/model/Order.kt | 74 ++ .../main/kotlin/org/openapitools/model/Pet.kt | 78 ++ .../main/kotlin/org/openapitools/model/Tag.kt | 36 + .../kotlin/org/openapitools/model/User.kt | 60 + .../src/main/resources/application.yaml | 10 + .../src/main/resources/openapi.yaml | 1060 +++++++++++++++++ .../org/openapitools/api/ItemsApiTest.kt | 51 + .../kotlin/org/openapitools/api/PetApiTest.kt | 169 +++ .../org/openapitools/api/StoreApiTest.kt | 70 ++ .../org/openapitools/api/UserApiTest.kt | 146 +++ .../.openapi-generator-ignore | 23 + .../.openapi-generator/FILES | 36 + .../.openapi-generator/VERSION | 1 + .../README.md | 21 + .../build.gradle.kts | 49 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../gradlew | 249 ++++ .../gradlew.bat | 92 ++ .../pom.xml | 138 +++ .../settings.gradle | 15 + .../kotlin/org/openapitools/Application.kt | 13 + .../kotlin/org/openapitools/HomeController.kt | 12 + .../openapitools/SpringFoxConfiguration.kt | 64 + .../kotlin/org/openapitools/api/ApiUtil.kt | 19 + .../kotlin/org/openapitools/api/Exceptions.kt | 30 + .../openapitools/api/ItemsApiController.kt | 92 ++ .../org/openapitools/api/ItemsApiService.kt | 36 + .../openapitools/api/ItemsApiServiceImpl.kt | 16 + .../org/openapitools/api/PetApiController.kt | 258 ++++ .../org/openapitools/api/PetApiService.kt | 114 ++ .../org/openapitools/api/PetApiServiceImpl.kt | 48 + .../openapitools/api/StoreApiController.kt | 119 ++ .../org/openapitools/api/StoreApiService.kt | 48 + .../openapitools/api/StoreApiServiceImpl.kt | 23 + .../org/openapitools/api/UserApiController.kt | 205 ++++ .../org/openapitools/api/UserApiService.kt | 95 ++ .../openapitools/api/UserApiServiceImpl.kt | 43 + .../kotlin/org/openapitools/model/Category.kt | 36 + .../ItemWithDollarAttributesAndExamples.kt | 36 + ...sItemIdSomethingItemSubIdGet200Response.kt | 42 + ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 + .../openapitools/model/ModelApiResponse.kt | 40 + .../kotlin/org/openapitools/model/Order.kt | 74 ++ .../main/kotlin/org/openapitools/model/Pet.kt | 78 ++ .../main/kotlin/org/openapitools/model/Tag.kt | 36 + .../kotlin/org/openapitools/model/User.kt | 60 + .../src/main/resources/application.yaml | 10 + .../src/main/resources/openapi.yaml | 1060 +++++++++++++++++ .../org/openapitools/api/ItemsApiTest.kt | 51 + .../kotlin/org/openapitools/api/PetApiTest.kt | 169 +++ .../org/openapitools/api/StoreApiTest.kt | 70 ++ .../org/openapitools/api/UserApiTest.kt | 146 +++ 115 files changed, 9240 insertions(+), 8 deletions(-) create mode 100644 bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2.yaml create mode 100644 bin/configs/kotlin-spring-boot-dollar-issue-swagger1.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator-ignore create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/VERSION create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/README.md create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/build.gradle.kts create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.properties create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew.bat create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/pom.xml create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/settings.gradle create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/Application.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/HomeController.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ApiUtil.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/Exceptions.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Category.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Order.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Pet.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Tag.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/User.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/application.yaml create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/openapi.yaml create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/PetApiTest.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/StoreApiTest.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/UserApiTest.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator-ignore create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/FILES create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/VERSION create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/README.md create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/build.gradle.kts create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.properties create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew.bat create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/pom.xml create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/settings.gradle create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/Application.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/HomeController.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ApiUtil.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/Exceptions.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Category.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Order.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Pet.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Tag.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/User.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/application.yaml create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/openapi.yaml create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/PetApiTest.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/StoreApiTest.kt create mode 100644 samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/UserApiTest.kt diff --git a/.github/workflows/samples-kotlin-server-jdk17.yaml b/.github/workflows/samples-kotlin-server-jdk17.yaml index 999e2f4d817b..589afe3abb27 100644 --- a/.github/workflows/samples-kotlin-server-jdk17.yaml +++ b/.github/workflows/samples-kotlin-server-jdk17.yaml @@ -37,6 +37,8 @@ jobs: - samples/server/petstore/kotlin-server-required-and-nullable-properties - samples/server/petstore/kotlin-springboot-3 - samples/server/petstore/kotlin-springboot-3-no-response-entity + - samples/server/petstore/kotlin-springboot-dollar-issue-swagger1 + - samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2 - samples/server/petstore/kotlin-springboot-additionalproperties - samples/server/petstore/kotlin-springboot-delegate-nodefaults - samples/server/petstore/kotlin-springboot-request-cookie diff --git a/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2.yaml b/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2.yaml new file mode 100644 index 000000000000..daa8216e4a43 --- /dev/null +++ b/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2.yaml @@ -0,0 +1,14 @@ +generatorName: kotlin-spring +outputDir: samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2 +library: spring-boot +inputSpec: modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +templateDir: modules/openapi-generator/src/main/resources/kotlin-spring +additionalProperties: + documentationProvider: springDoc + annotationLibrary: swagger2 + useSwaggerUI: "false" + serviceImplementation: "true" + serializableModel: "true" + beanValidations: "true" + useSpringBoot3: "true" + requestMappingMode: api_interface diff --git a/bin/configs/kotlin-spring-boot-dollar-issue-swagger1.yaml b/bin/configs/kotlin-spring-boot-dollar-issue-swagger1.yaml new file mode 100644 index 000000000000..25aa6b750647 --- /dev/null +++ b/bin/configs/kotlin-spring-boot-dollar-issue-swagger1.yaml @@ -0,0 +1,13 @@ +generatorName: kotlin-spring +outputDir: samples/server/petstore/kotlin-springboot-dollar-issue-swagger1 +library: spring-boot +inputSpec: modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +templateDir: modules/openapi-generator/src/main/resources/kotlin-spring +additionalProperties: + documentationProvider: springFox + annotationLibrary: swagger1 + useSwaggerUI: "false" + serviceImplementation: "true" + serializableModel: "true" + beanValidations: "true" + requestMappingMode: api_interface diff --git a/bin/configs/kotlin-spring-declarative-interface-reactive-coroutines.yaml b/bin/configs/kotlin-spring-declarative-interface-reactive-coroutines.yaml index f5375f8f0fb7..30e6dc86712e 100644 --- a/bin/configs/kotlin-spring-declarative-interface-reactive-coroutines.yaml +++ b/bin/configs/kotlin-spring-declarative-interface-reactive-coroutines.yaml @@ -1,7 +1,7 @@ generatorName: kotlin-spring outputDir: samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines library: spring-declarative-http-interface -inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-spring additionalProperties: documentationProvider: springDoc diff --git a/bin/configs/kotlin-spring-declarative-interface-reactive-reactor-wrapped.yaml b/bin/configs/kotlin-spring-declarative-interface-reactive-reactor-wrapped.yaml index 0826f5059e33..e4dc0aba73e8 100644 --- a/bin/configs/kotlin-spring-declarative-interface-reactive-reactor-wrapped.yaml +++ b/bin/configs/kotlin-spring-declarative-interface-reactive-reactor-wrapped.yaml @@ -1,7 +1,7 @@ generatorName: kotlin-spring outputDir: samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped library: spring-declarative-http-interface -inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-spring additionalProperties: documentationProvider: springDoc diff --git a/bin/configs/kotlin-spring-declarative-interface-wrapped.yaml b/bin/configs/kotlin-spring-declarative-interface-wrapped.yaml index ce0d79f6e97b..5332cf5c0448 100644 --- a/bin/configs/kotlin-spring-declarative-interface-wrapped.yaml +++ b/bin/configs/kotlin-spring-declarative-interface-wrapped.yaml @@ -1,7 +1,7 @@ generatorName: kotlin-spring outputDir: samples/server/petstore/kotlin-spring-declarative-interface-wrapped library: spring-declarative-http-interface -inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-spring additionalProperties: documentationProvider: springDoc diff --git a/bin/configs/kotlin-spring-declarative-interface.yaml b/bin/configs/kotlin-spring-declarative-interface.yaml index da5c9c0a8854..b399470a5a2e 100644 --- a/bin/configs/kotlin-spring-declarative-interface.yaml +++ b/bin/configs/kotlin-spring-declarative-interface.yaml @@ -1,7 +1,7 @@ generatorName: kotlin-spring outputDir: samples/server/petstore/kotlin-spring-declarative-interface library: spring-declarative-http-interface -inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-spring additionalProperties: documentationProvider: springDoc diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml index 4463a410df2a..2e0b13e4c2d2 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml @@ -271,12 +271,11 @@ paths: additionalMetadata: type: string description: Additional data to pass to server - required: false image: type: string description: image to upload format: binary - required: true + required: [ image ] responses: 200: description: successful operation @@ -310,14 +309,13 @@ paths: additionalMetadata: type: string description: Additional data to pass to server - required: false images: type: array items: type: string description: image to upload format: binary - required: true + required: [ images ] responses: 200: description: successful operation diff --git a/modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml b/modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml new file mode 100644 index 000000000000..3aad06ee2656 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml @@ -0,0 +1,885 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: OpenAPI Petstore + license: + name: Apache-2.0 + url: 'https://www.apache.org/licenses/LICENSE-2.0.html' +tags: + - name: pet + description: Everything about your Pets + - name: store + description: Access to Petstore orders + - name: user + description: Operations about user +paths: + /pet: + post: + tags: + - pet + summary: Add a new pet to the store + description: '' + operationId: addPet + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '405': + description: Invalid input + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + $ref: '#/components/requestBodies/Pet' + put: + tags: + - pet + summary: Update an existing pet + description: '' + operationId: updatePet + externalDocs: + url: "http://petstore.swagger.io/v2/doc/updatePet" + description: "API documentation for the updatePet operation" + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid ID supplied + '404': + description: Pet not found + '405': + description: Validation exception + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + $ref: '#/components/requestBodies/Pet' + /pet/findByStatus: + get: + tags: + - pet + summary: Finds Pets by status + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - name: status + in: query + description: Status values that need to be considered for filter + required: true + style: form + explode: false + deprecated: true + schema: + type: array + items: + type: string + enum: + - available + - pending + - sold + default: available + responses: + '200': + description: successful operation + content: + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid status value + security: + - petstore_auth: + - 'read:pets' + /pet/findByTags: + get: + tags: + - pet + summary: Finds Pets by tags + description: >- + Multiple tags can be provided with comma separated strings. Use tag1, + tag2, tag3 for testing. + operationId: findPetsByTags + parameters: + - name: tags + in: query + description: Tags to filter by + required: true + style: form + explode: false + schema: + type: array + items: + type: string + responses: + '200': + description: successful operation + content: + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid tag value + security: + - petstore_auth: + - 'read:pets' + deprecated: true + '/pet/{petId}': + get: + tags: + - pet + summary: Find pet by ID + description: Returns a single pet + operationId: getPetById + parameters: + - name: petId + in: path + description: ID of pet to return + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid ID supplied + '404': + description: Pet not found + security: + - api_key: [] + post: + tags: + - pet + summary: Updates a pet in the store with form data + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + format: int64 + responses: + '405': + description: Invalid input + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + delete: + tags: + - pet + summary: Deletes a pet + description: '' + operationId: deletePet + parameters: + - name: api_key + in: header + required: false + schema: + type: string + - name: petId + in: path + description: Pet id to delete + required: true + schema: + type: integer + format: int64 + responses: + '400': + description: Invalid pet value + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + '/pet/{petId}/uploadImage': + post: + tags: + - pet + summary: uploads an image + description: '' + operationId: uploadFile + parameters: + - name: petId + in: path + description: ID of pet to update + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/ApiResponse' + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + file: + description: file to upload + type: string + format: binary + /store/inventory: + get: + tags: + - store + summary: Returns pet inventories by status + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + additionalProperties: + type: integer + format: int32 + security: + - api_key: [] + /store/order: + post: + tags: + - store + summary: Place an order for a pet + description: '' + operationId: placeOrder + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid Order + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Order' + description: order placed for purchasing the pet + required: true + '/store/order/{orderId}': + get: + tags: + - store + summary: Find purchase order by ID + description: >- + For valid response try integer IDs with value <= 5 or > 10. Other values + will generate exceptions + operationId: getOrderById + parameters: + - name: orderId + in: path + description: ID of pet that needs to be fetched + required: true + schema: + type: integer + format: int64 + minimum: 1 + maximum: 5 + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid ID supplied + '404': + description: Order not found + delete: + tags: + - store + summary: Delete purchase order by ID + description: >- + For valid response try integer IDs with value < 1000. Anything above + 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - name: orderId + in: path + description: ID of the order that needs to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid ID supplied + '404': + description: Order not found + /user: + post: + tags: + - user + summary: Create user + description: This can only be done by the logged in user. + operationId: createUser + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/User' + description: Created user object + required: true + /user/createWithArray: + post: + tags: + - user + summary: Creates list of users with given input array + description: '' + operationId: createUsersWithArrayInput + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + $ref: '#/components/requestBodies/UserArray' + /user/createWithList: + post: + tags: + - user + summary: Creates list of users with given input array + description: '' + operationId: createUsersWithListInput + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + $ref: '#/components/requestBodies/UserArray' + /user/login: + get: + tags: + - user + summary: Logs user into the system + description: '' + operationId: loginUser + parameters: + - name: username + in: query + description: The user name for login + required: true + schema: + type: string + pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$' + - name: password + in: query + description: The password for login in clear text + required: true + schema: + type: string + responses: + '200': + description: successful operation + headers: + Set-Cookie: + description: >- + Cookie authentication key for use with the `api_key` + apiKey authentication. + schema: + type: string + example: AUTH_KEY=abcde12345; Path=/; HttpOnly + X-Rate-Limit: + description: calls per hour allowed by the user + schema: + type: integer + format: int32 + X-Expires-After: + description: date in UTC when token expires + schema: + type: string + format: date-time + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + '400': + description: Invalid username/password supplied + /user/logout: + get: + tags: + - user + summary: Logs out current logged in user session + description: '' + operationId: logoutUser + responses: + default: + description: successful operation + security: + - api_key: [] + '/user/{username}': + get: + tags: + - user + summary: Get user by user name + description: '' + operationId: getUserByName + parameters: + - name: username + in: path + description: The name that needs to be fetched. Use user1 for testing. + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/User' + application/json: + schema: + $ref: '#/components/schemas/User' + '400': + description: Invalid username supplied + '404': + description: User not found + put: + tags: + - user + summary: Updated user + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - name: username + in: path + description: name that need to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid user supplied + '404': + description: User not found + security: + - api_key: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/User' + description: Updated user object + required: true + delete: + tags: + - user + summary: Delete user + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - name: username + in: path + description: The name that needs to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid username supplied + '404': + description: User not found + security: + - api_key: [] + /items/{item$Id}/something/{item$SubId}: + get: + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + parameters: + - name: "item$Id" + in: path + required: true + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "item$SubId" + in: path + required: true + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "filter$Type" + in: query + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + "default": "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "filter$SubType" + in: query + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + "default": 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "X-Custom_Header" + in: header + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "X-Custom_Header_two" + in: header + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "session$Token" + in: cookie + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "session$TokenTwo" + in: cookie + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + responses: + '200': + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + content: + application/json: + schema: + type: object + properties: + item$Id: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + name$Value: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + default: 'SQ = "; SBS = \; DBS = \\; SD = $some' + details$Info: + type: object + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + properties: + detail$One: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + detail$Two: + type: integer + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: 42 + /items: + post: + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + form$Name: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + form$Value: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + parameters: + - name: "X-Post_Header" + in: header + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + + responses: + "201": + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" +externalDocs: + description: Find out more about Swagger + url: 'http://swagger.io' +components: + requestBodies: + UserArray: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + description: List of user object + required: true + Pet: + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + description: Pet object that needs to be added to the store + required: true + securitySchemes: + petstore_auth: + type: oauth2 + flows: + implicit: + authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog' + scopes: + 'write:pets': modify pets in your account + 'read:pets': read your pets + api_key: + type: apiKey + name: api_key + in: header + schemas: + Order: + title: Pet Order + description: An order for a pets from the pet store + type: object + properties: + id: + type: integer + format: int64 + petId: + type: integer + format: int64 + quantity: + type: integer + format: int32 + shipDate: + type: string + format: date-time + status: + type: string + description: Order Status + enum: + - placed + - approved + - delivered + complete: + type: boolean + default: false + xml: + name: Order + Category: + title: Pet category + description: A category for a pet + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$' + xml: + name: Category + User: + title: a User + description: A User who is purchasing from the pet store + type: object + properties: + id: + type: integer + format: int64 + username: + type: string + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + phone: + type: string + userStatus: + type: integer + format: int32 + description: User Status + xml: + name: User + Tag: + title: Pet Tag + description: A tag for a pet + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + xml: + name: Tag + Pet: + title: a Pet + description: A pet for sale in the pet store + type: object + required: + - name + - photoUrls + properties: + id: + type: integer + format: int64 + category: + $ref: '#/components/schemas/Category' + name: + type: string + example: doggie + photoUrls: + type: array + xml: + name: photoUrl + wrapped: true + items: + type: string + tags: + type: array + xml: + name: tag + wrapped: true + items: + $ref: '#/components/schemas/Tag' + status: + type: string + description: pet status in the store + deprecated: true + enum: + - available + - pending + - sold + xml: + name: Pet + ApiResponse: + title: An uploaded response + description: Describes the result of uploading an image resource + type: object + properties: + code: + type: integer + format: int32 + type: + type: string + message: + type: string + ItemWithDollarAttributesAndExamples: + type: object + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + properties: + $id: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + $name: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" \ No newline at end of file diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/.openapi-generator/FILES b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/.openapi-generator/FILES index 18f6d4999914..7a299e837265 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/.openapi-generator/FILES @@ -6,10 +6,14 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/api/DefaultApiClient.kt src/main/kotlin/org/openapitools/api/PetApiClient.kt src/main/kotlin/org/openapitools/api/StoreApiClient.kt src/main/kotlin/org/openapitools/api/UserApiClient.kt src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt new file mode 100644 index 000000000000..037f95a5511f --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -0,0 +1,63 @@ +/** +* NOTE: Auto generated by OpenAPI Generator (7.18.0-SNAPSHOT) +* Spring 6 Declarative HTTP Interface +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* + +import org.springframework.web.service.annotation.* +import org.springframework.web.bind.annotation.* +import org.springframework.http.HttpStatus + +import org.springframework.validation.annotation.Validated +import jakarta.validation.Valid +import jakarta.validation.constraints.* + + +import kotlin.collections.List +import kotlin.collections.Map + +@Validated +interface DefaultApi { + + @ResponseStatus(HttpStatus.OK) + @HttpExchange( + url = PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */, + method = "GET" + ) + suspend fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ItemsItemIdSomethingItemSubIdGet200Response + + @ResponseStatus(HttpStatus.CREATED) + @HttpExchange( + url = PATH_ITEMS_POST /* "/items" */, + method = "POST" + ) + suspend fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ItemWithDollarAttributesAndExamples + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/.openapi-generator/FILES b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/.openapi-generator/FILES index 18f6d4999914..7a299e837265 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/.openapi-generator/FILES @@ -6,10 +6,14 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/api/DefaultApiClient.kt src/main/kotlin/org/openapitools/api/PetApiClient.kt src/main/kotlin/org/openapitools/api/StoreApiClient.kt src/main/kotlin/org/openapitools/api/UserApiClient.kt src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt new file mode 100644 index 000000000000..eb5faf53717d --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -0,0 +1,65 @@ +/** +* NOTE: Auto generated by OpenAPI Generator (7.18.0-SNAPSHOT) +* Spring 6 Declarative HTTP Interface +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* + +import org.springframework.web.service.annotation.* +import org.springframework.web.bind.annotation.* +import org.springframework.http.ResponseEntity + +import org.springframework.validation.annotation.Validated +import jakarta.validation.Valid +import jakarta.validation.constraints.* + +import reactor.core.publisher.Flux +import reactor.core.publisher.Mono + +import kotlin.collections.List +import kotlin.collections.Map + +@Validated +interface DefaultApi { + + @HttpExchange( + url = PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */, + method = "GET" + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): Mono> + + + @HttpExchange( + url = PATH_ITEMS_POST /* "/items" */, + method = "POST" + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): Mono> + + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/.openapi-generator/FILES b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/.openapi-generator/FILES index 18f6d4999914..7a299e837265 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/.openapi-generator/FILES @@ -6,10 +6,14 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/api/DefaultApiClient.kt src/main/kotlin/org/openapitools/api/PetApiClient.kt src/main/kotlin/org/openapitools/api/StoreApiClient.kt src/main/kotlin/org/openapitools/api/UserApiClient.kt src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt new file mode 100644 index 000000000000..bc4cd324d67b --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -0,0 +1,63 @@ +/** +* NOTE: Auto generated by OpenAPI Generator (7.18.0-SNAPSHOT) +* Spring 6 Declarative HTTP Interface +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* + +import org.springframework.web.service.annotation.* +import org.springframework.web.bind.annotation.* +import org.springframework.http.ResponseEntity + +import org.springframework.validation.annotation.Validated +import jakarta.validation.Valid +import jakarta.validation.constraints.* + + +import kotlin.collections.List +import kotlin.collections.Map + +@Validated +interface DefaultApi { + + @HttpExchange( + url = PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */, + method = "GET" + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity + + + @HttpExchange( + url = PATH_ITEMS_POST /* "/items" */, + method = "POST" + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity + + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/.openapi-generator/FILES b/samples/server/petstore/kotlin-spring-declarative-interface/.openapi-generator/FILES index 18f6d4999914..7a299e837265 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-spring-declarative-interface/.openapi-generator/FILES @@ -6,10 +6,14 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/api/DefaultApiClient.kt src/main/kotlin/org/openapitools/api/PetApiClient.kt src/main/kotlin/org/openapitools/api/StoreApiClient.kt src/main/kotlin/org/openapitools/api/UserApiClient.kt src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt new file mode 100644 index 000000000000..bc4cd324d67b --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -0,0 +1,63 @@ +/** +* NOTE: Auto generated by OpenAPI Generator (7.18.0-SNAPSHOT) +* Spring 6 Declarative HTTP Interface +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* + +import org.springframework.web.service.annotation.* +import org.springframework.web.bind.annotation.* +import org.springframework.http.ResponseEntity + +import org.springframework.validation.annotation.Validated +import jakarta.validation.Valid +import jakarta.validation.constraints.* + + +import kotlin.collections.List +import kotlin.collections.Map + +@Validated +interface DefaultApi { + + @HttpExchange( + url = PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */, + method = "GET" + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity + + + @HttpExchange( + url = PATH_ITEMS_POST /* "/items" */, + method = "POST" + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity + + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator-ignore b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES new file mode 100644 index 000000000000..15ef52ad8fe7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES @@ -0,0 +1,40 @@ +README.md +build.gradle.kts +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +pom.xml +settings.gradle +src/main/kotlin/org/openapitools/Application.kt +src/main/kotlin/org/openapitools/HomeController.kt +src/main/kotlin/org/openapitools/SpringDocConfiguration.kt +src/main/kotlin/org/openapitools/api/ApiUtil.kt +src/main/kotlin/org/openapitools/api/Exceptions.kt +src/main/kotlin/org/openapitools/api/ItemsApiController.kt +src/main/kotlin/org/openapitools/api/ItemsApiService.kt +src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/PetApiController.kt +src/main/kotlin/org/openapitools/api/PetApiService.kt +src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/StoreApiController.kt +src/main/kotlin/org/openapitools/api/StoreApiService.kt +src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/UserApiController.kt +src/main/kotlin/org/openapitools/api/UserApiService.kt +src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt +src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt +src/main/kotlin/org/openapitools/model/ModelApiResponse.kt +src/main/kotlin/org/openapitools/model/Order.kt +src/main/kotlin/org/openapitools/model/Pet.kt +src/main/kotlin/org/openapitools/model/Tag.kt +src/main/kotlin/org/openapitools/model/User.kt +src/main/resources/application.yaml +src/main/resources/openapi.yaml +src/test/kotlin/org/openapitools/api/ItemsApiTest.kt +src/test/kotlin/org/openapitools/api/PetApiTest.kt +src/test/kotlin/org/openapitools/api/StoreApiTest.kt +src/test/kotlin/org/openapitools/api/UserApiTest.kt diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/VERSION b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/VERSION new file mode 100644 index 000000000000..2fb556b60635 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.18.0-SNAPSHOT diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/README.md b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/README.md new file mode 100644 index 000000000000..b6865a081135 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/README.md @@ -0,0 +1,21 @@ +# openAPIPetstore + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/openapi-spring-1.0.0.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/openapi-spring-1.0.0.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/build.gradle.kts b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/build.gradle.kts new file mode 100644 index 000000000000..ae1b59ef90c8 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/build.gradle.kts @@ -0,0 +1,43 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +group = "org.openapitools" +version = "1.0.0" +java.sourceCompatibility = JavaVersion.VERSION_17 + +repositories { + mavenCentral() + maven { url = uri("https://repo.spring.io/milestone") } +} + +tasks.withType { + kotlinOptions.jvmTarget = "17" +} + +plugins { + val kotlinVersion = "1.9.25" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "3.0.2" + id("io.spring.dependency-management") version "1.0.14.RELEASE" +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springdoc:springdoc-openapi-starter-webmvc-api:2.6.0") + + implementation("com.google.code.findbugs:jsr305:3.0.2") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("jakarta.validation:jakarta.validation-api") + implementation("jakarta.annotation:jakarta.annotation-api:2.1.0") + + testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") + testImplementation("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.jar b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 zcma&N1CXTcmMvW9vTb(Rwr$&4wr$(C?dmSu>@vG-+vuvg^_??!{yS%8zW-#zn-LkA z5&1^$^{lnmUON?}LBF8_K|(?T0Ra(xUH{($5eN!MR#ZihR#HxkUPe+_R8Cn`RRs(P z_^*#_XlXmGv7!4;*Y%p4nw?{bNp@UZHv1?Um8r6)Fei3p@ClJn0ECfg1hkeuUU@Or zDaPa;U3fE=3L}DooL;8f;P0ipPt0Z~9P0)lbStMS)ag54=uL9ia-Lm3nh|@(Y?B`; zx_#arJIpXH!U{fbCbI^17}6Ri*H<>OLR%c|^mh8+)*h~K8Z!9)DPf zR2h?lbDZQ`p9P;&DQ4F0sur@TMa!Y}S8irn(%d-gi0*WxxCSk*A?3lGh=gcYN?FGl z7D=Js!i~0=u3rox^eO3i@$0=n{K1lPNU zwmfjRVmLOCRfe=seV&P*1Iq=^i`502keY8Uy-WNPwVNNtJFx?IwAyRPZo2Wo1+S(xF37LJZ~%i)kpFQ3Fw=mXfd@>%+)RpYQLnr}B~~zoof(JVm^^&f zxKV^+3D3$A1G;qh4gPVjhrC8e(VYUHv#dy^)(RoUFM?o%W-EHxufuWf(l*@-l+7vt z=l`qmR56K~F|v<^Pd*p~1_y^P0P^aPC##d8+HqX4IR1gu+7w#~TBFphJxF)T$2WEa zxa?H&6=Qe7d(#tha?_1uQys2KtHQ{)Qco)qwGjrdNL7thd^G5i8Os)CHqc>iOidS} z%nFEDdm=GXBw=yXe1W-ShHHFb?Cc70+$W~z_+}nAoHFYI1MV1wZegw*0y^tC*s%3h zhD3tN8b=Gv&rj}!SUM6|ajSPp*58KR7MPpI{oAJCtY~JECm)*m_x>AZEu>DFgUcby z1Qaw8lU4jZpQ_$;*7RME+gq1KySGG#Wql>aL~k9tLrSO()LWn*q&YxHEuzmwd1?aAtI zBJ>P=&$=l1efe1CDU;`Fd+_;&wI07?V0aAIgc(!{a z0Jg6Y=inXc3^n!U0Atk`iCFIQooHqcWhO(qrieUOW8X(x?(RD}iYDLMjSwffH2~tB z)oDgNBLB^AJBM1M^c5HdRx6fBfka`(LD-qrlh5jqH~);#nw|iyp)()xVYak3;Ybik z0j`(+69aK*B>)e_p%=wu8XC&9e{AO4c~O1U`5X9}?0mrd*m$_EUek{R?DNSh(=br# z#Q61gBzEpmy`$pA*6!87 zSDD+=@fTY7<4A?GLqpA?Pb2z$pbCc4B4zL{BeZ?F-8`s$?>*lXXtn*NC61>|*w7J* z$?!iB{6R-0=KFmyp1nnEmLsA-H0a6l+1uaH^g%c(p{iT&YFrbQ$&PRb8Up#X3@Zsk zD^^&LK~111%cqlP%!_gFNa^dTYT?rhkGl}5=fL{a`UViaXWI$k-UcHJwmaH1s=S$4 z%4)PdWJX;hh5UoK?6aWoyLxX&NhNRqKam7tcOkLh{%j3K^4Mgx1@i|Pi&}<^5>hs5 zm8?uOS>%)NzT(%PjVPGa?X%`N2TQCKbeH2l;cTnHiHppPSJ<7y-yEIiC!P*ikl&!B z%+?>VttCOQM@ShFguHVjxX^?mHX^hSaO_;pnyh^v9EumqSZTi+#f&_Vaija0Q-e*| z7ulQj6Fs*bbmsWp{`auM04gGwsYYdNNZcg|ph0OgD>7O}Asn7^Z=eI>`$2*v78;sj-}oMoEj&@)9+ycEOo92xSyY344^ z11Hb8^kdOvbf^GNAK++bYioknrpdN>+u8R?JxG=!2Kd9r=YWCOJYXYuM0cOq^FhEd zBg2puKy__7VT3-r*dG4c62Wgxi52EMCQ`bKgf*#*ou(D4-ZN$+mg&7$u!! z-^+Z%;-3IDwqZ|K=ah85OLwkO zKxNBh+4QHh)u9D?MFtpbl)us}9+V!D%w9jfAMYEb>%$A;u)rrI zuBudh;5PN}_6J_}l55P3l_)&RMlH{m!)ai-i$g)&*M`eN$XQMw{v^r@-125^RRCF0 z^2>|DxhQw(mtNEI2Kj(;KblC7x=JlK$@78`O~>V!`|1Lm-^JR$-5pUANAnb(5}B}JGjBsliK4& zk6y(;$e&h)lh2)L=bvZKbvh@>vLlreBdH8No2>$#%_Wp1U0N7Ank!6$dFSi#xzh|( zRi{Uw%-4W!{IXZ)fWx@XX6;&(m_F%c6~X8hx=BN1&q}*( zoaNjWabE{oUPb!Bt$eyd#$5j9rItB-h*5JiNi(v^e|XKAj*8(k<5-2$&ZBR5fF|JA z9&m4fbzNQnAU}r8ab>fFV%J0z5awe#UZ|bz?Ur)U9bCIKWEzi2%A+5CLqh?}K4JHi z4vtM;+uPsVz{Lfr;78W78gC;z*yTch~4YkLr&m-7%-xc ztw6Mh2d>_iO*$Rd8(-Cr1_V8EO1f*^@wRoSozS) zy1UoC@pruAaC8Z_7~_w4Q6n*&B0AjOmMWa;sIav&gu z|J5&|{=a@vR!~k-OjKEgPFCzcJ>#A1uL&7xTDn;{XBdeM}V=l3B8fE1--DHjSaxoSjNKEM9|U9#m2<3>n{Iuo`r3UZp;>GkT2YBNAh|b z^jTq-hJp(ebZh#Lk8hVBP%qXwv-@vbvoREX$TqRGTgEi$%_F9tZES@z8Bx}$#5eeG zk^UsLBH{bc2VBW)*EdS({yw=?qmevwi?BL6*=12k9zM5gJv1>y#ML4!)iiPzVaH9% zgSImetD@dam~e>{LvVh!phhzpW+iFvWpGT#CVE5TQ40n%F|p(sP5mXxna+Ev7PDwA zamaV4m*^~*xV+&p;W749xhb_X=$|LD;FHuB&JL5?*Y2-oIT(wYY2;73<^#46S~Gx| z^cez%V7x$81}UWqS13Gz80379Rj;6~WdiXWOSsdmzY39L;Hg3MH43o*y8ibNBBH`(av4|u;YPq%{R;IuYow<+GEsf@R?=@tT@!}?#>zIIn0CoyV!hq3mw zHj>OOjfJM3F{RG#6ujzo?y32m^tgSXf@v=J$ELdJ+=5j|=F-~hP$G&}tDZsZE?5rX ztGj`!S>)CFmdkccxM9eGIcGnS2AfK#gXwj%esuIBNJQP1WV~b~+D7PJTmWGTSDrR` zEAu4B8l>NPuhsk5a`rReSya2nfV1EK01+G!x8aBdTs3Io$u5!6n6KX%uv@DxAp3F@{4UYg4SWJtQ-W~0MDb|j-$lwVn znAm*Pl!?Ps&3wO=R115RWKb*JKoexo*)uhhHBncEDMSVa_PyA>k{Zm2(wMQ(5NM3# z)jkza|GoWEQo4^s*wE(gHz?Xsg4`}HUAcs42cM1-qq_=+=!Gk^y710j=66(cSWqUe zklbm8+zB_syQv5A2rj!Vbw8;|$@C!vfNmNV!yJIWDQ>{+2x zKjuFX`~~HKG~^6h5FntRpnnHt=D&rq0>IJ9#F0eM)Y-)GpRjiN7gkA8wvnG#K=q{q z9dBn8_~wm4J<3J_vl|9H{7q6u2A!cW{bp#r*-f{gOV^e=8S{nc1DxMHFwuM$;aVI^ zz6A*}m8N-&x8;aunp1w7_vtB*pa+OYBw=TMc6QK=mbA-|Cf* zvyh8D4LRJImooUaSb7t*fVfih<97Gf@VE0|z>NcBwBQze);Rh!k3K_sfunToZY;f2 z^HmC4KjHRVg+eKYj;PRN^|E0>Gj_zagfRbrki68I^#~6-HaHg3BUW%+clM1xQEdPYt_g<2K+z!$>*$9nQ>; zf9Bei{?zY^-e{q_*|W#2rJG`2fy@{%6u0i_VEWTq$*(ZN37|8lFFFt)nCG({r!q#9 z5VK_kkSJ3?zOH)OezMT{!YkCuSSn!K#-Rhl$uUM(bq*jY? zi1xbMVthJ`E>d>(f3)~fozjg^@eheMF6<)I`oeJYx4*+M&%c9VArn(OM-wp%M<-`x z7sLP1&3^%Nld9Dhm@$3f2}87!quhI@nwd@3~fZl_3LYW-B?Ia>ui`ELg z&Qfe!7m6ze=mZ`Ia9$z|ARSw|IdMpooY4YiPN8K z4B(ts3p%2i(Td=tgEHX z0UQ_>URBtG+-?0E;E7Ld^dyZ;jjw0}XZ(}-QzC6+NN=40oDb2^v!L1g9xRvE#@IBR zO!b-2N7wVfLV;mhEaXQ9XAU+>=XVA6f&T4Z-@AX!leJ8obP^P^wP0aICND?~w&NykJ#54x3_@r7IDMdRNy4Hh;h*!u(Ol(#0bJdwEo$5437-UBjQ+j=Ic>Q2z` zJNDf0yO6@mr6y1#n3)s(W|$iE_i8r@Gd@!DWDqZ7J&~gAm1#~maIGJ1sls^gxL9LLG_NhU!pTGty!TbhzQnu)I*S^54U6Yu%ZeCg`R>Q zhBv$n5j0v%O_j{QYWG!R9W?5_b&67KB$t}&e2LdMvd(PxN6Ir!H4>PNlerpBL>Zvyy!yw z-SOo8caEpDt(}|gKPBd$qND5#a5nju^O>V&;f890?yEOfkSG^HQVmEbM3Ugzu+UtH zC(INPDdraBN?P%kE;*Ae%Wto&sgw(crfZ#Qy(<4nk;S|hD3j{IQRI6Yq|f^basLY; z-HB&Je%Gg}Jt@={_C{L$!RM;$$|iD6vu#3w?v?*;&()uB|I-XqEKqZPS!reW9JkLewLb!70T7n`i!gNtb1%vN- zySZj{8-1>6E%H&=V}LM#xmt`J3XQoaD|@XygXjdZ1+P77-=;=eYpoEQ01B@L*a(uW zrZeZz?HJsw_4g0vhUgkg@VF8<-X$B8pOqCuWAl28uB|@r`19DTUQQsb^pfqB6QtiT z*`_UZ`fT}vtUY#%sq2{rchyfu*pCg;uec2$-$N_xgjZcoumE5vSI{+s@iLWoz^Mf; zuI8kDP{!XY6OP~q5}%1&L}CtfH^N<3o4L@J@zg1-mt{9L`s^z$Vgb|mr{@WiwAqKg zp#t-lhrU>F8o0s1q_9y`gQNf~Vb!F%70f}$>i7o4ho$`uciNf=xgJ>&!gSt0g;M>*x4-`U)ysFW&Vs^Vk6m%?iuWU+o&m(2Jm26Y(3%TL; zA7T)BP{WS!&xmxNw%J=$MPfn(9*^*TV;$JwRy8Zl*yUZi8jWYF>==j~&S|Xinsb%c z2?B+kpet*muEW7@AzjBA^wAJBY8i|#C{WtO_or&Nj2{=6JTTX05}|H>N2B|Wf!*3_ z7hW*j6p3TvpghEc6-wufFiY!%-GvOx*bZrhZu+7?iSrZL5q9}igiF^*R3%DE4aCHZ zqu>xS8LkW+Auv%z-<1Xs92u23R$nk@Pk}MU5!gT|c7vGlEA%G^2th&Q*zfg%-D^=f z&J_}jskj|Q;73NP4<4k*Y%pXPU2Thoqr+5uH1yEYM|VtBPW6lXaetokD0u z9qVek6Q&wk)tFbQ8(^HGf3Wp16gKmr>G;#G(HRBx?F`9AIRboK+;OfHaLJ(P>IP0w zyTbTkx_THEOs%Q&aPrxbZrJlio+hCC_HK<4%f3ZoSAyG7Dn`=X=&h@m*|UYO-4Hq0 z-Bq&+Ie!S##4A6OGoC~>ZW`Y5J)*ouaFl_e9GA*VSL!O_@xGiBw!AF}1{tB)z(w%c zS1Hmrb9OC8>0a_$BzeiN?rkPLc9%&;1CZW*4}CDDNr2gcl_3z+WC15&H1Zc2{o~i) z)LLW=WQ{?ricmC`G1GfJ0Yp4Dy~Ba;j6ZV4r{8xRs`13{dD!xXmr^Aga|C=iSmor% z8hi|pTXH)5Yf&v~exp3o+sY4B^^b*eYkkCYl*T{*=-0HniSA_1F53eCb{x~1k3*`W zr~};p1A`k{1DV9=UPnLDgz{aJH=-LQo<5%+Em!DNN252xwIf*wF_zS^!(XSm(9eoj z=*dXG&n0>)_)N5oc6v!>-bd(2ragD8O=M|wGW z!xJQS<)u70m&6OmrF0WSsr@I%T*c#Qo#Ha4d3COcX+9}hM5!7JIGF>7<~C(Ear^Sn zm^ZFkV6~Ula6+8S?oOROOA6$C&q&dp`>oR-2Ym3(HT@O7Sd5c~+kjrmM)YmgPH*tL zX+znN>`tv;5eOfX?h{AuX^LK~V#gPCu=)Tigtq9&?7Xh$qN|%A$?V*v=&-2F$zTUv z`C#WyIrChS5|Kgm_GeudCFf;)!WH7FI60j^0o#65o6`w*S7R@)88n$1nrgU(oU0M9 zx+EuMkC>(4j1;m6NoGqEkpJYJ?vc|B zOlwT3t&UgL!pX_P*6g36`ZXQ; z9~Cv}ANFnJGp(;ZhS(@FT;3e)0)Kp;h^x;$*xZn*k0U6-&FwI=uOGaODdrsp-!K$Ac32^c{+FhI-HkYd5v=`PGsg%6I`4d9Jy)uW0y%) zm&j^9WBAp*P8#kGJUhB!L?a%h$hJgQrx!6KCB_TRo%9{t0J7KW8!o1B!NC)VGLM5! zpZy5Jc{`r{1e(jd%jsG7k%I+m#CGS*BPA65ZVW~fLYw0dA-H_}O zrkGFL&P1PG9p2(%QiEWm6x;U-U&I#;Em$nx-_I^wtgw3xUPVVu zqSuKnx&dIT-XT+T10p;yjo1Y)z(x1fb8Dzfn8e yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew.bat b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew.bat new file mode 100644 index 000000000000..25da30dbdeee --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/pom.xml b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/pom.xml new file mode 100644 index 000000000000..07c653febb4b --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/pom.xml @@ -0,0 +1,149 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0.0 + + 3.0.2 + 2.1.0 + 1.7.10 + + 1.7.10 + UTF-8 + + + org.springframework.boot + spring-boot-starter-parent + 3.1.3 + + + + repository.spring.milestone + Spring Milestone Repository + https://repo.spring.io/milestone + + + + + spring-milestones + https://repo.spring.io/milestone + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 17 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springdoc + springdoc-openapi-webmvc-core + ${springdoc-openapi.version} + + + + + com.google.code.findbugs + jsr305 + ${findbugs-jsr305.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + + jakarta.validation + jakarta.validation-api + + + jakarta.annotation + jakarta.annotation-api + ${jakarta-annotation.version} + provided + + + org.jetbrains.kotlin + kotlin-test-junit5 + ${kotlin-test-junit5.version} + test + + + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/settings.gradle b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/settings.gradle new file mode 100644 index 000000000000..14844905cd40 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + maven { url = uri("https://repo.spring.io/snapshot") } + maven { url = uri("https://repo.spring.io/milestone") } + gradlePluginPortal() + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == "org.springframework.boot") { + useModule("org.springframework.boot:spring-boot-gradle-plugin:${requested.version}") + } + } + } +} +rootProject.name = "openapi-spring" diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/Application.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/Application.kt new file mode 100644 index 000000000000..2fe6de62479e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/Application.kt @@ -0,0 +1,13 @@ +package org.openapitools + +import org.springframework.boot.runApplication +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.context.annotation.ComponentScan + +@SpringBootApplication +@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/HomeController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/HomeController.kt new file mode 100644 index 000000000000..310e7f4d62e3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/HomeController.kt @@ -0,0 +1,12 @@ +package org.openapitools + +import org.springframework.context.annotation.Bean +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestMapping + +/** + * Home redirection to OpenAPI api documentation + */ +@Controller +class HomeController { +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt new file mode 100644 index 000000000000..cbdc4ba437ca --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt @@ -0,0 +1,42 @@ +package org.openapitools + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +import io.swagger.v3.oas.models.OpenAPI +import io.swagger.v3.oas.models.info.Info +import io.swagger.v3.oas.models.info.Contact +import io.swagger.v3.oas.models.info.License +import io.swagger.v3.oas.models.Components +import io.swagger.v3.oas.models.security.SecurityScheme + +@Configuration +class SpringDocConfiguration { + + @Bean + fun apiInfo(): OpenAPI { + return OpenAPI() + .info( + Info() + .title("OpenAPI Petstore") + .description("This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.") + .license( + License() + .name("Apache-2.0") + .url("http://www.apache.org/licenses/LICENSE-2.0.html") + ) + .version("1.0.0") + ) + .components( + Components() + .addSecuritySchemes("petstore_auth", SecurityScheme() + .type(SecurityScheme.Type.OAUTH2) + ) + .addSecuritySchemes("api_key", SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .`in`(SecurityScheme.In.HEADER) + .name("api_key") + ) + ) + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ApiUtil.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ApiUtil.kt new file mode 100644 index 000000000000..03344e13b474 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ApiUtil.kt @@ -0,0 +1,19 @@ +package org.openapitools.api + +import org.springframework.web.context.request.NativeWebRequest + +import jakarta.servlet.http.HttpServletResponse +import java.io.IOException + +object ApiUtil { + fun setExampleResponse(req: NativeWebRequest, contentType: String, example: String) { + try { + val res = req.getNativeResponse(HttpServletResponse::class.java) + res?.characterEncoding = "UTF-8" + res?.addHeader("Content-Type", contentType) + res?.writer?.print(example) + } catch (e: IOException) { + throw RuntimeException(e) + } + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/Exceptions.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/Exceptions.kt new file mode 100644 index 000000000000..1bd78f54576a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/Exceptions.kt @@ -0,0 +1,30 @@ +package org.openapitools.api + +import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import jakarta.servlet.http.HttpServletResponse +import jakarta.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + +@Configuration("org.openapitools.api.DefaultExceptionHandler") +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt new file mode 100644 index 000000000000..0932ddeaeeee --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -0,0 +1,87 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import jakarta.validation.Valid +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +class ItemsApiController(@Autowired(required = true) val service: ItemsApiService) { + + @Operation( + summary = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + operationId = "itemsItemIdSomethingItemSubIdGet", + description = """SQ = "; SBS = \; DBS = \\; SD = ${'$'}some""", + responses = [ + ApiResponse(responseCode = "200", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", content = [Content(schema = Schema(implementation = ItemsItemIdSomethingItemSubIdGet200Response::class))]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], + produces = ["application/json"] + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + operationId = "itemsPost", + description = """SQ = "; SBS = \; DBS = \\; SD = ${'$'}some""", + responses = [ + ApiResponse(responseCode = "201", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", content = [Content(schema = Schema(implementation = ItemWithDollarAttributesAndExamples::class))]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.itemsPost(xPostHeader, formDollarName, formDollarValue), HttpStatus.valueOf(201)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt new file mode 100644 index 000000000000..2e8d2a7b6637 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt @@ -0,0 +1,36 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +interface ItemsApiService { + + /** + * GET /items/{item$Id}/something/{item$SubId} : SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * + * @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some (required) + * @param itemDollarSubId SQ = \"; SBS = \\; DBS = \\\\; SD = $some (required) + * @param filterDollarType SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + * @param filterDollarSubType SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + * @param xCustomHeader SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param xCustomHeaderTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param sessionDollarToken SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param sessionDollarTokenTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @return SQ = \"; SBS = \\; DBS = \\\\; SD = $some (status code 200) + * @see ItemsApi#itemsItemIdSomethingItemSubIdGet + */ + fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response + + /** + * POST /items : SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * + * @param xPostHeader SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param formDollarName SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some (optional) + * @param formDollarValue SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + * @return SQ = \"; SBS = \\; DBS = \\\\; SD = $some (status code 201) + * @see ItemsApi#itemsPost + */ + fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt new file mode 100644 index 000000000000..5753996f7855 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt @@ -0,0 +1,16 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.springframework.stereotype.Service +@Service +class ItemsApiServiceImpl : ItemsApiService { + + override fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response { + TODO("Implement me") + } + + override fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiController.kt new file mode 100644 index 000000000000..526c57dfd17b --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -0,0 +1,253 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import jakarta.validation.Valid +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +class PetApiController(@Autowired(required = true) val service: PetApiService) { + + @Operation( + summary = "Add a new pet to the store", + operationId = "addPet", + description = """""", + responses = [ + ApiResponse(responseCode = "405", description = "Invalid input") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ADD_PET /* "/pet" */], + consumes = ["application/json", "application/xml"] + ) + fun addPet( + @Parameter(description = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody body: Pet + ): ResponseEntity { + return ResponseEntity(service.addPet(body), HttpStatus.valueOf(405)) + } + + @Operation( + summary = "Deletes a pet", + operationId = "deletePet", + description = """""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid pet value") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_PET /* "/pet/{petId}" */] + ) + fun deletePet( + @Parameter(description = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "", `in` = ParameterIn.HEADER) @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.deletePet(petId, apiKey), HttpStatus.valueOf(400)) + } + + @Operation( + summary = "Finds Pets by status", + operationId = "findPetsByStatus", + description = """Multiple status values can be provided with comma separated strings""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(array = ArraySchema(schema = Schema(implementation = Pet::class)))]), + ApiResponse(responseCode = "400", description = "Invalid status value") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByStatus( + @NotNull @Parameter(description = "Status values that need to be considered for filter", required = true, schema = Schema(allowableValues = ["available", "pending", "sold"])) @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(service.findPetsByStatus(status), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Finds Pets by tags", + operationId = "findPetsByTags", + description = """Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(array = ArraySchema(schema = Schema(implementation = Pet::class)))]), + ApiResponse(responseCode = "400", description = "Invalid tag value") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByTags( + @NotNull @Parameter(description = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(service.findPetsByTags(tags), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Get an image", + operationId = "getImage", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = org.springframework.core.io.Resource::class))]) ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_IMAGE /* "/pet/{petId}/getImage" */], + produces = ["application/octet-stream"] + ) + fun getImage( + @Parameter(description = "ID of pet to get image", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getImage(petId), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Find pet by ID", + operationId = "getPetById", + description = """Returns a single pet""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Pet::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Pet not found") ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], + produces = ["application/xml", "application/json"] + ) + fun getPetById( + @Parameter(description = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getPetById(petId), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Update an existing pet", + operationId = "updatePet", + description = """""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Pet not found"), + ApiResponse(responseCode = "405", description = "Validation exception") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_PET /* "/pet" */], + consumes = ["application/json", "application/xml"] + ) + fun updatePet( + @Parameter(description = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody body: Pet + ): ResponseEntity { + return ResponseEntity(service.updatePet(body), HttpStatus.valueOf(400)) + } + + @Operation( + summary = "Updates a pet in the store with form data", + operationId = "updatePetWithForm", + description = """""", + responses = [ + ApiResponse(responseCode = "405", description = "Invalid input") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], + consumes = ["application/x-www-form-urlencoded"] + ) + fun updatePetWithForm( + @Parameter(description = "ID of pet that needs to be updated", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, + @Parameter(description = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.updatePetWithForm(petId, name, status), HttpStatus.valueOf(405)) + } + + @Operation( + summary = "uploads an image", + operationId = "uploadFile", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = ModelApiResponse::class))]) ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadFile( + @Parameter(description = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "image to upload") @Valid @RequestPart("image", required = true) image: org.springframework.web.multipart.MultipartFile, + @Parameter(description = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.uploadFile(petId, image, additionalMetadata), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "uploads multiple images", + operationId = "uploadMultipleFile", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = ModelApiResponse::class))]) ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_MULTIPLE_FILE /* "/pet/{petId}/uploadMultipleImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadMultipleFile( + @Parameter(description = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "") @Valid @RequestPart("images", required = true) images: Array, + @Parameter(description = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.uploadMultipleFile(petId, images, additionalMetadata), HttpStatus.valueOf(200)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ADD_PET: String = "/pet" + const val PATH_DELETE_PET: String = "/pet/{petId}" + const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" + const val PATH_FIND_PETS_BY_TAGS: String = "/pet/findByTags" + const val PATH_GET_IMAGE: String = "/pet/{petId}/getImage" + const val PATH_GET_PET_BY_ID: String = "/pet/{petId}" + const val PATH_UPDATE_PET: String = "/pet" + const val PATH_UPDATE_PET_WITH_FORM: String = "/pet/{petId}" + const val PATH_UPLOAD_FILE: String = "/pet/{petId}/uploadImage" + const val PATH_UPLOAD_MULTIPLE_FILE: String = "/pet/{petId}/uploadMultipleImage" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiService.kt new file mode 100644 index 000000000000..fe00af396a96 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiService.kt @@ -0,0 +1,114 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet + +interface PetApiService { + + /** + * POST /pet : Add a new pet to the store + * + * @param body Pet object that needs to be added to the store (required) + * @return Invalid input (status code 405) + * @see PetApi#addPet + */ + fun addPet(body: Pet): Unit + + /** + * DELETE /pet/{petId} : Deletes a pet + * + * @param petId Pet id to delete (required) + * @param apiKey (optional) + * @return Invalid pet value (status code 400) + * @see PetApi#deletePet + */ + fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): Unit + + /** + * GET /pet/findByStatus : Finds Pets by status + * Multiple status values can be provided with comma separated strings + * + * @param status Status values that need to be considered for filter (required) + * @return successful operation (status code 200) + * or Invalid status value (status code 400) + * @see PetApi#findPetsByStatus + */ + fun findPetsByStatus(status: kotlin.collections.List): List + + /** + * GET /pet/findByTags : Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * + * @param tags Tags to filter by (required) + * @return successful operation (status code 200) + * or Invalid tag value (status code 400) + * @deprecated + * @see PetApi#findPetsByTags + */ + fun findPetsByTags(tags: kotlin.collections.List): List + + /** + * GET /pet/{petId}/getImage : Get an image + * + * @param petId ID of pet to get image (required) + * @return successful operation (status code 200) + * @see PetApi#getImage + */ + fun getImage(petId: kotlin.Long): org.springframework.core.io.Resource + + /** + * GET /pet/{petId} : Find pet by ID + * Returns a single pet + * + * @param petId ID of pet to return (required) + * @return successful operation (status code 200) + * or Invalid ID supplied (status code 400) + * or Pet not found (status code 404) + * @see PetApi#getPetById + */ + fun getPetById(petId: kotlin.Long): Pet + + /** + * PUT /pet : Update an existing pet + * + * @param body Pet object that needs to be added to the store (required) + * @return Invalid ID supplied (status code 400) + * or Pet not found (status code 404) + * or Validation exception (status code 405) + * @see PetApi#updatePet + */ + fun updatePet(body: Pet): Unit + + /** + * POST /pet/{petId} : Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated (required) + * @param name Updated name of the pet (optional) + * @param status Updated status of the pet (optional) + * @return Invalid input (status code 405) + * @see PetApi#updatePetWithForm + */ + fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): Unit + + /** + * POST /pet/{petId}/uploadImage : uploads an image + * + * @param petId ID of pet to update (required) + * @param image image to upload (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @return successful operation (status code 200) + * @see PetApi#uploadFile + */ + fun uploadFile(petId: kotlin.Long, image: org.springframework.web.multipart.MultipartFile, additionalMetadata: kotlin.String?): ModelApiResponse + + /** + * POST /pet/{petId}/uploadMultipleImage : uploads multiple images + * + * @param petId ID of pet to update (required) + * @param images (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @return successful operation (status code 200) + * @see PetApi#uploadMultipleFile + */ + fun uploadMultipleFile(petId: kotlin.Long, images: Array, additionalMetadata: kotlin.String?): ModelApiResponse +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt new file mode 100644 index 000000000000..5b1b8e57d8be --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt @@ -0,0 +1,48 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.springframework.stereotype.Service +@Service +class PetApiServiceImpl : PetApiService { + + override fun addPet(body: Pet): Unit { + TODO("Implement me") + } + + override fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): Unit { + TODO("Implement me") + } + + override fun findPetsByStatus(status: kotlin.collections.List): List { + TODO("Implement me") + } + + override fun findPetsByTags(tags: kotlin.collections.List): List { + TODO("Implement me") + } + + override fun getImage(petId: kotlin.Long): org.springframework.core.io.Resource { + TODO("Implement me") + } + + override fun getPetById(petId: kotlin.Long): Pet { + TODO("Implement me") + } + + override fun updatePet(body: Pet): Unit { + TODO("Implement me") + } + + override fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): Unit { + TODO("Implement me") + } + + override fun uploadFile(petId: kotlin.Long, image: org.springframework.web.multipart.MultipartFile, additionalMetadata: kotlin.String?): ModelApiResponse { + TODO("Implement me") + } + + override fun uploadMultipleFile(petId: kotlin.Long, images: Array, additionalMetadata: kotlin.String?): ModelApiResponse { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiController.kt new file mode 100644 index 000000000000..cbb6a7f5c6a0 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -0,0 +1,116 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import jakarta.validation.Valid +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +class StoreApiController(@Autowired(required = true) val service: StoreApiService) { + + @Operation( + summary = "Delete purchase order by ID", + operationId = "deleteOrder", + description = """For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Order not found") ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] + ) + fun deleteOrder( + @Parameter(description = "ID of the order that needs to be deleted", required = true) @PathVariable("orderId") orderId: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.deleteOrder(orderId), HttpStatus.valueOf(400)) + } + + @Operation( + summary = "Returns pet inventories by status", + operationId = "getInventory", + description = """Returns a map of status codes to quantities""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = kotlin.collections.Map::class))]) ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_INVENTORY /* "/store/inventory" */], + produces = ["application/json"] + ) + fun getInventory(): ResponseEntity> { + return ResponseEntity(service.getInventory(), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Find purchase order by ID", + operationId = "getOrderById", + description = """For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Order::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Order not found") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], + produces = ["application/xml", "application/json"] + ) + fun getOrderById( + @Min(value=1L) @Max(value=5L) @Parameter(description = "ID of pet that needs to be fetched", required = true) @PathVariable("orderId") orderId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getOrderById(orderId), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Place an order for a pet", + operationId = "placeOrder", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Order::class))]), + ApiResponse(responseCode = "400", description = "Invalid Order") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_PLACE_ORDER /* "/store/order" */], + produces = ["application/xml", "application/json"] + ) + fun placeOrder( + @Parameter(description = "order placed for purchasing the pet", required = true) @Valid @RequestBody body: Order + ): ResponseEntity { + return ResponseEntity(service.placeOrder(body), HttpStatus.valueOf(200)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" + const val PATH_GET_INVENTORY: String = "/store/inventory" + const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" + const val PATH_PLACE_ORDER: String = "/store/order" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt new file mode 100644 index 000000000000..60e754529448 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -0,0 +1,48 @@ +package org.openapitools.api + +import org.openapitools.model.Order + +interface StoreApiService { + + /** + * DELETE /store/order/{orderId} : Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * + * @param orderId ID of the order that needs to be deleted (required) + * @return Invalid ID supplied (status code 400) + * or Order not found (status code 404) + * @see StoreApi#deleteOrder + */ + fun deleteOrder(orderId: kotlin.String): Unit + + /** + * GET /store/inventory : Returns pet inventories by status + * Returns a map of status codes to quantities + * + * @return successful operation (status code 200) + * @see StoreApi#getInventory + */ + fun getInventory(): Map + + /** + * GET /store/order/{orderId} : Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * + * @param orderId ID of pet that needs to be fetched (required) + * @return successful operation (status code 200) + * or Invalid ID supplied (status code 400) + * or Order not found (status code 404) + * @see StoreApi#getOrderById + */ + fun getOrderById(orderId: kotlin.Long): Order + + /** + * POST /store/order : Place an order for a pet + * + * @param body order placed for purchasing the pet (required) + * @return successful operation (status code 200) + * or Invalid Order (status code 400) + * @see StoreApi#placeOrder + */ + fun placeOrder(body: Order): Order +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt new file mode 100644 index 000000000000..7e733e28dc50 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt @@ -0,0 +1,23 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.springframework.stereotype.Service +@Service +class StoreApiServiceImpl : StoreApiService { + + override fun deleteOrder(orderId: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getInventory(): Map { + TODO("Implement me") + } + + override fun getOrderById(orderId: kotlin.Long): Order { + TODO("Implement me") + } + + override fun placeOrder(body: Order): Order { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiController.kt new file mode 100644 index 000000000000..91970e252573 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -0,0 +1,205 @@ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import jakarta.validation.Valid +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +class UserApiController(@Autowired(required = true) val service: UserApiService) { + + @Operation( + summary = "Create user", + operationId = "createUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USER /* "/user" */] + ) + fun createUser( + @Parameter(description = "Created user object", required = true) @Valid @RequestBody body: User + ): ResponseEntity { + return ResponseEntity(service.createUser(body), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Creates list of users with given input array", + operationId = "createUsersWithArrayInput", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] + ) + fun createUsersWithArrayInput( + @Parameter(description = "List of user object", required = true) @Valid @RequestBody body: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(service.createUsersWithArrayInput(body), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Creates list of users with given input array", + operationId = "createUsersWithListInput", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] + ) + fun createUsersWithListInput( + @Parameter(description = "List of user object", required = true) @Valid @RequestBody body: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(service.createUsersWithListInput(body), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Delete user", + operationId = "deleteUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid username supplied"), + ApiResponse(responseCode = "404", description = "User not found") ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_USER /* "/user/{username}" */] + ) + fun deleteUser( + @Parameter(description = "The name that needs to be deleted", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.deleteUser(username), HttpStatus.valueOf(400)) + } + + @Operation( + summary = "Get user by user name", + operationId = "getUserByName", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = User::class))]), + ApiResponse(responseCode = "400", description = "Invalid username supplied"), + ApiResponse(responseCode = "404", description = "User not found") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], + produces = ["application/xml", "application/json"] + ) + fun getUserByName( + @Parameter(description = "The name that needs to be fetched. Use user1 for testing.", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.getUserByName(username), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Logs user into the system", + operationId = "loginUser", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = kotlin.String::class))]), + ApiResponse(responseCode = "400", description = "Invalid username/password supplied") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGIN_USER /* "/user/login" */], + produces = ["application/xml", "application/json"] + ) + fun loginUser( + @NotNull @Parameter(description = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, + @NotNull @Parameter(description = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.loginUser(username, password), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Logs out current logged in user session", + operationId = "logoutUser", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGOUT_USER /* "/user/logout" */] + ) + fun logoutUser(): ResponseEntity { + return ResponseEntity(service.logoutUser(), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "logoutUserOptions", + operationId = "logoutUserOptions", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "endpoint configuration response") ] + ) + @RequestMapping( + method = [RequestMethod.OPTIONS], + value = [PATH_LOGOUT_USER_OPTIONS /* "/user/logout" */] + ) + fun logoutUserOptions(): ResponseEntity { + return ResponseEntity(service.logoutUserOptions(), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Updated user", + operationId = "updateUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid user supplied"), + ApiResponse(responseCode = "404", description = "User not found") ] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_USER /* "/user/{username}" */] + ) + fun updateUser( + @Parameter(description = "name that need to be deleted", required = true) @PathVariable("username") username: kotlin.String, + @Parameter(description = "Updated user object", required = true) @Valid @RequestBody body: User + ): ResponseEntity { + return ResponseEntity(service.updateUser(username, body), HttpStatus.valueOf(400)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_CREATE_USER: String = "/user" + const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" + const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" + const val PATH_DELETE_USER: String = "/user/{username}" + const val PATH_GET_USER_BY_NAME: String = "/user/{username}" + const val PATH_LOGIN_USER: String = "/user/login" + const val PATH_LOGOUT_USER: String = "/user/logout" + const val PATH_LOGOUT_USER_OPTIONS: String = "/user/logout" + const val PATH_UPDATE_USER: String = "/user/{username}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiService.kt new file mode 100644 index 000000000000..6942dc3ede0a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiService.kt @@ -0,0 +1,95 @@ +package org.openapitools.api + +import org.openapitools.model.User + +interface UserApiService { + + /** + * POST /user : Create user + * This can only be done by the logged in user. + * + * @param body Created user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUser + */ + fun createUser(body: User): Unit + + /** + * POST /user/createWithArray : Creates list of users with given input array + * + * @param body List of user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUsersWithArrayInput + */ + fun createUsersWithArrayInput(body: kotlin.collections.List): Unit + + /** + * POST /user/createWithList : Creates list of users with given input array + * + * @param body List of user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUsersWithListInput + */ + fun createUsersWithListInput(body: kotlin.collections.List): Unit + + /** + * DELETE /user/{username} : Delete user + * This can only be done by the logged in user. + * + * @param username The name that needs to be deleted (required) + * @return Invalid username supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#deleteUser + */ + fun deleteUser(username: kotlin.String): Unit + + /** + * GET /user/{username} : Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. (required) + * @return successful operation (status code 200) + * or Invalid username supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#getUserByName + */ + fun getUserByName(username: kotlin.String): User + + /** + * GET /user/login : Logs user into the system + * + * @param username The user name for login (required) + * @param password The password for login in clear text (required) + * @return successful operation (status code 200) + * or Invalid username/password supplied (status code 400) + * @see UserApi#loginUser + */ + fun loginUser(username: kotlin.String, password: kotlin.String): kotlin.String + + /** + * GET /user/logout : Logs out current logged in user session + * + * @return successful operation (status code 200) + * @see UserApi#logoutUser + */ + fun logoutUser(): Unit + + /** + * OPTIONS /user/logout : logoutUserOptions + * + * @return endpoint configuration response (status code 200) + * @see UserApi#logoutUserOptions + */ + fun logoutUserOptions(): Unit + + /** + * PUT /user/{username} : Updated user + * This can only be done by the logged in user. + * + * @param username name that need to be deleted (required) + * @param body Updated user object (required) + * @return Invalid user supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#updateUser + */ + fun updateUser(username: kotlin.String, body: User): Unit +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt new file mode 100644 index 000000000000..f0798bd1695a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt @@ -0,0 +1,43 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.springframework.stereotype.Service +@Service +class UserApiServiceImpl : UserApiService { + + override fun createUser(body: User): Unit { + TODO("Implement me") + } + + override fun createUsersWithArrayInput(body: kotlin.collections.List): Unit { + TODO("Implement me") + } + + override fun createUsersWithListInput(body: kotlin.collections.List): Unit { + TODO("Implement me") + } + + override fun deleteUser(username: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getUserByName(username: kotlin.String): User { + TODO("Implement me") + } + + override fun loginUser(username: kotlin.String, password: kotlin.String): kotlin.String { + TODO("Implement me") + } + + override fun logoutUser(): Unit { + TODO("Implement me") + } + + override fun logoutUserOptions(): Unit { + TODO("Implement me") + } + + override fun updateUser(username: kotlin.String, body: User): Unit { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Category.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Category.kt new file mode 100644 index 000000000000..4415f71fc6e3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Category.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A category for a pet + * @param id + * @param name + */ +data class Category( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt new file mode 100644 index 000000000000..b94f16fe0c34 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt @@ -0,0 +1,40 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * Describes the result of uploading an image resource + * @param code + * @param type + * @param message + */ +data class ModelApiResponse( + + @Schema(example = "null", description = "") + @get:JsonProperty("code") val code: kotlin.Int? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("type") val type: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("message") val message: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Order.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Order.kt new file mode 100644 index 000000000000..f1f9dd136e4d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Order.kt @@ -0,0 +1,74 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * An order for a pets from the pet store + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +data class Order( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("petId") val petId: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("quantity") val quantity: kotlin.Int? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null, + + @Schema(example = "null", description = "Order Status") + @get:JsonProperty("status") val status: Order.Status? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("complete") val complete: kotlin.Boolean? = false +) : Serializable { + + /** + * Order Status + * Values: placed,approved,delivered + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + placed("placed"), + approved("approved"), + delivered("delivered"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Order'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Pet.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Pet.kt new file mode 100644 index 000000000000..a96e73ae83cb --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Pet.kt @@ -0,0 +1,78 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import org.openapitools.model.Category +import org.openapitools.model.Tag +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A pet for sale in the pet store + * @param name + * @param photoUrls + * @param id + * @param category + * @param tags + * @param status pet status in the store + */ +data class Pet( + + @Schema(example = "doggie", required = true, description = "") + @get:JsonProperty("name", required = true) val name: kotlin.String, + + @Schema(example = "null", required = true, description = "") + @get:JsonProperty("photoUrls", required = true) val photoUrls: kotlin.collections.List, + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("category") val category: Category? = null, + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("tags") val tags: kotlin.collections.List? = null, + + @Schema(example = "null", description = "pet status in the store") + @get:JsonProperty("status") val status: Pet.Status? = null +) : Serializable { + + /** + * pet status in the store + * Values: available,pending,sold + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + available("available"), + pending("pending"), + sold("sold"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Pet'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Tag.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Tag.kt new file mode 100644 index 000000000000..9aeefda7ac75 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Tag.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A tag for a pet + * @param id + * @param name + */ +data class Tag( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/User.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/User.kt new file mode 100644 index 000000000000..3824ce08a5b2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/User.kt @@ -0,0 +1,60 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A User who is purchasing from the pet store + * @param id + * @param username + * @param firstName + * @param lastName + * @param email + * @param password + * @param phone + * @param userStatus User Status + */ +data class User( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("username") val username: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("firstName") val firstName: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("lastName") val lastName: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("email") val email: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("password") val password: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("phone") val phone: kotlin.String? = null, + + @Schema(example = "null", description = "User Status") + @get:JsonProperty("userStatus") val userStatus: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/application.yaml b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/application.yaml new file mode 100644 index 000000000000..8e2ebcde976d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/application.yaml @@ -0,0 +1,10 @@ +spring: + application: + name: openAPIPetstore + + jackson: + serialization: + WRITE_DATES_AS_TIMESTAMPS: false + +server: + port: 8080 diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/openapi.yaml b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/openapi.yaml new file mode 100644 index 000000000000..e06418a039f3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/openapi.yaml @@ -0,0 +1,1060 @@ +openapi: 3.0.1 +info: + description: "This is a sample server Petstore server. For this sample, you can\ + \ use the api key `special-key` to test the authorization filters." + license: + name: Apache-2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + title: OpenAPI Petstore + version: 1.0.0 +servers: +- url: http://petstore.swagger.io/v2 +tags: +- description: Everything about your Pets + name: pet +- description: Access to Petstore orders + name: store +- description: Operations about user + name: user +paths: + /pet: + post: + operationId: addPet + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + responses: + "405": + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Add a new pet to the store + tags: + - pet tag + x-codegen-request-body-name: body + put: + operationId: updatePet + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + responses: + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Pet not found + "405": + content: {} + description: Validation exception + security: + - petstore_auth: + - write:pets + - read:pets + summary: Update an existing pet + tags: + - pet tag + x-codegen-request-body-name: body + /pet/findByStatus: + get: + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - description: Status values that need to be considered for filter + explode: false + in: query + name: status + required: true + schema: + items: + default: available + enum: + - available + - pending + - sold + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + content: {} + description: Invalid status value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Finds Pets by status + tags: + - pet tag + x-spring-paginated: true + /pet/findByTags: + get: + deprecated: true + description: "Multiple tags can be provided with comma separated strings. Use\ + \ tag1, tag2, tag3 for testing." + operationId: findPetsByTags + parameters: + - description: Tags to filter by + explode: false + in: query + name: tags + required: true + schema: + items: + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + content: {} + description: Invalid tag value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Finds Pets by tags + tags: + - pet tag + x-spring-paginated: true + /pet/{petId}: + delete: + operationId: deletePet + parameters: + - explode: false + in: header + name: api_key + required: false + schema: + type: string + style: simple + - description: Pet id to delete + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "400": + content: {} + description: Invalid pet value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Deletes a pet + tags: + - pet tag + get: + description: Returns a single pet + operationId: getPetById + parameters: + - description: ID of pet to return + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Pet" + application/json: + schema: + $ref: "#/components/schemas/Pet" + description: successful operation + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Pet not found + security: + - api_key: [] + summary: Find pet by ID + tags: + - pet tag + post: + operationId: updatePetWithForm + parameters: + - description: ID of pet that needs to be updated + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/updatePetWithForm_request" + responses: + "405": + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Updates a pet in the store with form data + tags: + - pet tag + /pet/{petId}/uploadImage: + post: + operationId: uploadFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads an image + tags: + - pet tag + /pet/{petId}/uploadMultipleImage: + post: + operationId: uploadMultipleFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadMultipleFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads multiple images + tags: + - pet tag + /pet/{petId}/getImage: + get: + operationId: getImage + parameters: + - description: ID of pet to get image + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/octet-stream: + schema: + format: binary + type: string + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: Get an image + tags: + - pet tag + /store/inventory: + get: + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + "200": + content: + application/json: + schema: + additionalProperties: + format: int32 + type: integer + type: object + description: successful operation + security: + - api_key: [] + summary: Returns pet inventories by status + tags: + - store tag + /store/order: + post: + operationId: placeOrder + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/Order" + description: order placed for purchasing the pet + required: true + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + content: {} + description: Invalid Order + summary: Place an order for a pet + tags: + - store tag + x-codegen-request-body-name: body + /store/order/{orderId}: + delete: + description: For valid response try integer IDs with value < 1000. Anything + above 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - description: ID of the order that needs to be deleted + explode: false + in: path + name: orderId + required: true + schema: + type: string + style: simple + responses: + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Order not found + summary: Delete purchase order by ID + tags: + - store tag + get: + description: For valid response try integer IDs with value <= 5 or > 10. Other + values will generate exceptions + operationId: getOrderById + parameters: + - description: ID of pet that needs to be fetched + explode: false + in: path + name: orderId + required: true + schema: + format: int64 + maximum: 5 + minimum: 1 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Order not found + summary: Find purchase order by ID + tags: + - store tag + /user: + post: + description: This can only be done by the logged in user. + operationId: createUser + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/User" + description: Created user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Create user + tags: + - user tag + x-codegen-request-body-name: body + /user/createWithArray: + post: + operationId: createUsersWithArrayInput + requestBody: + content: + '*/*': + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Creates list of users with given input array + tags: + - user tag + x-codegen-request-body-name: body + /user/createWithList: + post: + operationId: createUsersWithListInput + requestBody: + content: + '*/*': + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Creates list of users with given input array + tags: + - user tag + x-codegen-request-body-name: body + /user/login: + get: + operationId: loginUser + parameters: + - description: The user name for login + explode: true + in: query + name: username + required: true + schema: + type: string + style: form + - description: The password for login in clear text + explode: true + in: query + name: password + required: true + schema: + type: string + style: form + responses: + "200": + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + description: successful operation + headers: + X-Rate-Limit: + description: calls per hour allowed by the user + explode: false + schema: + format: int32 + type: integer + style: simple + X-Expires-After: + description: date in UTC when token expires + explode: false + schema: + format: date-time + type: string + style: simple + "400": + content: {} + description: Invalid username/password supplied + summary: Logs user into the system + tags: + - user tag + /user/logout: + get: + operationId: logoutUser + responses: + default: + content: {} + description: successful operation + summary: Logs out current logged in user session + tags: + - user tag + options: + operationId: logoutUserOptions + responses: + default: + content: {} + description: endpoint configuration response + summary: logoutUserOptions + tags: + - user tag + /user/{username}: + delete: + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - description: The name that needs to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "400": + content: {} + description: Invalid username supplied + "404": + content: {} + description: User not found + summary: Delete user + tags: + - user tag + get: + operationId: getUserByName + parameters: + - description: The name that needs to be fetched. Use user1 for testing. + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/User" + application/json: + schema: + $ref: "#/components/schemas/User" + description: successful operation + "400": + content: {} + description: Invalid username supplied + "404": + content: {} + description: User not found + summary: Get user by user name + tags: + - user tag + put: + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - description: name that need to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/User" + description: Updated user object + required: true + responses: + "400": + content: {} + description: Invalid user supplied + "404": + content: {} + description: User not found + summary: Updated user + tags: + - user tag + x-codegen-request-body-name: body + /items/{item$Id}/something/{item$SubId}: + get: + description: SQ = "; SBS = \; DBS = \\; SD = $some + parameters: + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: path + name: item$Id + required: true + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: path + name: item$SubId + required: true + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: query + name: filter$Type + required: false + schema: + default: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: query + name: filter$SubType + required: false + schema: + default: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Custom_Header + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Custom_Header_two + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: cookie + name: session$Token + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: cookie + name: session$TokenTwo + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/_items__item_Id__something__item_SubId__get_200_response" + description: SQ = "; SBS = \; DBS = \\; SD = $some + summary: SQ = "; SBS = \; DBS = \\; SD = $some + /items: + post: + description: SQ = "; SBS = \; DBS = \\; SD = $some + parameters: + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Post_Header + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/_items_post_request" + required: true + responses: + "201": + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" + description: SQ = "; SBS = \; DBS = \\; SD = $some + summary: SQ = "; SBS = \; DBS = \\; SD = $some +components: + schemas: + Order: + description: An order for a pets from the pet store + example: + petId: 6 + quantity: 1 + id: 0 + shipDate: 2000-01-23T04:56:07.000+00:00 + complete: false + status: placed + properties: + id: + format: int64 + type: integer + petId: + format: int64 + type: integer + quantity: + format: int32 + type: integer + shipDate: + format: date-time + type: string + status: + description: Order Status + enum: + - placed + - approved + - delivered + type: string + complete: + default: false + type: boolean + title: Pet Order + type: object + xml: + name: Order + Category: + description: A category for a pet + example: + name: name + id: 6 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet category + type: object + xml: + name: Category + User: + description: A User who is purchasing from the pet store + example: + firstName: firstName + lastName: lastName + password: password + userStatus: 6 + phone: phone + id: 0 + email: email + username: username + properties: + id: + format: int64 + type: integer + username: + type: string + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + phone: + type: string + userStatus: + description: User Status + format: int32 + type: integer + title: a User + type: object + xml: + name: User + Tag: + description: A tag for a pet + example: + name: name + id: 1 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet Tag + type: object + xml: + name: Tag + Pet: + description: A pet for sale in the pet store + example: + photoUrls: + - photoUrls + - photoUrls + name: doggie + id: 0 + category: + name: name + id: 6 + tags: + - name: name + id: 1 + - name: name + id: 1 + status: available + properties: + id: + format: int64 + type: integer + category: + $ref: "#/components/schemas/Category" + name: + example: doggie + type: string + photoUrls: + items: + type: string + type: array + xml: + name: photoUrl + wrapped: true + tags: + items: + $ref: "#/components/schemas/Tag" + type: array + xml: + name: tag + wrapped: true + status: + description: pet status in the store + enum: + - available + - pending + - sold + type: string + required: + - name + - photoUrls + title: a Pet + type: object + xml: + name: Pet + ApiResponse: + description: Describes the result of uploading an image resource + example: + code: 0 + type: type + message: message + properties: + code: + format: int32 + type: integer + type: + type: string + message: + type: string + title: An uploaded response + type: object + ItemWithDollarAttributesAndExamples: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: + $name: SQ = "; SBS = \; DBS = \\; SD = $some + $id: SQ = "; SBS = \; DBS = \\; SD = $some + properties: + $id: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + $name: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + type: object + updatePetWithForm_request: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + uploadFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + image: + description: image to upload + format: binary + type: string + required: + - image + uploadMultipleFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + images: + items: + description: image to upload + format: binary + type: string + type: array + required: + - images + _items__item_Id__something__item_SubId__get_200_response_details_Info: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: + detail$One: SQ = "; SBS = \; DBS = \\; SD = $some + detail$Two: 42 + properties: + detail$One: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + detail$Two: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: 42 + type: integer + type: object + _items__item_Id__something__item_SubId__get_200_response: + example: + name$Value: SQ = "; SBS = \; DBS = \\; SD = $some + details$Info: + detail$One: SQ = "; SBS = \; DBS = \\; SD = $some + detail$Two: 42 + item$Id: SQ = "; SBS = \; DBS = \\; SD = $some + properties: + item$Id: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + name$Value: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + details$Info: + $ref: "#/components/schemas/_items__item_Id__something__item_SubId__get_200_response_details_Info" + type: object + _items_post_request: + properties: + form$Name: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + form$Value: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + type: object + securitySchemes: + petstore_auth: + flows: + implicit: + authorizationUrl: http://petstore.swagger.io/api/oauth/dialog + scopes: + write:pets: modify pets in your account + read:pets: read your pets + type: oauth2 + api_key: + in: header + name: api_key + type: apiKey diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt new file mode 100644 index 000000000000..b9dd52637709 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt @@ -0,0 +1,51 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class ItemsApiTest { + + private val service: ItemsApiService = ItemsApiServiceImpl() + private val api: ItemsApiController = ItemsApiController(service) + + /** + * To test ItemsApiController.itemsItemIdSomethingItemSubIdGet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsItemIdSomethingItemSubIdGetTest() { + val itemDollarId: kotlin.String = TODO() + val itemDollarSubId: kotlin.String = TODO() + val filterDollarType: kotlin.String = TODO() + val filterDollarSubType: kotlin.String = TODO() + val xCustomHeader: kotlin.String? = TODO() + val xCustomHeaderTwo: kotlin.String? = TODO() + val sessionDollarToken: kotlin.String? = TODO() + val sessionDollarTokenTwo: kotlin.String? = TODO() + + val response: ResponseEntity = api.itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo) + + // TODO: test validations + } + + /** + * To test ItemsApiController.itemsPost + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsPostTest() { + val xPostHeader: kotlin.String? = TODO() + val formDollarName: kotlin.String? = TODO() + val formDollarValue: kotlin.String = TODO() + + val response: ResponseEntity = api.itemsPost(xPostHeader, formDollarName, formDollarValue) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/PetApiTest.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/PetApiTest.kt new file mode 100644 index 000000000000..2e469407743c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/PetApiTest.kt @@ -0,0 +1,169 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class PetApiTest { + + private val service: PetApiService = PetApiServiceImpl() + private val api: PetApiController = PetApiController(service) + + /** + * To test PetApiController.addPet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun addPetTest() { + val body: Pet = TODO() + + val response: ResponseEntity = api.addPet(body) + + // TODO: test validations + } + + /** + * To test PetApiController.deletePet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deletePetTest() { + val petId: kotlin.Long = TODO() + val apiKey: kotlin.String? = TODO() + + val response: ResponseEntity = api.deletePet(petId, apiKey) + + // TODO: test validations + } + + /** + * To test PetApiController.findPetsByStatus + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun findPetsByStatusTest() { + val status: kotlin.collections.List = TODO() + + val response: ResponseEntity> = api.findPetsByStatus(status) + + // TODO: test validations + } + + /** + * To test PetApiController.findPetsByTags + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun findPetsByTagsTest() { + val tags: kotlin.collections.List = TODO() + + val response: ResponseEntity> = api.findPetsByTags(tags) + + // TODO: test validations + } + + /** + * To test PetApiController.getImage + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getImageTest() { + val petId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getImage(petId) + + // TODO: test validations + } + + /** + * To test PetApiController.getPetById + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getPetByIdTest() { + val petId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getPetById(petId) + + // TODO: test validations + } + + /** + * To test PetApiController.updatePet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updatePetTest() { + val body: Pet = TODO() + + val response: ResponseEntity = api.updatePet(body) + + // TODO: test validations + } + + /** + * To test PetApiController.updatePetWithForm + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updatePetWithFormTest() { + val petId: kotlin.Long = TODO() + val name: kotlin.String? = TODO() + val status: kotlin.String? = TODO() + + val response: ResponseEntity = api.updatePetWithForm(petId, name, status) + + // TODO: test validations + } + + /** + * To test PetApiController.uploadFile + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun uploadFileTest() { + val petId: kotlin.Long = TODO() + val image: org.springframework.web.multipart.MultipartFile = TODO() + val additionalMetadata: kotlin.String? = TODO() + + val response: ResponseEntity = api.uploadFile(petId, image, additionalMetadata) + + // TODO: test validations + } + + /** + * To test PetApiController.uploadMultipleFile + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun uploadMultipleFileTest() { + val petId: kotlin.Long = TODO() + val images: Array = TODO() + val additionalMetadata: kotlin.String? = TODO() + + val response: ResponseEntity = api.uploadMultipleFile(petId, images, additionalMetadata) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/StoreApiTest.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/StoreApiTest.kt new file mode 100644 index 000000000000..b67568e31dab --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/StoreApiTest.kt @@ -0,0 +1,70 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class StoreApiTest { + + private val service: StoreApiService = StoreApiServiceImpl() + private val api: StoreApiController = StoreApiController(service) + + /** + * To test StoreApiController.deleteOrder + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deleteOrderTest() { + val orderId: kotlin.String = TODO() + + val response: ResponseEntity = api.deleteOrder(orderId) + + // TODO: test validations + } + + /** + * To test StoreApiController.getInventory + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getInventoryTest() { + + val response: ResponseEntity> = api.getInventory() + + // TODO: test validations + } + + /** + * To test StoreApiController.getOrderById + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getOrderByIdTest() { + val orderId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getOrderById(orderId) + + // TODO: test validations + } + + /** + * To test StoreApiController.placeOrder + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun placeOrderTest() { + val body: Order = TODO() + + val response: ResponseEntity = api.placeOrder(body) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/UserApiTest.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/UserApiTest.kt new file mode 100644 index 000000000000..d7f7e9523f5f --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/UserApiTest.kt @@ -0,0 +1,146 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class UserApiTest { + + private val service: UserApiService = UserApiServiceImpl() + private val api: UserApiController = UserApiController(service) + + /** + * To test UserApiController.createUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUserTest() { + val body: User = TODO() + + val response: ResponseEntity = api.createUser(body) + + // TODO: test validations + } + + /** + * To test UserApiController.createUsersWithArrayInput + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUsersWithArrayInputTest() { + val body: kotlin.collections.List = TODO() + + val response: ResponseEntity = api.createUsersWithArrayInput(body) + + // TODO: test validations + } + + /** + * To test UserApiController.createUsersWithListInput + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUsersWithListInputTest() { + val body: kotlin.collections.List = TODO() + + val response: ResponseEntity = api.createUsersWithListInput(body) + + // TODO: test validations + } + + /** + * To test UserApiController.deleteUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deleteUserTest() { + val username: kotlin.String = TODO() + + val response: ResponseEntity = api.deleteUser(username) + + // TODO: test validations + } + + /** + * To test UserApiController.getUserByName + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getUserByNameTest() { + val username: kotlin.String = TODO() + + val response: ResponseEntity = api.getUserByName(username) + + // TODO: test validations + } + + /** + * To test UserApiController.loginUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun loginUserTest() { + val username: kotlin.String = TODO() + val password: kotlin.String = TODO() + + val response: ResponseEntity = api.loginUser(username, password) + + // TODO: test validations + } + + /** + * To test UserApiController.logoutUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun logoutUserTest() { + + val response: ResponseEntity = api.logoutUser() + + // TODO: test validations + } + + /** + * To test UserApiController.logoutUserOptions + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun logoutUserOptionsTest() { + + val response: ResponseEntity = api.logoutUserOptions() + + // TODO: test validations + } + + /** + * To test UserApiController.updateUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updateUserTest() { + val username: kotlin.String = TODO() + val body: User = TODO() + + val response: ResponseEntity = api.updateUser(username, body) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator-ignore b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/FILES new file mode 100644 index 000000000000..321c9fba3a7b --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/FILES @@ -0,0 +1,36 @@ +README.md +build.gradle.kts +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +pom.xml +settings.gradle +src/main/kotlin/org/openapitools/Application.kt +src/main/kotlin/org/openapitools/HomeController.kt +src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt +src/main/kotlin/org/openapitools/api/ApiUtil.kt +src/main/kotlin/org/openapitools/api/Exceptions.kt +src/main/kotlin/org/openapitools/api/ItemsApiController.kt +src/main/kotlin/org/openapitools/api/ItemsApiService.kt +src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/PetApiController.kt +src/main/kotlin/org/openapitools/api/PetApiService.kt +src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/StoreApiController.kt +src/main/kotlin/org/openapitools/api/StoreApiService.kt +src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/UserApiController.kt +src/main/kotlin/org/openapitools/api/UserApiService.kt +src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt +src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt +src/main/kotlin/org/openapitools/model/ModelApiResponse.kt +src/main/kotlin/org/openapitools/model/Order.kt +src/main/kotlin/org/openapitools/model/Pet.kt +src/main/kotlin/org/openapitools/model/Tag.kt +src/main/kotlin/org/openapitools/model/User.kt +src/main/resources/application.yaml +src/main/resources/openapi.yaml diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/VERSION b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/VERSION new file mode 100644 index 000000000000..2fb556b60635 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.18.0-SNAPSHOT diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/README.md b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/README.md new file mode 100644 index 000000000000..b6865a081135 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/README.md @@ -0,0 +1,21 @@ +# openAPIPetstore + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/openapi-spring-1.0.0.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/openapi-spring-1.0.0.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/build.gradle.kts b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/build.gradle.kts new file mode 100644 index 000000000000..0d536331c529 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/build.gradle.kts @@ -0,0 +1,49 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.6.7") + } +} + +group = "org.openapitools" +version = "1.0.0" + +repositories { + mavenCentral() +} + +tasks.withType { + kotlinOptions.jvmTarget = "11" +} + +plugins { + val kotlinVersion = "1.9.25" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "2.6.7" + id("io.spring.dependency-management") version "1.0.11.RELEASE" +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("io.springfox:springfox-swagger2:2.9.2") + + implementation("com.google.code.findbugs:jsr305:3.0.2") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("javax.validation:validation-api") + implementation("javax.annotation:javax.annotation-api:1.3.2") + testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") + testImplementation("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.jar b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew.bat b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew.bat new file mode 100644 index 000000000000..25da30dbdeee --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/pom.xml b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/pom.xml new file mode 100644 index 000000000000..3fa348144d65 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/pom.xml @@ -0,0 +1,138 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0.0 + + 2.9.2 + 3.0.2 + 1.3.2 + 1.6.21 + + 1.6.21 + UTF-8 + + + org.springframework.boot + spring-boot-starter-parent + 2.7.15 + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 11 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + + + + + io.springfox + springfox-swagger2 + ${springfox-swagger2.version} + + + + + com.google.code.findbugs + jsr305 + ${findbugs-jsr305.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + + javax.validation + validation-api + + + javax.annotation + javax.annotation-api + ${javax-annotation.version} + provided + + + org.jetbrains.kotlin + kotlin-test-junit5 + ${kotlin-test-junit5.version} + test + + + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/settings.gradle b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/settings.gradle new file mode 100644 index 000000000000..14844905cd40 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + maven { url = uri("https://repo.spring.io/snapshot") } + maven { url = uri("https://repo.spring.io/milestone") } + gradlePluginPortal() + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == "org.springframework.boot") { + useModule("org.springframework.boot:spring-boot-gradle-plugin:${requested.version}") + } + } + } +} +rootProject.name = "openapi-spring" diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/Application.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/Application.kt new file mode 100644 index 000000000000..2fe6de62479e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/Application.kt @@ -0,0 +1,13 @@ +package org.openapitools + +import org.springframework.boot.runApplication +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.context.annotation.ComponentScan + +@SpringBootApplication +@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/HomeController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/HomeController.kt new file mode 100644 index 000000000000..310e7f4d62e3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/HomeController.kt @@ -0,0 +1,12 @@ +package org.openapitools + +import org.springframework.context.annotation.Bean +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestMapping + +/** + * Home redirection to OpenAPI api documentation + */ +@Controller +class HomeController { +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt new file mode 100644 index 000000000000..a2628c31c8d7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt @@ -0,0 +1,64 @@ +package org.openapitools + +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.web.util.UriComponentsBuilder +import springfox.documentation.builders.ApiInfoBuilder +import springfox.documentation.builders.RequestHandlerSelectors +import springfox.documentation.service.ApiInfo +import springfox.documentation.service.Contact +import springfox.documentation.spi.DocumentationType +import springfox.documentation.spring.web.paths.Paths +import springfox.documentation.spring.web.paths.RelativePathProvider +import springfox.documentation.spring.web.plugins.Docket +import springfox.documentation.swagger2.annotations.EnableSwagger2 +import javax.servlet.ServletContext + + +@javax.annotation.Generated(value = ["org.openapitools.codegen.languages.KotlinSpringServerCodegen"], comments = "Generator version: 7.18.0-SNAPSHOT") +@Configuration +@EnableSwagger2 +class SpringFoxConfiguration { + + fun apiInfo(): ApiInfo { + return ApiInfoBuilder() + .title("OpenAPI Petstore") + .description("This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.") + .license("Apache-2.0") + .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") + .termsOfServiceUrl("") + .version("1.0.0") + .contact(Contact("", "", "")) + .build() + } + + @Bean + fun customImplementation(servletContext: ServletContext, @Value("\${openapi.openAPIPetstore.base-path:\${api.base-path:/v2}}") basePath: String): Docket { + return Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("org.openapitools.api")) + .build() + .pathProvider(BasePathAwareRelativePathProvider(servletContext, basePath)) + .directModelSubstitute(java.time.LocalDate::class.java, java.sql.Date::class.java) + .directModelSubstitute(java.time.OffsetDateTime::class.java, java.util.Date::class.java) + .apiInfo(apiInfo()) + } + + class BasePathAwareRelativePathProvider(servletContext: ServletContext, private val basePath: String) : + RelativePathProvider(servletContext) { + + override fun applicationPath(): String { + return Paths.removeAdjacentForwardSlashes( + UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString() + ) + } + + override fun getOperationPath(operationPath: String): String { + val uriComponentsBuilder = UriComponentsBuilder.fromPath("/") + return Paths.removeAdjacentForwardSlashes( + uriComponentsBuilder.path(operationPath.replaceFirst("^$basePath", "")).build().toString() + ) + } + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ApiUtil.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ApiUtil.kt new file mode 100644 index 000000000000..88e892d0f49a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ApiUtil.kt @@ -0,0 +1,19 @@ +package org.openapitools.api + +import org.springframework.web.context.request.NativeWebRequest + +import javax.servlet.http.HttpServletResponse +import java.io.IOException + +object ApiUtil { + fun setExampleResponse(req: NativeWebRequest, contentType: String, example: String) { + try { + val res = req.getNativeResponse(HttpServletResponse::class.java) + res?.characterEncoding = "UTF-8" + res?.addHeader("Content-Type", contentType) + res?.writer?.print(example) + } catch (e: IOException) { + throw RuntimeException(e) + } + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/Exceptions.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/Exceptions.kt new file mode 100644 index 000000000000..901db1237ee7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/Exceptions.kt @@ -0,0 +1,30 @@ +package org.openapitools.api + +import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import javax.servlet.http.HttpServletResponse +import javax.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + +@Configuration("org.openapitools.api.DefaultExceptionHandler") +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt new file mode 100644 index 000000000000..0b5ed4395af5 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -0,0 +1,92 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "items", description = "The items API") +class ItemsApiController(@Autowired(required = true) val service: ItemsApiService) { + + + @ApiOperation( + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + nickname = "itemsItemIdSomethingItemSubIdGet", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + response = ItemsItemIdSomethingItemSubIdGet200Response::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], + produces = ["application/json"] + ) + fun itemsItemIdSomethingItemSubIdGet( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + nickname = "itemsPost", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + response = ItemWithDollarAttributesAndExamples::class) + @ApiResponses( + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + fun itemsPost( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.itemsPost(xPostHeader, formDollarName, formDollarValue), HttpStatus.valueOf(201)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt new file mode 100644 index 000000000000..2e8d2a7b6637 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt @@ -0,0 +1,36 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +interface ItemsApiService { + + /** + * GET /items/{item$Id}/something/{item$SubId} : SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * + * @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some (required) + * @param itemDollarSubId SQ = \"; SBS = \\; DBS = \\\\; SD = $some (required) + * @param filterDollarType SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + * @param filterDollarSubType SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + * @param xCustomHeader SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param xCustomHeaderTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param sessionDollarToken SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param sessionDollarTokenTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @return SQ = \"; SBS = \\; DBS = \\\\; SD = $some (status code 200) + * @see ItemsApi#itemsItemIdSomethingItemSubIdGet + */ + fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response + + /** + * POST /items : SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * + * @param xPostHeader SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param formDollarName SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some (optional) + * @param formDollarValue SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") + * @return SQ = \"; SBS = \\; DBS = \\\\; SD = $some (status code 201) + * @see ItemsApi#itemsPost + */ + fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt new file mode 100644 index 000000000000..5753996f7855 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt @@ -0,0 +1,16 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.springframework.stereotype.Service +@Service +class ItemsApiServiceImpl : ItemsApiService { + + override fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response { + TODO("Implement me") + } + + override fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt new file mode 100644 index 000000000000..3da2dce66840 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -0,0 +1,258 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "pet", description = "The pet API") +class PetApiController(@Autowired(required = true) val service: PetApiService) { + + + @ApiOperation( + value = "Add a new pet to the store", + nickname = "addPet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ADD_PET /* "/pet" */], + consumes = ["application/json", "application/xml"] + ) + fun addPet( + @ApiParam(value = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody body: Pet + ): ResponseEntity { + return ResponseEntity(service.addPet(body), HttpStatus.valueOf(405)) + } + + + @ApiOperation( + value = "Deletes a pet", + nickname = "deletePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid pet value")]) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_PET /* "/pet/{petId}" */] + ) + fun deletePet( + @ApiParam(value = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "") @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.deletePet(petId, apiKey), HttpStatus.valueOf(400)) + } + + + @ApiOperation( + value = "Finds Pets by status", + nickname = "findPetsByStatus", + notes = "Multiple status values can be provided with comma separated strings", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByStatus( + @NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(service.findPetsByStatus(status), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Finds Pets by tags", + nickname = "findPetsByTags", + notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByTags( + @NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(service.findPetsByTags(tags), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Get an image", + nickname = "getImage", + notes = "", + response = org.springframework.core.io.Resource::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = org.springframework.core.io.Resource::class)]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_IMAGE /* "/pet/{petId}/getImage" */], + produces = ["application/octet-stream"] + ) + fun getImage( + @ApiParam(value = "ID of pet to get image", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getImage(petId), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Find pet by ID", + nickname = "getPetById", + notes = "Returns a single pet", + response = Pet::class, + authorizations = [Authorization(value = "api_key")]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], + produces = ["application/xml", "application/json"] + ) + fun getPetById( + @ApiParam(value = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getPetById(petId), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Update an existing pet", + nickname = "updatePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_PET /* "/pet" */], + consumes = ["application/json", "application/xml"] + ) + fun updatePet( + @ApiParam(value = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody body: Pet + ): ResponseEntity { + return ResponseEntity(service.updatePet(body), HttpStatus.valueOf(400)) + } + + + @ApiOperation( + value = "Updates a pet in the store with form data", + nickname = "updatePetWithForm", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], + consumes = ["application/x-www-form-urlencoded"] + ) + fun updatePetWithForm( + @ApiParam(value = "ID of pet that needs to be updated", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, + @ApiParam(value = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.updatePetWithForm(petId, name, status), HttpStatus.valueOf(405)) + } + + + @ApiOperation( + value = "uploads an image", + nickname = "uploadFile", + notes = "", + response = ModelApiResponse::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadFile( + @ApiParam(value = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "file detail") @Valid @RequestPart("image", required = true) image: org.springframework.web.multipart.MultipartFile, + @ApiParam(value = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.uploadFile(petId, image, additionalMetadata), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "uploads multiple images", + nickname = "uploadMultipleFile", + notes = "", + response = ModelApiResponse::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_MULTIPLE_FILE /* "/pet/{petId}/uploadMultipleImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadMultipleFile( + @ApiParam(value = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "file detail") @Valid @RequestPart("images", required = true) images: Array, + @ApiParam(value = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.uploadMultipleFile(petId, images, additionalMetadata), HttpStatus.valueOf(200)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ADD_PET: String = "/pet" + const val PATH_DELETE_PET: String = "/pet/{petId}" + const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" + const val PATH_FIND_PETS_BY_TAGS: String = "/pet/findByTags" + const val PATH_GET_IMAGE: String = "/pet/{petId}/getImage" + const val PATH_GET_PET_BY_ID: String = "/pet/{petId}" + const val PATH_UPDATE_PET: String = "/pet" + const val PATH_UPDATE_PET_WITH_FORM: String = "/pet/{petId}" + const val PATH_UPLOAD_FILE: String = "/pet/{petId}/uploadImage" + const val PATH_UPLOAD_MULTIPLE_FILE: String = "/pet/{petId}/uploadMultipleImage" + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiService.kt new file mode 100644 index 000000000000..fe00af396a96 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiService.kt @@ -0,0 +1,114 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet + +interface PetApiService { + + /** + * POST /pet : Add a new pet to the store + * + * @param body Pet object that needs to be added to the store (required) + * @return Invalid input (status code 405) + * @see PetApi#addPet + */ + fun addPet(body: Pet): Unit + + /** + * DELETE /pet/{petId} : Deletes a pet + * + * @param petId Pet id to delete (required) + * @param apiKey (optional) + * @return Invalid pet value (status code 400) + * @see PetApi#deletePet + */ + fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): Unit + + /** + * GET /pet/findByStatus : Finds Pets by status + * Multiple status values can be provided with comma separated strings + * + * @param status Status values that need to be considered for filter (required) + * @return successful operation (status code 200) + * or Invalid status value (status code 400) + * @see PetApi#findPetsByStatus + */ + fun findPetsByStatus(status: kotlin.collections.List): List + + /** + * GET /pet/findByTags : Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * + * @param tags Tags to filter by (required) + * @return successful operation (status code 200) + * or Invalid tag value (status code 400) + * @deprecated + * @see PetApi#findPetsByTags + */ + fun findPetsByTags(tags: kotlin.collections.List): List + + /** + * GET /pet/{petId}/getImage : Get an image + * + * @param petId ID of pet to get image (required) + * @return successful operation (status code 200) + * @see PetApi#getImage + */ + fun getImage(petId: kotlin.Long): org.springframework.core.io.Resource + + /** + * GET /pet/{petId} : Find pet by ID + * Returns a single pet + * + * @param petId ID of pet to return (required) + * @return successful operation (status code 200) + * or Invalid ID supplied (status code 400) + * or Pet not found (status code 404) + * @see PetApi#getPetById + */ + fun getPetById(petId: kotlin.Long): Pet + + /** + * PUT /pet : Update an existing pet + * + * @param body Pet object that needs to be added to the store (required) + * @return Invalid ID supplied (status code 400) + * or Pet not found (status code 404) + * or Validation exception (status code 405) + * @see PetApi#updatePet + */ + fun updatePet(body: Pet): Unit + + /** + * POST /pet/{petId} : Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated (required) + * @param name Updated name of the pet (optional) + * @param status Updated status of the pet (optional) + * @return Invalid input (status code 405) + * @see PetApi#updatePetWithForm + */ + fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): Unit + + /** + * POST /pet/{petId}/uploadImage : uploads an image + * + * @param petId ID of pet to update (required) + * @param image image to upload (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @return successful operation (status code 200) + * @see PetApi#uploadFile + */ + fun uploadFile(petId: kotlin.Long, image: org.springframework.web.multipart.MultipartFile, additionalMetadata: kotlin.String?): ModelApiResponse + + /** + * POST /pet/{petId}/uploadMultipleImage : uploads multiple images + * + * @param petId ID of pet to update (required) + * @param images (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @return successful operation (status code 200) + * @see PetApi#uploadMultipleFile + */ + fun uploadMultipleFile(petId: kotlin.Long, images: Array, additionalMetadata: kotlin.String?): ModelApiResponse +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt new file mode 100644 index 000000000000..5b1b8e57d8be --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt @@ -0,0 +1,48 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.springframework.stereotype.Service +@Service +class PetApiServiceImpl : PetApiService { + + override fun addPet(body: Pet): Unit { + TODO("Implement me") + } + + override fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): Unit { + TODO("Implement me") + } + + override fun findPetsByStatus(status: kotlin.collections.List): List { + TODO("Implement me") + } + + override fun findPetsByTags(tags: kotlin.collections.List): List { + TODO("Implement me") + } + + override fun getImage(petId: kotlin.Long): org.springframework.core.io.Resource { + TODO("Implement me") + } + + override fun getPetById(petId: kotlin.Long): Pet { + TODO("Implement me") + } + + override fun updatePet(body: Pet): Unit { + TODO("Implement me") + } + + override fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): Unit { + TODO("Implement me") + } + + override fun uploadFile(petId: kotlin.Long, image: org.springframework.web.multipart.MultipartFile, additionalMetadata: kotlin.String?): ModelApiResponse { + TODO("Implement me") + } + + override fun uploadMultipleFile(petId: kotlin.Long, images: Array, additionalMetadata: kotlin.String?): ModelApiResponse { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt new file mode 100644 index 000000000000..c3e35118b567 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -0,0 +1,119 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "store", description = "The store API") +class StoreApiController(@Autowired(required = true) val service: StoreApiService) { + + + @ApiOperation( + value = "Delete purchase order by ID", + nickname = "deleteOrder", + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] + ) + fun deleteOrder( + @ApiParam(value = "ID of the order that needs to be deleted", required = true) @PathVariable("orderId") orderId: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.deleteOrder(orderId), HttpStatus.valueOf(400)) + } + + + @ApiOperation( + value = "Returns pet inventories by status", + nickname = "getInventory", + notes = "Returns a map of status codes to quantities", + response = kotlin.Int::class, + responseContainer = "Map", + authorizations = [Authorization(value = "api_key")]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_INVENTORY /* "/store/inventory" */], + produces = ["application/json"] + ) + fun getInventory(): ResponseEntity> { + return ResponseEntity(service.getInventory(), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Find purchase order by ID", + nickname = "getOrderById", + notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions", + response = Order::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], + produces = ["application/xml", "application/json"] + ) + fun getOrderById( + @Min(value=1L) @Max(value=5L) @ApiParam(value = "ID of pet that needs to be fetched", required = true) @PathVariable("orderId") orderId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getOrderById(orderId), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Place an order for a pet", + nickname = "placeOrder", + notes = "", + response = Order::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_PLACE_ORDER /* "/store/order" */], + produces = ["application/xml", "application/json"] + ) + fun placeOrder( + @ApiParam(value = "order placed for purchasing the pet", required = true) @Valid @RequestBody body: Order + ): ResponseEntity { + return ResponseEntity(service.placeOrder(body), HttpStatus.valueOf(200)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" + const val PATH_GET_INVENTORY: String = "/store/inventory" + const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" + const val PATH_PLACE_ORDER: String = "/store/order" + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt new file mode 100644 index 000000000000..60e754529448 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -0,0 +1,48 @@ +package org.openapitools.api + +import org.openapitools.model.Order + +interface StoreApiService { + + /** + * DELETE /store/order/{orderId} : Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * + * @param orderId ID of the order that needs to be deleted (required) + * @return Invalid ID supplied (status code 400) + * or Order not found (status code 404) + * @see StoreApi#deleteOrder + */ + fun deleteOrder(orderId: kotlin.String): Unit + + /** + * GET /store/inventory : Returns pet inventories by status + * Returns a map of status codes to quantities + * + * @return successful operation (status code 200) + * @see StoreApi#getInventory + */ + fun getInventory(): Map + + /** + * GET /store/order/{orderId} : Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * + * @param orderId ID of pet that needs to be fetched (required) + * @return successful operation (status code 200) + * or Invalid ID supplied (status code 400) + * or Order not found (status code 404) + * @see StoreApi#getOrderById + */ + fun getOrderById(orderId: kotlin.Long): Order + + /** + * POST /store/order : Place an order for a pet + * + * @param body order placed for purchasing the pet (required) + * @return successful operation (status code 200) + * or Invalid Order (status code 400) + * @see StoreApi#placeOrder + */ + fun placeOrder(body: Order): Order +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt new file mode 100644 index 000000000000..7e733e28dc50 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt @@ -0,0 +1,23 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.springframework.stereotype.Service +@Service +class StoreApiServiceImpl : StoreApiService { + + override fun deleteOrder(orderId: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getInventory(): Map { + TODO("Implement me") + } + + override fun getOrderById(orderId: kotlin.Long): Order { + TODO("Implement me") + } + + override fun placeOrder(body: Order): Order { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt new file mode 100644 index 000000000000..44a68f6ebf3f --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -0,0 +1,205 @@ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "user", description = "The user API") +class UserApiController(@Autowired(required = true) val service: UserApiService) { + + + @ApiOperation( + value = "Create user", + nickname = "createUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USER /* "/user" */] + ) + fun createUser( + @ApiParam(value = "Created user object", required = true) @Valid @RequestBody body: User + ): ResponseEntity { + return ResponseEntity(service.createUser(body), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithArrayInput", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] + ) + fun createUsersWithArrayInput( + @ApiParam(value = "List of user object", required = true) @Valid @RequestBody body: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(service.createUsersWithArrayInput(body), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithListInput", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] + ) + fun createUsersWithListInput( + @ApiParam(value = "List of user object", required = true) @Valid @RequestBody body: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(service.createUsersWithListInput(body), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Delete user", + nickname = "deleteUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_USER /* "/user/{username}" */] + ) + fun deleteUser( + @ApiParam(value = "The name that needs to be deleted", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.deleteUser(username), HttpStatus.valueOf(400)) + } + + + @ApiOperation( + value = "Get user by user name", + nickname = "getUserByName", + notes = "", + response = User::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], + produces = ["application/xml", "application/json"] + ) + fun getUserByName( + @ApiParam(value = "The name that needs to be fetched. Use user1 for testing.", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.getUserByName(username), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Logs user into the system", + nickname = "loginUser", + notes = "", + response = kotlin.String::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGIN_USER /* "/user/login" */], + produces = ["application/xml", "application/json"] + ) + fun loginUser( + @NotNull @ApiParam(value = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, + @NotNull @ApiParam(value = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.loginUser(username, password), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Logs out current logged in user session", + nickname = "logoutUser", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGOUT_USER /* "/user/logout" */] + ) + fun logoutUser(): ResponseEntity { + return ResponseEntity(service.logoutUser(), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "logoutUserOptions", + nickname = "logoutUserOptions", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "endpoint configuration response")]) + @RequestMapping( + method = [RequestMethod.OPTIONS], + value = [PATH_LOGOUT_USER_OPTIONS /* "/user/logout" */] + ) + fun logoutUserOptions(): ResponseEntity { + return ResponseEntity(service.logoutUserOptions(), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Updated user", + nickname = "updateUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_USER /* "/user/{username}" */] + ) + fun updateUser( + @ApiParam(value = "name that need to be deleted", required = true) @PathVariable("username") username: kotlin.String, + @ApiParam(value = "Updated user object", required = true) @Valid @RequestBody body: User + ): ResponseEntity { + return ResponseEntity(service.updateUser(username, body), HttpStatus.valueOf(400)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_CREATE_USER: String = "/user" + const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" + const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" + const val PATH_DELETE_USER: String = "/user/{username}" + const val PATH_GET_USER_BY_NAME: String = "/user/{username}" + const val PATH_LOGIN_USER: String = "/user/login" + const val PATH_LOGOUT_USER: String = "/user/logout" + const val PATH_LOGOUT_USER_OPTIONS: String = "/user/logout" + const val PATH_UPDATE_USER: String = "/user/{username}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiService.kt new file mode 100644 index 000000000000..6942dc3ede0a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiService.kt @@ -0,0 +1,95 @@ +package org.openapitools.api + +import org.openapitools.model.User + +interface UserApiService { + + /** + * POST /user : Create user + * This can only be done by the logged in user. + * + * @param body Created user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUser + */ + fun createUser(body: User): Unit + + /** + * POST /user/createWithArray : Creates list of users with given input array + * + * @param body List of user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUsersWithArrayInput + */ + fun createUsersWithArrayInput(body: kotlin.collections.List): Unit + + /** + * POST /user/createWithList : Creates list of users with given input array + * + * @param body List of user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUsersWithListInput + */ + fun createUsersWithListInput(body: kotlin.collections.List): Unit + + /** + * DELETE /user/{username} : Delete user + * This can only be done by the logged in user. + * + * @param username The name that needs to be deleted (required) + * @return Invalid username supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#deleteUser + */ + fun deleteUser(username: kotlin.String): Unit + + /** + * GET /user/{username} : Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. (required) + * @return successful operation (status code 200) + * or Invalid username supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#getUserByName + */ + fun getUserByName(username: kotlin.String): User + + /** + * GET /user/login : Logs user into the system + * + * @param username The user name for login (required) + * @param password The password for login in clear text (required) + * @return successful operation (status code 200) + * or Invalid username/password supplied (status code 400) + * @see UserApi#loginUser + */ + fun loginUser(username: kotlin.String, password: kotlin.String): kotlin.String + + /** + * GET /user/logout : Logs out current logged in user session + * + * @return successful operation (status code 200) + * @see UserApi#logoutUser + */ + fun logoutUser(): Unit + + /** + * OPTIONS /user/logout : logoutUserOptions + * + * @return endpoint configuration response (status code 200) + * @see UserApi#logoutUserOptions + */ + fun logoutUserOptions(): Unit + + /** + * PUT /user/{username} : Updated user + * This can only be done by the logged in user. + * + * @param username name that need to be deleted (required) + * @param body Updated user object (required) + * @return Invalid user supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#updateUser + */ + fun updateUser(username: kotlin.String, body: User): Unit +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt new file mode 100644 index 000000000000..f0798bd1695a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt @@ -0,0 +1,43 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.springframework.stereotype.Service +@Service +class UserApiServiceImpl : UserApiService { + + override fun createUser(body: User): Unit { + TODO("Implement me") + } + + override fun createUsersWithArrayInput(body: kotlin.collections.List): Unit { + TODO("Implement me") + } + + override fun createUsersWithListInput(body: kotlin.collections.List): Unit { + TODO("Implement me") + } + + override fun deleteUser(username: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getUserByName(username: kotlin.String): User { + TODO("Implement me") + } + + override fun loginUser(username: kotlin.String, password: kotlin.String): kotlin.String { + TODO("Implement me") + } + + override fun logoutUser(): Unit { + TODO("Implement me") + } + + override fun logoutUserOptions(): Unit { + TODO("Implement me") + } + + override fun updateUser(username: kotlin.String, body: User): Unit { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Category.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Category.kt new file mode 100644 index 000000000000..8514f2c8ba00 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Category.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A category for a pet + * @param id + * @param name + */ +data class Category( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..f09c9e4036f2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..ce959d5caa44 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..f1572d669057 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt new file mode 100644 index 000000000000..58be39aeacfc --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt @@ -0,0 +1,40 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * Describes the result of uploading an image resource + * @param code + * @param type + * @param message + */ +data class ModelApiResponse( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("code") val code: kotlin.Int? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("type") val type: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("message") val message: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Order.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Order.kt new file mode 100644 index 000000000000..c67dc14ec918 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Order.kt @@ -0,0 +1,74 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * An order for a pets from the pet store + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +data class Order( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("petId") val petId: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("quantity") val quantity: kotlin.Int? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null, + + @ApiModelProperty(example = "null", value = "Order Status") + @get:JsonProperty("status") val status: Order.Status? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("complete") val complete: kotlin.Boolean? = false +) : Serializable { + + /** + * Order Status + * Values: placed,approved,delivered + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + placed("placed"), + approved("approved"), + delivered("delivered"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Order'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Pet.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Pet.kt new file mode 100644 index 000000000000..0303d2d9d3d2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Pet.kt @@ -0,0 +1,78 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import org.openapitools.model.Category +import org.openapitools.model.Tag +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A pet for sale in the pet store + * @param name + * @param photoUrls + * @param id + * @param category + * @param tags + * @param status pet status in the store + */ +data class Pet( + + @ApiModelProperty(example = "doggie", required = true, value = "") + @get:JsonProperty("name", required = true) val name: kotlin.String, + + @ApiModelProperty(example = "null", required = true, value = "") + @get:JsonProperty("photoUrls", required = true) val photoUrls: kotlin.collections.List, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("category") val category: Category? = null, + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("tags") val tags: kotlin.collections.List? = null, + + @ApiModelProperty(example = "null", value = "pet status in the store") + @get:JsonProperty("status") val status: Pet.Status? = null +) : Serializable { + + /** + * pet status in the store + * Values: available,pending,sold + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + available("available"), + pending("pending"), + sold("sold"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Pet'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Tag.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Tag.kt new file mode 100644 index 000000000000..d8a5928093c7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Tag.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A tag for a pet + * @param id + * @param name + */ +data class Tag( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/User.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/User.kt new file mode 100644 index 000000000000..8d982852e321 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/User.kt @@ -0,0 +1,60 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A User who is purchasing from the pet store + * @param id + * @param username + * @param firstName + * @param lastName + * @param email + * @param password + * @param phone + * @param userStatus User Status + */ +data class User( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("username") val username: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("firstName") val firstName: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("lastName") val lastName: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("email") val email: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("password") val password: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("phone") val phone: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "User Status") + @get:JsonProperty("userStatus") val userStatus: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/application.yaml b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/application.yaml new file mode 100644 index 000000000000..8e2ebcde976d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/application.yaml @@ -0,0 +1,10 @@ +spring: + application: + name: openAPIPetstore + + jackson: + serialization: + WRITE_DATES_AS_TIMESTAMPS: false + +server: + port: 8080 diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/openapi.yaml b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/openapi.yaml new file mode 100644 index 000000000000..e06418a039f3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/openapi.yaml @@ -0,0 +1,1060 @@ +openapi: 3.0.1 +info: + description: "This is a sample server Petstore server. For this sample, you can\ + \ use the api key `special-key` to test the authorization filters." + license: + name: Apache-2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + title: OpenAPI Petstore + version: 1.0.0 +servers: +- url: http://petstore.swagger.io/v2 +tags: +- description: Everything about your Pets + name: pet +- description: Access to Petstore orders + name: store +- description: Operations about user + name: user +paths: + /pet: + post: + operationId: addPet + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + responses: + "405": + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Add a new pet to the store + tags: + - pet tag + x-codegen-request-body-name: body + put: + operationId: updatePet + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + responses: + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Pet not found + "405": + content: {} + description: Validation exception + security: + - petstore_auth: + - write:pets + - read:pets + summary: Update an existing pet + tags: + - pet tag + x-codegen-request-body-name: body + /pet/findByStatus: + get: + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - description: Status values that need to be considered for filter + explode: false + in: query + name: status + required: true + schema: + items: + default: available + enum: + - available + - pending + - sold + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + content: {} + description: Invalid status value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Finds Pets by status + tags: + - pet tag + x-spring-paginated: true + /pet/findByTags: + get: + deprecated: true + description: "Multiple tags can be provided with comma separated strings. Use\ + \ tag1, tag2, tag3 for testing." + operationId: findPetsByTags + parameters: + - description: Tags to filter by + explode: false + in: query + name: tags + required: true + schema: + items: + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + content: {} + description: Invalid tag value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Finds Pets by tags + tags: + - pet tag + x-spring-paginated: true + /pet/{petId}: + delete: + operationId: deletePet + parameters: + - explode: false + in: header + name: api_key + required: false + schema: + type: string + style: simple + - description: Pet id to delete + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "400": + content: {} + description: Invalid pet value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Deletes a pet + tags: + - pet tag + get: + description: Returns a single pet + operationId: getPetById + parameters: + - description: ID of pet to return + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Pet" + application/json: + schema: + $ref: "#/components/schemas/Pet" + description: successful operation + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Pet not found + security: + - api_key: [] + summary: Find pet by ID + tags: + - pet tag + post: + operationId: updatePetWithForm + parameters: + - description: ID of pet that needs to be updated + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/updatePetWithForm_request" + responses: + "405": + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Updates a pet in the store with form data + tags: + - pet tag + /pet/{petId}/uploadImage: + post: + operationId: uploadFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads an image + tags: + - pet tag + /pet/{petId}/uploadMultipleImage: + post: + operationId: uploadMultipleFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadMultipleFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads multiple images + tags: + - pet tag + /pet/{petId}/getImage: + get: + operationId: getImage + parameters: + - description: ID of pet to get image + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/octet-stream: + schema: + format: binary + type: string + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: Get an image + tags: + - pet tag + /store/inventory: + get: + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + "200": + content: + application/json: + schema: + additionalProperties: + format: int32 + type: integer + type: object + description: successful operation + security: + - api_key: [] + summary: Returns pet inventories by status + tags: + - store tag + /store/order: + post: + operationId: placeOrder + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/Order" + description: order placed for purchasing the pet + required: true + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + content: {} + description: Invalid Order + summary: Place an order for a pet + tags: + - store tag + x-codegen-request-body-name: body + /store/order/{orderId}: + delete: + description: For valid response try integer IDs with value < 1000. Anything + above 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - description: ID of the order that needs to be deleted + explode: false + in: path + name: orderId + required: true + schema: + type: string + style: simple + responses: + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Order not found + summary: Delete purchase order by ID + tags: + - store tag + get: + description: For valid response try integer IDs with value <= 5 or > 10. Other + values will generate exceptions + operationId: getOrderById + parameters: + - description: ID of pet that needs to be fetched + explode: false + in: path + name: orderId + required: true + schema: + format: int64 + maximum: 5 + minimum: 1 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Order not found + summary: Find purchase order by ID + tags: + - store tag + /user: + post: + description: This can only be done by the logged in user. + operationId: createUser + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/User" + description: Created user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Create user + tags: + - user tag + x-codegen-request-body-name: body + /user/createWithArray: + post: + operationId: createUsersWithArrayInput + requestBody: + content: + '*/*': + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Creates list of users with given input array + tags: + - user tag + x-codegen-request-body-name: body + /user/createWithList: + post: + operationId: createUsersWithListInput + requestBody: + content: + '*/*': + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Creates list of users with given input array + tags: + - user tag + x-codegen-request-body-name: body + /user/login: + get: + operationId: loginUser + parameters: + - description: The user name for login + explode: true + in: query + name: username + required: true + schema: + type: string + style: form + - description: The password for login in clear text + explode: true + in: query + name: password + required: true + schema: + type: string + style: form + responses: + "200": + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + description: successful operation + headers: + X-Rate-Limit: + description: calls per hour allowed by the user + explode: false + schema: + format: int32 + type: integer + style: simple + X-Expires-After: + description: date in UTC when token expires + explode: false + schema: + format: date-time + type: string + style: simple + "400": + content: {} + description: Invalid username/password supplied + summary: Logs user into the system + tags: + - user tag + /user/logout: + get: + operationId: logoutUser + responses: + default: + content: {} + description: successful operation + summary: Logs out current logged in user session + tags: + - user tag + options: + operationId: logoutUserOptions + responses: + default: + content: {} + description: endpoint configuration response + summary: logoutUserOptions + tags: + - user tag + /user/{username}: + delete: + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - description: The name that needs to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "400": + content: {} + description: Invalid username supplied + "404": + content: {} + description: User not found + summary: Delete user + tags: + - user tag + get: + operationId: getUserByName + parameters: + - description: The name that needs to be fetched. Use user1 for testing. + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/User" + application/json: + schema: + $ref: "#/components/schemas/User" + description: successful operation + "400": + content: {} + description: Invalid username supplied + "404": + content: {} + description: User not found + summary: Get user by user name + tags: + - user tag + put: + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - description: name that need to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/User" + description: Updated user object + required: true + responses: + "400": + content: {} + description: Invalid user supplied + "404": + content: {} + description: User not found + summary: Updated user + tags: + - user tag + x-codegen-request-body-name: body + /items/{item$Id}/something/{item$SubId}: + get: + description: SQ = "; SBS = \; DBS = \\; SD = $some + parameters: + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: path + name: item$Id + required: true + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: path + name: item$SubId + required: true + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: query + name: filter$Type + required: false + schema: + default: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: query + name: filter$SubType + required: false + schema: + default: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Custom_Header + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Custom_Header_two + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: cookie + name: session$Token + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: cookie + name: session$TokenTwo + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/_items__item_Id__something__item_SubId__get_200_response" + description: SQ = "; SBS = \; DBS = \\; SD = $some + summary: SQ = "; SBS = \; DBS = \\; SD = $some + /items: + post: + description: SQ = "; SBS = \; DBS = \\; SD = $some + parameters: + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Post_Header + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/_items_post_request" + required: true + responses: + "201": + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" + description: SQ = "; SBS = \; DBS = \\; SD = $some + summary: SQ = "; SBS = \; DBS = \\; SD = $some +components: + schemas: + Order: + description: An order for a pets from the pet store + example: + petId: 6 + quantity: 1 + id: 0 + shipDate: 2000-01-23T04:56:07.000+00:00 + complete: false + status: placed + properties: + id: + format: int64 + type: integer + petId: + format: int64 + type: integer + quantity: + format: int32 + type: integer + shipDate: + format: date-time + type: string + status: + description: Order Status + enum: + - placed + - approved + - delivered + type: string + complete: + default: false + type: boolean + title: Pet Order + type: object + xml: + name: Order + Category: + description: A category for a pet + example: + name: name + id: 6 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet category + type: object + xml: + name: Category + User: + description: A User who is purchasing from the pet store + example: + firstName: firstName + lastName: lastName + password: password + userStatus: 6 + phone: phone + id: 0 + email: email + username: username + properties: + id: + format: int64 + type: integer + username: + type: string + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + phone: + type: string + userStatus: + description: User Status + format: int32 + type: integer + title: a User + type: object + xml: + name: User + Tag: + description: A tag for a pet + example: + name: name + id: 1 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet Tag + type: object + xml: + name: Tag + Pet: + description: A pet for sale in the pet store + example: + photoUrls: + - photoUrls + - photoUrls + name: doggie + id: 0 + category: + name: name + id: 6 + tags: + - name: name + id: 1 + - name: name + id: 1 + status: available + properties: + id: + format: int64 + type: integer + category: + $ref: "#/components/schemas/Category" + name: + example: doggie + type: string + photoUrls: + items: + type: string + type: array + xml: + name: photoUrl + wrapped: true + tags: + items: + $ref: "#/components/schemas/Tag" + type: array + xml: + name: tag + wrapped: true + status: + description: pet status in the store + enum: + - available + - pending + - sold + type: string + required: + - name + - photoUrls + title: a Pet + type: object + xml: + name: Pet + ApiResponse: + description: Describes the result of uploading an image resource + example: + code: 0 + type: type + message: message + properties: + code: + format: int32 + type: integer + type: + type: string + message: + type: string + title: An uploaded response + type: object + ItemWithDollarAttributesAndExamples: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: + $name: SQ = "; SBS = \; DBS = \\; SD = $some + $id: SQ = "; SBS = \; DBS = \\; SD = $some + properties: + $id: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + $name: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + type: object + updatePetWithForm_request: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + uploadFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + image: + description: image to upload + format: binary + type: string + required: + - image + uploadMultipleFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + images: + items: + description: image to upload + format: binary + type: string + type: array + required: + - images + _items__item_Id__something__item_SubId__get_200_response_details_Info: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: + detail$One: SQ = "; SBS = \; DBS = \\; SD = $some + detail$Two: 42 + properties: + detail$One: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + detail$Two: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: 42 + type: integer + type: object + _items__item_Id__something__item_SubId__get_200_response: + example: + name$Value: SQ = "; SBS = \; DBS = \\; SD = $some + details$Info: + detail$One: SQ = "; SBS = \; DBS = \\; SD = $some + detail$Two: 42 + item$Id: SQ = "; SBS = \; DBS = \\; SD = $some + properties: + item$Id: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + name$Value: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + details$Info: + $ref: "#/components/schemas/_items__item_Id__something__item_SubId__get_200_response_details_Info" + type: object + _items_post_request: + properties: + form$Name: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + form$Value: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + type: object + securitySchemes: + petstore_auth: + flows: + implicit: + authorizationUrl: http://petstore.swagger.io/api/oauth/dialog + scopes: + write:pets: modify pets in your account + read:pets: read your pets + type: oauth2 + api_key: + in: header + name: api_key + type: apiKey diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt new file mode 100644 index 000000000000..b9dd52637709 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt @@ -0,0 +1,51 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class ItemsApiTest { + + private val service: ItemsApiService = ItemsApiServiceImpl() + private val api: ItemsApiController = ItemsApiController(service) + + /** + * To test ItemsApiController.itemsItemIdSomethingItemSubIdGet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsItemIdSomethingItemSubIdGetTest() { + val itemDollarId: kotlin.String = TODO() + val itemDollarSubId: kotlin.String = TODO() + val filterDollarType: kotlin.String = TODO() + val filterDollarSubType: kotlin.String = TODO() + val xCustomHeader: kotlin.String? = TODO() + val xCustomHeaderTwo: kotlin.String? = TODO() + val sessionDollarToken: kotlin.String? = TODO() + val sessionDollarTokenTwo: kotlin.String? = TODO() + + val response: ResponseEntity = api.itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo) + + // TODO: test validations + } + + /** + * To test ItemsApiController.itemsPost + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsPostTest() { + val xPostHeader: kotlin.String? = TODO() + val formDollarName: kotlin.String? = TODO() + val formDollarValue: kotlin.String = TODO() + + val response: ResponseEntity = api.itemsPost(xPostHeader, formDollarName, formDollarValue) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/PetApiTest.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/PetApiTest.kt new file mode 100644 index 000000000000..2e469407743c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/PetApiTest.kt @@ -0,0 +1,169 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class PetApiTest { + + private val service: PetApiService = PetApiServiceImpl() + private val api: PetApiController = PetApiController(service) + + /** + * To test PetApiController.addPet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun addPetTest() { + val body: Pet = TODO() + + val response: ResponseEntity = api.addPet(body) + + // TODO: test validations + } + + /** + * To test PetApiController.deletePet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deletePetTest() { + val petId: kotlin.Long = TODO() + val apiKey: kotlin.String? = TODO() + + val response: ResponseEntity = api.deletePet(petId, apiKey) + + // TODO: test validations + } + + /** + * To test PetApiController.findPetsByStatus + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun findPetsByStatusTest() { + val status: kotlin.collections.List = TODO() + + val response: ResponseEntity> = api.findPetsByStatus(status) + + // TODO: test validations + } + + /** + * To test PetApiController.findPetsByTags + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun findPetsByTagsTest() { + val tags: kotlin.collections.List = TODO() + + val response: ResponseEntity> = api.findPetsByTags(tags) + + // TODO: test validations + } + + /** + * To test PetApiController.getImage + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getImageTest() { + val petId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getImage(petId) + + // TODO: test validations + } + + /** + * To test PetApiController.getPetById + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getPetByIdTest() { + val petId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getPetById(petId) + + // TODO: test validations + } + + /** + * To test PetApiController.updatePet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updatePetTest() { + val body: Pet = TODO() + + val response: ResponseEntity = api.updatePet(body) + + // TODO: test validations + } + + /** + * To test PetApiController.updatePetWithForm + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updatePetWithFormTest() { + val petId: kotlin.Long = TODO() + val name: kotlin.String? = TODO() + val status: kotlin.String? = TODO() + + val response: ResponseEntity = api.updatePetWithForm(petId, name, status) + + // TODO: test validations + } + + /** + * To test PetApiController.uploadFile + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun uploadFileTest() { + val petId: kotlin.Long = TODO() + val image: org.springframework.web.multipart.MultipartFile = TODO() + val additionalMetadata: kotlin.String? = TODO() + + val response: ResponseEntity = api.uploadFile(petId, image, additionalMetadata) + + // TODO: test validations + } + + /** + * To test PetApiController.uploadMultipleFile + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun uploadMultipleFileTest() { + val petId: kotlin.Long = TODO() + val images: Array = TODO() + val additionalMetadata: kotlin.String? = TODO() + + val response: ResponseEntity = api.uploadMultipleFile(petId, images, additionalMetadata) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/StoreApiTest.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/StoreApiTest.kt new file mode 100644 index 000000000000..b67568e31dab --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/StoreApiTest.kt @@ -0,0 +1,70 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class StoreApiTest { + + private val service: StoreApiService = StoreApiServiceImpl() + private val api: StoreApiController = StoreApiController(service) + + /** + * To test StoreApiController.deleteOrder + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deleteOrderTest() { + val orderId: kotlin.String = TODO() + + val response: ResponseEntity = api.deleteOrder(orderId) + + // TODO: test validations + } + + /** + * To test StoreApiController.getInventory + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getInventoryTest() { + + val response: ResponseEntity> = api.getInventory() + + // TODO: test validations + } + + /** + * To test StoreApiController.getOrderById + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getOrderByIdTest() { + val orderId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getOrderById(orderId) + + // TODO: test validations + } + + /** + * To test StoreApiController.placeOrder + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun placeOrderTest() { + val body: Order = TODO() + + val response: ResponseEntity = api.placeOrder(body) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/UserApiTest.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/UserApiTest.kt new file mode 100644 index 000000000000..d7f7e9523f5f --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/UserApiTest.kt @@ -0,0 +1,146 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class UserApiTest { + + private val service: UserApiService = UserApiServiceImpl() + private val api: UserApiController = UserApiController(service) + + /** + * To test UserApiController.createUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUserTest() { + val body: User = TODO() + + val response: ResponseEntity = api.createUser(body) + + // TODO: test validations + } + + /** + * To test UserApiController.createUsersWithArrayInput + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUsersWithArrayInputTest() { + val body: kotlin.collections.List = TODO() + + val response: ResponseEntity = api.createUsersWithArrayInput(body) + + // TODO: test validations + } + + /** + * To test UserApiController.createUsersWithListInput + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUsersWithListInputTest() { + val body: kotlin.collections.List = TODO() + + val response: ResponseEntity = api.createUsersWithListInput(body) + + // TODO: test validations + } + + /** + * To test UserApiController.deleteUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deleteUserTest() { + val username: kotlin.String = TODO() + + val response: ResponseEntity = api.deleteUser(username) + + // TODO: test validations + } + + /** + * To test UserApiController.getUserByName + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getUserByNameTest() { + val username: kotlin.String = TODO() + + val response: ResponseEntity = api.getUserByName(username) + + // TODO: test validations + } + + /** + * To test UserApiController.loginUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun loginUserTest() { + val username: kotlin.String = TODO() + val password: kotlin.String = TODO() + + val response: ResponseEntity = api.loginUser(username, password) + + // TODO: test validations + } + + /** + * To test UserApiController.logoutUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun logoutUserTest() { + + val response: ResponseEntity = api.logoutUser() + + // TODO: test validations + } + + /** + * To test UserApiController.logoutUserOptions + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun logoutUserOptionsTest() { + + val response: ResponseEntity = api.logoutUserOptions() + + // TODO: test validations + } + + /** + * To test UserApiController.updateUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updateUserTest() { + val username: kotlin.String = TODO() + val body: User = TODO() + + val response: ResponseEntity = api.updateUser(username, body) + + // TODO: test validations + } +} From 8b838c667755f914ac1953307ebc832239311ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 16:23:06 +0100 Subject: [PATCH 16/26] fix compilation error --- .github/workflows/samples-kotlin-server-jdk17.yaml | 1 - .github/workflows/samples-kotlin-server.yaml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/samples-kotlin-server-jdk17.yaml b/.github/workflows/samples-kotlin-server-jdk17.yaml index 589afe3abb27..cd63ee80cd00 100644 --- a/.github/workflows/samples-kotlin-server-jdk17.yaml +++ b/.github/workflows/samples-kotlin-server-jdk17.yaml @@ -37,7 +37,6 @@ jobs: - samples/server/petstore/kotlin-server-required-and-nullable-properties - samples/server/petstore/kotlin-springboot-3 - samples/server/petstore/kotlin-springboot-3-no-response-entity - - samples/server/petstore/kotlin-springboot-dollar-issue-swagger1 - samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2 - samples/server/petstore/kotlin-springboot-additionalproperties - samples/server/petstore/kotlin-springboot-delegate-nodefaults diff --git a/.github/workflows/samples-kotlin-server.yaml b/.github/workflows/samples-kotlin-server.yaml index 0ab8e5389059..5865ec6b38f9 100644 --- a/.github/workflows/samples-kotlin-server.yaml +++ b/.github/workflows/samples-kotlin-server.yaml @@ -41,6 +41,7 @@ jobs: - samples/server/petstore/kotlin-springboot-source-swagger2 - samples/server/petstore/kotlin-springboot-springfox - samples/server/petstore/kotlin-springboot-x-kotlin-implements + - samples/server/petstore/kotlin-springboot-dollar-issue-swagger1 - samples/server/petstore/kotlin-springboot-include-http-request-context-delegate - samples/server/petstore/kotlin-server/ktor - samples/server/petstore/kotlin-server/ktor2 From baefe50fc99f70b634e4af3f73fb08937fd1e1f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 16:33:22 +0100 Subject: [PATCH 17/26] fix one more place --- .../src/main/resources/kotlin-spring/formParams.mustache | 2 +- .../src/main/kotlin/org/openapitools/api/DefaultApiClient.kt | 2 +- .../src/main/kotlin/org/openapitools/api/DefaultApiClient.kt | 2 +- .../src/main/kotlin/org/openapitools/api/DefaultApiClient.kt | 2 +- .../src/main/kotlin/org/openapitools/api/DefaultApiClient.kt | 2 +- .../.openapi-generator/FILES | 4 ---- .../main/kotlin/org/openapitools/api/ItemsApiController.kt | 2 +- 7 files changed, 6 insertions(+), 10 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache index 5ff9f9ef436f..a4d6044d5bff 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache @@ -1 +1 @@ -{{#isFormParam}}{{^isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}KOKO{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}BUBU{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid {{/useBeanValidation}}{{#isModel}}@RequestPart{{/isModel}}{{^isModel}}@RequestParam{{/isModel}}(value = "{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{#isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}") {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "file detail") {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestPart("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{/isFormParam}} \ No newline at end of file +{{#isFormParam}}{{^isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid {{/useBeanValidation}}{{#isModel}}@RequestPart{{/isModel}}{{^isModel}}@RequestParam{{/isModel}}(value = "{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{#isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}") {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "file detail") {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestPart("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{/isFormParam}} \ No newline at end of file diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt index 037f95a5511f..6fe0db391743 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -52,7 +52,7 @@ interface DefaultApi { suspend fun itemsPost( @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, - @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String ): ItemWithDollarAttributesAndExamples companion object { diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt index eb5faf53717d..c6c37b77d436 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -53,7 +53,7 @@ interface DefaultApi { fun itemsPost( @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, - @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String ): Mono> diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt index bc4cd324d67b..0497c8fd65e7 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -51,7 +51,7 @@ interface DefaultApi { fun itemsPost( @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, - @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String ): ResponseEntity diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt index bc4cd324d67b..0497c8fd65e7 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -51,7 +51,7 @@ interface DefaultApi { fun itemsPost( @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, - @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String ): ResponseEntity diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES index 15ef52ad8fe7..8ba65087e770 100644 --- a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES @@ -34,7 +34,3 @@ src/main/kotlin/org/openapitools/model/Tag.kt src/main/kotlin/org/openapitools/model/User.kt src/main/resources/application.yaml src/main/resources/openapi.yaml -src/test/kotlin/org/openapitools/api/ItemsApiTest.kt -src/test/kotlin/org/openapitools/api/PetApiTest.kt -src/test/kotlin/org/openapitools/api/StoreApiTest.kt -src/test/kotlin/org/openapitools/api/UserApiTest.kt diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt index 0932ddeaeeee..2d2f6caffc94 100644 --- a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -74,7 +74,7 @@ class ItemsApiController(@Autowired(required = true) val service: ItemsApiServic fun itemsPost( @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, - @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = BUBU"SQ = \"; SBS = \\; DBS = \\\\; SD = $some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String ): ResponseEntity { return ResponseEntity(service.itemsPost(xPostHeader, formDollarName, formDollarValue), HttpStatus.valueOf(201)) } From acce9f3e9e88f8c927f8c8c29dc1368c20a6edcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 16:47:27 +0100 Subject: [PATCH 18/26] fix incorrect test assert after fixing api spec "required" attribute --- .../codegen/kotlin/spring/KotlinSpringServerCodegenTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index d28873bb0148..60df1a1861a2 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -660,7 +660,7 @@ public void givenMultipartForm_whenGenerateReactiveServer_thenParameterAreCreate Map.of( apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("@Parameter(description = \"Additional data to pass to server\") @Valid @RequestParam(value = \"additionalMetadata\", required = false) additionalMetadata: kotlin.String?", - "@Parameter(description = \"image to upload\") @Valid @RequestPart(\"image\", required = false) image: org.springframework.web.multipart.MultipartFile") + "@Parameter(description = \"image to upload\") @Valid @RequestPart(\"image\", required = true) image: org.springframework.web.multipart.MultipartFile") ) ); } From 6def29079546c0e57fb3c9a5cf5e25a9f93a91cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 17:00:07 +0100 Subject: [PATCH 19/26] try disabling tests --- .../codegen/kotlin/spring/KotlinSpringServerCodegenTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index 60df1a1861a2..fa10bfb256ec 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.models.servers.Server; import org.apache.commons.io.FileUtils; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.openapitools.codegen.ClientOptInput; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.DefaultGenerator; @@ -2585,7 +2586,7 @@ public void testValidationsInQueryParams_issue21238_Api_Delegate() { )); } - + @Disabled @Test public void testDollarsAndQuotesSwagger1() { Path apiSources = generateApiSources( @@ -2676,6 +2677,7 @@ public void testDollarsAndQuotesSwagger1() { )); } + @Disabled @Test public void testDollarsAndQuotesSwagger2() { Path apiSources = generateApiSources( From 378250c9767118cf82a6a6725524edf7112ff086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 17:11:20 +0100 Subject: [PATCH 20/26] comment out the tests to disable them --- .../spring/KotlinSpringServerCodegenTest.java | 347 +++++++++--------- 1 file changed, 174 insertions(+), 173 deletions(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index fa10bfb256ec..7e49213e9b24 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -2586,179 +2586,180 @@ public void testValidationsInQueryParams_issue21238_Api_Delegate() { )); } - @Disabled - @Test - public void testDollarsAndQuotesSwagger1() { - Path apiSources = generateApiSources( - "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", - Map.of( - KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springfox", - KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger1", - KotlinSpringServerCodegen.DELEGATE_PATTERN, true - ), - Map.of( - CodegenConstants.MODELS, "true", - CodegenConstants.MODEL_TESTS, "false", - CodegenConstants.MODEL_DOCS, "false", - CodegenConstants.APIS, "true", - CodegenConstants.SUPPORTING_FILES, "false" - ) - ); - assertGeneratedFilesContain(Map.of( - apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), - List.of("value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", - "@PathVariable(\"item\\$Id\")", - "@PathVariable(\"item\\$SubId\")", - "@RequestParam(value = \"filter\\$Type\"", - "@RequestParam(value = \"filter\\$SubType\"", - "@CookieValue(name = \"session\\$Token\"", - "@CookieValue(name = \"session\\$TokenTwo\"", - "@RequestParam(value = \"form\\$Name\"", - "@RequestParam(value = \"form\\$Value\"", - "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item\\$Id}/something/{item\\$SubId}\"", - "/* \"/items/{item$Id}/something/{item$SubId}\" */" - ), - apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), - List.of( - "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", - "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", - "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", - "@get:JsonProperty(\"details\\$Info\")", - "@param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", - "@param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some" - ), - apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), - List.of( - "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", - "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", - "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", - "* SQ = \"; SBS = \\; DBS = \\\\; SD = $some", - "* @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", - "* @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some" - ) - )); - assertGeneratedFilesNotContain(Map.of( - apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), - List.of( - "SQ = \\\\\";", - "SBS = \\\\\\\\;", - "DBS = \\\\\\\\\\\\\\\\;", - "SD = \\\\$some", - "@PathVariable(\"item$Id\")", - "@PathVariable(\"item$SubId\")", - "@RequestParam(value = \"filter$Type\"", - "@RequestParam(value = \"filter$SubType\"", - "@CookieValue(name = \"session$Token\"", - "@CookieValue(name = \"session$TokenTwo\"", - "@RequestParam(value = \"form$Name\"", - "@RequestParam(value = \"form$Value\"", - "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item$Id}/something/{item$SubId}\"", - "/* \"/items/{item\\$Id}/something/{item\\$SubId}\" */" - ), - apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), - List.of( - "SQ = \\\\\";", - "SBS = \\\\\\\\;", - "DBS = \\\\\\\\\\\\\\\\;", - "SD = \\\\$some", - "item$Id", - "name$Value", - "details$Info" - ), - apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), - List.of( - "SQ = \\\\\";", - "SBS = \\\\\\\\;", - "DBS = \\\\\\\\\\\\\\\\;", - "SD = \\\\$some", - "\"$id\"", - "\"$name\"" - ) - )); - } - - @Disabled - @Test - public void testDollarsAndQuotesSwagger2() { - Path apiSources = generateApiSources( - "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", - Map.of( - KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springdoc", - KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger2", - KotlinSpringServerCodegen.DELEGATE_PATTERN, true - ), - Map.of( - CodegenConstants.MODELS, "true", - CodegenConstants.MODEL_TESTS, "false", - CodegenConstants.MODEL_DOCS, "false", - CodegenConstants.APIS, "true", - CodegenConstants.SUPPORTING_FILES, "false" - ) - ); - assertGeneratedFilesContain(Map.of( - apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), - List.of( - "summary = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", - "description = \"\"\"SQ = \"; SBS = \\; DBS = \\\\; SD = ${'$'}some\"\"\"", - "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$Id\") itemDollarId: kotlin.String", - "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$SubId\") itemDollarSubId: kotlin.String", - "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarType: kotlin.String", - "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarSubType: kotlin.String", - "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header\", required = false) xCustomHeader: kotlin.String?", - "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header_two\", required = false) xCustomHeaderTwo: kotlin.String?", - "@CookieValue(name = \"session\\$Token\", required = false) sessionDollarToken: kotlin.String?", - "@CookieValue(name = \"session\\$TokenTwo\", required = false) sessionDollarTokenTwo: kotlin.String?" - ), - apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), - List.of( - "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", - "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some", - "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", - "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", - "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", - "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", - "@get:JsonProperty(\"details\\$Info\")" - ), - apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), - List.of( - "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", - "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", - "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", - "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"" - ) - )); - assertGeneratedFilesNotContain(Map.of( - apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), - List.of( - "SQ = \\\\\";", - "SBS = \\\\\\\\;", - "DBS = \\\\\\\\\\\\\\\\;", - "SD = \\\\$some", - "@PathVariable(\"item$Id\") itemDollarId: kotlin.String", - "@PathVariable(\"item$SubId\") itemDollarSubId: kotlin.String", - "@RequestParam(value = \"filter$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarType: kotlin.String", - "@RequestParam(value = \"filter$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarSubType: kotlin.String", - "@CookieValue(name = \"session$Token\"", - "@CookieValue(name = \"session$TokenTwo\"" - ), - apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), - List.of( - "SQ = \\\\\";", - "SBS = \\\\\\\\;", - "DBS = \\\\\\\\\\\\\\\\;", - "SD = \\\\$some", - "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some", - "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some" - ), - apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), - List.of( - "SQ = \\\\\";", - "SBS = \\\\\\\\;", - "DBS = \\\\\\\\\\\\\\\\;", - "SD = \\\\$some" - ) - )); - } +// @Disabled +// @Test +// public void testDollarsAndQuotesSwagger1() { +// Path apiSources = generateApiSources( +// "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", +// Map.of( +// KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springfox", +// KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger1", +// KotlinSpringServerCodegen.DELEGATE_PATTERN, true +// ), +// Map.of( +// CodegenConstants.MODELS, "true", +// CodegenConstants.MODEL_TESTS, "false", +// CodegenConstants.MODEL_DOCS, "false", +// CodegenConstants.APIS, "true", +// CodegenConstants.SUPPORTING_FILES, "false" +// ) +// ); +// assertGeneratedFilesContain(Map.of( +// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), +// List.of("value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", +// "@PathVariable(\"item\\$Id\")", +// "@PathVariable(\"item\\$SubId\")", +// "@RequestParam(value = \"filter\\$Type\"", +// "@RequestParam(value = \"filter\\$SubType\"", +// "@CookieValue(name = \"session\\$Token\"", +// "@CookieValue(name = \"session\\$TokenTwo\"", +// "@RequestParam(value = \"form\\$Name\"", +// "@RequestParam(value = \"form\\$Value\"", +// "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item\\$Id}/something/{item\\$SubId}\"", +// "/* \"/items/{item$Id}/something/{item$SubId}\" */" +// ), +// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), +// List.of( +// "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", +// "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", +// "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", +// "@get:JsonProperty(\"details\\$Info\")", +// "@param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", +// "@param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some" +// ), +// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), +// List.of( +// "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", +// "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", +// "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", +// "* SQ = \"; SBS = \\; DBS = \\\\; SD = $some", +// "* @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", +// "* @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some" +// ) +// )); +// assertGeneratedFilesNotContain(Map.of( +// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), +// List.of( +// "SQ = \\\\\";", +// "SBS = \\\\\\\\;", +// "DBS = \\\\\\\\\\\\\\\\;", +// "SD = \\\\$some", +// "@PathVariable(\"item$Id\")", +// "@PathVariable(\"item$SubId\")", +// "@RequestParam(value = \"filter$Type\"", +// "@RequestParam(value = \"filter$SubType\"", +// "@CookieValue(name = \"session$Token\"", +// "@CookieValue(name = \"session$TokenTwo\"", +// "@RequestParam(value = \"form$Name\"", +// "@RequestParam(value = \"form$Value\"", +// "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item$Id}/something/{item$SubId}\"", +// "/* \"/items/{item\\$Id}/something/{item\\$SubId}\" */" +// ), +// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), +// List.of( +// "SQ = \\\\\";", +// "SBS = \\\\\\\\;", +// "DBS = \\\\\\\\\\\\\\\\;", +// "SD = \\\\$some", +// "item$Id", +// "name$Value", +// "details$Info" +// ), +// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), +// List.of( +// "SQ = \\\\\";", +// "SBS = \\\\\\\\;", +// "DBS = \\\\\\\\\\\\\\\\;", +// "SD = \\\\$some", +// "\"$id\"", +// "\"$name\"" +// ) +// )); +// } +// +// @org.junit.Test +// @Disabled +// @Test +// public void testDollarsAndQuotesSwagger2() { +// Path apiSources = generateApiSources( +// "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", +// Map.of( +// KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springdoc", +// KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger2", +// KotlinSpringServerCodegen.DELEGATE_PATTERN, true +// ), +// Map.of( +// CodegenConstants.MODELS, "true", +// CodegenConstants.MODEL_TESTS, "false", +// CodegenConstants.MODEL_DOCS, "false", +// CodegenConstants.APIS, "true", +// CodegenConstants.SUPPORTING_FILES, "false" +// ) +// ); +// assertGeneratedFilesContain(Map.of( +// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), +// List.of( +// "summary = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", +// "description = \"\"\"SQ = \"; SBS = \\; DBS = \\\\; SD = ${'$'}some\"\"\"", +// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$Id\") itemDollarId: kotlin.String", +// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$SubId\") itemDollarSubId: kotlin.String", +// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarType: kotlin.String", +// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarSubType: kotlin.String", +// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header\", required = false) xCustomHeader: kotlin.String?", +// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header_two\", required = false) xCustomHeaderTwo: kotlin.String?", +// "@CookieValue(name = \"session\\$Token\", required = false) sessionDollarToken: kotlin.String?", +// "@CookieValue(name = \"session\\$TokenTwo\", required = false) sessionDollarTokenTwo: kotlin.String?" +// ), +// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), +// List.of( +// "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", +// "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some", +// "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", +// "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", +// "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", +// "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", +// "@get:JsonProperty(\"details\\$Info\")" +// ), +// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), +// List.of( +// "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", +// "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", +// "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", +// "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"" +// ) +// )); +// assertGeneratedFilesNotContain(Map.of( +// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), +// List.of( +// "SQ = \\\\\";", +// "SBS = \\\\\\\\;", +// "DBS = \\\\\\\\\\\\\\\\;", +// "SD = \\\\$some", +// "@PathVariable(\"item$Id\") itemDollarId: kotlin.String", +// "@PathVariable(\"item$SubId\") itemDollarSubId: kotlin.String", +// "@RequestParam(value = \"filter$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarType: kotlin.String", +// "@RequestParam(value = \"filter$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarSubType: kotlin.String", +// "@CookieValue(name = \"session$Token\"", +// "@CookieValue(name = \"session$TokenTwo\"" +// ), +// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), +// List.of( +// "SQ = \\\\\";", +// "SBS = \\\\\\\\;", +// "DBS = \\\\\\\\\\\\\\\\;", +// "SD = \\\\$some", +// "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some", +// "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some" +// ), +// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), +// List.of( +// "SQ = \\\\\";", +// "SBS = \\\\\\\\;", +// "DBS = \\\\\\\\\\\\\\\\;", +// "SD = \\\\$some" +// ) +// )); +// } private Path generateApiSources( String specFilePath, From f4a1cc52ac05a22ccb2a59a604cb91fc034f11c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 17:24:23 +0100 Subject: [PATCH 21/26] fix tests on linux --- .../spring/KotlinSpringServerCodegenTest.java | 346 +++++++++--------- 1 file changed, 171 insertions(+), 175 deletions(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index 7e49213e9b24..6fa996631a5d 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -6,7 +6,6 @@ import io.swagger.v3.oas.models.servers.Server; import org.apache.commons.io.FileUtils; import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.openapitools.codegen.ClientOptInput; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.DefaultGenerator; @@ -2586,180 +2585,177 @@ public void testValidationsInQueryParams_issue21238_Api_Delegate() { )); } -// @Disabled -// @Test -// public void testDollarsAndQuotesSwagger1() { -// Path apiSources = generateApiSources( -// "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", -// Map.of( -// KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springfox", -// KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger1", -// KotlinSpringServerCodegen.DELEGATE_PATTERN, true -// ), -// Map.of( -// CodegenConstants.MODELS, "true", -// CodegenConstants.MODEL_TESTS, "false", -// CodegenConstants.MODEL_DOCS, "false", -// CodegenConstants.APIS, "true", -// CodegenConstants.SUPPORTING_FILES, "false" -// ) -// ); -// assertGeneratedFilesContain(Map.of( -// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), -// List.of("value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", -// "@PathVariable(\"item\\$Id\")", -// "@PathVariable(\"item\\$SubId\")", -// "@RequestParam(value = \"filter\\$Type\"", -// "@RequestParam(value = \"filter\\$SubType\"", -// "@CookieValue(name = \"session\\$Token\"", -// "@CookieValue(name = \"session\\$TokenTwo\"", -// "@RequestParam(value = \"form\\$Name\"", -// "@RequestParam(value = \"form\\$Value\"", -// "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item\\$Id}/something/{item\\$SubId}\"", -// "/* \"/items/{item$Id}/something/{item$SubId}\" */" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), -// List.of( -// "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", -// "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", -// "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", -// "@get:JsonProperty(\"details\\$Info\")", -// "@param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", -// "@param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), -// List.of( -// "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", -// "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", -// "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", -// "* SQ = \"; SBS = \\; DBS = \\\\; SD = $some", -// "* @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", -// "* @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some" -// ) -// )); -// assertGeneratedFilesNotContain(Map.of( -// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some", -// "@PathVariable(\"item$Id\")", -// "@PathVariable(\"item$SubId\")", -// "@RequestParam(value = \"filter$Type\"", -// "@RequestParam(value = \"filter$SubType\"", -// "@CookieValue(name = \"session$Token\"", -// "@CookieValue(name = \"session$TokenTwo\"", -// "@RequestParam(value = \"form$Name\"", -// "@RequestParam(value = \"form$Value\"", -// "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item$Id}/something/{item$SubId}\"", -// "/* \"/items/{item\\$Id}/something/{item\\$SubId}\" */" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some", -// "item$Id", -// "name$Value", -// "details$Info" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some", -// "\"$id\"", -// "\"$name\"" -// ) -// )); -// } -// -// @org.junit.Test -// @Disabled -// @Test -// public void testDollarsAndQuotesSwagger2() { -// Path apiSources = generateApiSources( -// "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", -// Map.of( -// KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springdoc", -// KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger2", -// KotlinSpringServerCodegen.DELEGATE_PATTERN, true -// ), -// Map.of( -// CodegenConstants.MODELS, "true", -// CodegenConstants.MODEL_TESTS, "false", -// CodegenConstants.MODEL_DOCS, "false", -// CodegenConstants.APIS, "true", -// CodegenConstants.SUPPORTING_FILES, "false" -// ) -// ); -// assertGeneratedFilesContain(Map.of( -// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), -// List.of( -// "summary = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", -// "description = \"\"\"SQ = \"; SBS = \\; DBS = \\\\; SD = ${'$'}some\"\"\"", -// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$Id\") itemDollarId: kotlin.String", -// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$SubId\") itemDollarSubId: kotlin.String", -// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarType: kotlin.String", -// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarSubType: kotlin.String", -// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header\", required = false) xCustomHeader: kotlin.String?", -// "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header_two\", required = false) xCustomHeaderTwo: kotlin.String?", -// "@CookieValue(name = \"session\\$Token\", required = false) sessionDollarToken: kotlin.String?", -// "@CookieValue(name = \"session\\$TokenTwo\", required = false) sessionDollarTokenTwo: kotlin.String?" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), -// List.of( -// "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", -// "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some", -// "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", -// "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", -// "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", -// "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", -// "@get:JsonProperty(\"details\\$Info\")" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), -// List.of( -// "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", -// "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", -// "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", -// "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"" -// ) -// )); -// assertGeneratedFilesNotContain(Map.of( -// apiSources.resolve("src/main/kotlin/org/openapitools/api/itemsApi.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some", -// "@PathVariable(\"item$Id\") itemDollarId: kotlin.String", -// "@PathVariable(\"item$SubId\") itemDollarSubId: kotlin.String", -// "@RequestParam(value = \"filter$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarType: kotlin.String", -// "@RequestParam(value = \"filter$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarSubType: kotlin.String", -// "@CookieValue(name = \"session$Token\"", -// "@CookieValue(name = \"session$TokenTwo\"" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some", -// "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some", -// "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some" -// ), -// apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), -// List.of( -// "SQ = \\\\\";", -// "SBS = \\\\\\\\;", -// "DBS = \\\\\\\\\\\\\\\\;", -// "SD = \\\\$some" -// ) -// )); -// } + @Test + public void testDollarsAndQuotesSwagger1() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", + Map.of( + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springfox", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger1", + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + ) + ); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ItemsApi.kt"), + List.of("value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@PathVariable(\"item\\$Id\")", + "@PathVariable(\"item\\$SubId\")", + "@RequestParam(value = \"filter\\$Type\"", + "@RequestParam(value = \"filter\\$SubType\"", + "@CookieValue(name = \"session\\$Token\"", + "@CookieValue(name = \"session\\$TokenTwo\"", + "@RequestParam(value = \"form\\$Name\"", + "@RequestParam(value = \"form\\$Value\"", + "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item\\$Id}/something/{item\\$SubId}\"", + "/* \"/items/{item$Id}/something/{item$SubId}\" */" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"details\\$Info\")", + "@param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "@param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "* SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "* @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "* @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + ) + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ItemsApi.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "@PathVariable(\"item$Id\")", + "@PathVariable(\"item$SubId\")", + "@RequestParam(value = \"filter$Type\"", + "@RequestParam(value = \"filter$SubType\"", + "@CookieValue(name = \"session$Token\"", + "@CookieValue(name = \"session$TokenTwo\"", + "@RequestParam(value = \"form$Name\"", + "@RequestParam(value = \"form$Value\"", + "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item$Id}/something/{item$SubId}\"", + "/* \"/items/{item\\$Id}/something/{item\\$SubId}\" */" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "item$Id", + "name$Value", + "details$Info" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "\"$id\"", + "\"$name\"" + ) + )); + } + + @Test + public void testDollarsAndQuotesSwagger2() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", + Map.of( + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springdoc", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger2", + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + ) + ); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ItemsApi.kt"), + List.of( + "summary = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "description = \"\"\"SQ = \"; SBS = \\; DBS = \\\\; SD = ${'$'}some\"\"\"", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$Id\") itemDollarId: kotlin.String", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$SubId\") itemDollarSubId: kotlin.String", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarType: kotlin.String", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarSubType: kotlin.String", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header\", required = false) xCustomHeader: kotlin.String?", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header_two\", required = false) xCustomHeaderTwo: kotlin.String?", + "@CookieValue(name = \"session\\$Token\", required = false) sessionDollarToken: kotlin.String?", + "@CookieValue(name = \"session\\$TokenTwo\", required = false) sessionDollarTokenTwo: kotlin.String?" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", + "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", + "@get:JsonProperty(\"details\\$Info\")" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", + "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"" + ) + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ItemsApi.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "@PathVariable(\"item$Id\") itemDollarId: kotlin.String", + "@PathVariable(\"item$SubId\") itemDollarSubId: kotlin.String", + "@RequestParam(value = \"filter$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarType: kotlin.String", + "@RequestParam(value = \"filter$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarSubType: kotlin.String", + "@CookieValue(name = \"session$Token\"", + "@CookieValue(name = \"session$TokenTwo\"" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some", + "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some" + ) + )); + } private Path generateApiSources( String specFilePath, From c350638c9c61a505c2eee693568b5b8c988d2d3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Thu, 27 Nov 2025 17:32:00 +0100 Subject: [PATCH 22/26] also add compile tests for interface_only to show multiline dollar escaping --- .../samples-kotlin-server-jdk17.yaml | 1 + ...-dollar-issue-swagger2-interface-only.yaml | 14 + .../.openapi-generator-ignore | 23 ++ .../.openapi-generator/FILES | 25 ++ .../.openapi-generator/VERSION | 1 + .../README.md | 21 ++ .../build.gradle.kts | 47 ++++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../gradlew | 249 ++++++++++++++++++ .../gradlew.bat | 92 +++++++ .../pom.xml | 149 +++++++++++ .../settings.gradle | 15 ++ .../openapitools/SpringDocConfiguration.kt | 42 +++ .../kotlin/org/openapitools/api/ApiUtil.kt | 19 ++ .../kotlin/org/openapitools/api/Exceptions.kt | 30 +++ .../kotlin/org/openapitools/api/ItemsApi.kt | 99 +++++++ .../kotlin/org/openapitools/api/PetApi.kt | 238 +++++++++++++++++ .../kotlin/org/openapitools/api/StoreApi.kt | 133 ++++++++++ .../kotlin/org/openapitools/api/UserApi.kt | 223 ++++++++++++++++ .../kotlin/org/openapitools/model/Category.kt | 37 +++ .../ItemWithDollarAttributesAndExamples.kt | 36 +++ ...sItemIdSomethingItemSubIdGet200Response.kt | 42 +++ ...thingItemSubIdGet200ResponseDetailsInfo.kt | 36 +++ .../openapitools/model/ModelApiResponse.kt | 40 +++ .../kotlin/org/openapitools/model/Order.kt | 74 ++++++ .../main/kotlin/org/openapitools/model/Pet.kt | 79 ++++++ .../main/kotlin/org/openapitools/model/Tag.kt | 36 +++ .../kotlin/org/openapitools/model/User.kt | 60 +++++ 29 files changed, 1868 insertions(+) create mode 100644 bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2-interface-only.yaml create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator-ignore create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/VERSION create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/README.md create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/build.gradle.kts create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.properties create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew.bat create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/pom.xml create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/settings.gradle create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ApiUtil.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/Exceptions.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ItemsApi.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/PetApi.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/StoreApi.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/UserApi.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Category.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Order.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Pet.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Tag.kt create mode 100644 samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/User.kt diff --git a/.github/workflows/samples-kotlin-server-jdk17.yaml b/.github/workflows/samples-kotlin-server-jdk17.yaml index cd63ee80cd00..a95a26de17de 100644 --- a/.github/workflows/samples-kotlin-server-jdk17.yaml +++ b/.github/workflows/samples-kotlin-server-jdk17.yaml @@ -38,6 +38,7 @@ jobs: - samples/server/petstore/kotlin-springboot-3 - samples/server/petstore/kotlin-springboot-3-no-response-entity - samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2 + - samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only - samples/server/petstore/kotlin-springboot-additionalproperties - samples/server/petstore/kotlin-springboot-delegate-nodefaults - samples/server/petstore/kotlin-springboot-request-cookie diff --git a/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2-interface-only.yaml b/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2-interface-only.yaml new file mode 100644 index 000000000000..5a42e32a9666 --- /dev/null +++ b/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2-interface-only.yaml @@ -0,0 +1,14 @@ +generatorName: kotlin-spring +outputDir: samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only +library: spring-boot +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml +templateDir: modules/openapi-generator/src/main/resources/kotlin-spring +additionalProperties: + documentationProvider: springDoc + annotationLibrary: swagger2 + useSwaggerUI: "false" + interfaceOnly: "true" + serializableModel: "true" + beanValidations: "true" + useSpringBoot3: "true" + requestMappingMode: api_interface diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator-ignore b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES new file mode 100644 index 000000000000..fae00c58b99b --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES @@ -0,0 +1,25 @@ +.openapi-generator-ignore +README.md +build.gradle.kts +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +pom.xml +settings.gradle +src/main/kotlin/org/openapitools/SpringDocConfiguration.kt +src/main/kotlin/org/openapitools/api/ApiUtil.kt +src/main/kotlin/org/openapitools/api/Exceptions.kt +src/main/kotlin/org/openapitools/api/ItemsApi.kt +src/main/kotlin/org/openapitools/api/PetApi.kt +src/main/kotlin/org/openapitools/api/StoreApi.kt +src/main/kotlin/org/openapitools/api/UserApi.kt +src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt +src/main/kotlin/org/openapitools/model/ModelApiResponse.kt +src/main/kotlin/org/openapitools/model/Order.kt +src/main/kotlin/org/openapitools/model/Pet.kt +src/main/kotlin/org/openapitools/model/Tag.kt +src/main/kotlin/org/openapitools/model/User.kt diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/VERSION b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/VERSION new file mode 100644 index 000000000000..2fb556b60635 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.18.0-SNAPSHOT diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/README.md b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/README.md new file mode 100644 index 000000000000..b6865a081135 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/README.md @@ -0,0 +1,21 @@ +# openAPIPetstore + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/openapi-spring-1.0.0.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/openapi-spring-1.0.0.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/build.gradle.kts b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/build.gradle.kts new file mode 100644 index 000000000000..a064415b6540 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/build.gradle.kts @@ -0,0 +1,47 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +group = "org.openapitools" +version = "1.0.0" +java.sourceCompatibility = JavaVersion.VERSION_17 + +repositories { + mavenCentral() + maven { url = uri("https://repo.spring.io/milestone") } +} + +tasks.withType { + kotlinOptions.jvmTarget = "17" +} + +tasks.bootJar { + enabled = false +} + +plugins { + val kotlinVersion = "1.9.25" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "3.0.2" + id("io.spring.dependency-management") version "1.0.14.RELEASE" +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springdoc:springdoc-openapi-starter-webmvc-api:2.6.0") + + implementation("com.google.code.findbugs:jsr305:3.0.2") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("jakarta.validation:jakarta.validation-api") + implementation("jakarta.annotation:jakarta.annotation-api:2.1.0") + + testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") + testImplementation("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.jar b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew.bat b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew.bat new file mode 100644 index 000000000000..25da30dbdeee --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/pom.xml b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/pom.xml new file mode 100644 index 000000000000..d3d44b8d2b04 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/pom.xml @@ -0,0 +1,149 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0.0 + + 3.0.2 + 2.1.0 + 1.7.10 + + 1.7.10 + UTF-8 + + + org.springframework.boot + spring-boot-starter-parent + 3.1.3 + + + + repository.spring.milestone + Spring Milestone Repository + https://repo.spring.io/milestone + + + + + spring-milestones + https://repo.spring.io/milestone + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 17 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springdoc + springdoc-openapi-webmvc-core + ${springdoc-openapi.version} + + + + + com.google.code.findbugs + jsr305 + ${findbugs-jsr305.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + + jakarta.validation + jakarta.validation-api + + + jakarta.annotation + jakarta.annotation-api + ${jakarta-annotation.version} + provided + + + org.jetbrains.kotlin + kotlin-test-junit5 + ${kotlin-test-junit5.version} + test + + + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/settings.gradle b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/settings.gradle new file mode 100644 index 000000000000..14844905cd40 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + maven { url = uri("https://repo.spring.io/snapshot") } + maven { url = uri("https://repo.spring.io/milestone") } + gradlePluginPortal() + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == "org.springframework.boot") { + useModule("org.springframework.boot:spring-boot-gradle-plugin:${requested.version}") + } + } + } +} +rootProject.name = "openapi-spring" diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt new file mode 100644 index 000000000000..ab4d5eb17b86 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt @@ -0,0 +1,42 @@ +package org.openapitools + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +import io.swagger.v3.oas.models.OpenAPI +import io.swagger.v3.oas.models.info.Info +import io.swagger.v3.oas.models.info.Contact +import io.swagger.v3.oas.models.info.License +import io.swagger.v3.oas.models.Components +import io.swagger.v3.oas.models.security.SecurityScheme + +@Configuration +class SpringDocConfiguration { + + @Bean + fun apiInfo(): OpenAPI { + return OpenAPI() + .info( + Info() + .title("OpenAPI Petstore") + .description("This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.") + .license( + License() + .name("Apache-2.0") + .url("https://www.apache.org/licenses/LICENSE-2.0.html") + ) + .version("1.0.0") + ) + .components( + Components() + .addSecuritySchemes("petstore_auth", SecurityScheme() + .type(SecurityScheme.Type.OAUTH2) + ) + .addSecuritySchemes("api_key", SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .`in`(SecurityScheme.In.HEADER) + .name("api_key") + ) + ) + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ApiUtil.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ApiUtil.kt new file mode 100644 index 000000000000..03344e13b474 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ApiUtil.kt @@ -0,0 +1,19 @@ +package org.openapitools.api + +import org.springframework.web.context.request.NativeWebRequest + +import jakarta.servlet.http.HttpServletResponse +import java.io.IOException + +object ApiUtil { + fun setExampleResponse(req: NativeWebRequest, contentType: String, example: String) { + try { + val res = req.getNativeResponse(HttpServletResponse::class.java) + res?.characterEncoding = "UTF-8" + res?.addHeader("Content-Type", contentType) + res?.writer?.print(example) + } catch (e: IOException) { + throw RuntimeException(e) + } + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/Exceptions.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/Exceptions.kt new file mode 100644 index 000000000000..1bd78f54576a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/Exceptions.kt @@ -0,0 +1,30 @@ +package org.openapitools.api + +import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import jakarta.servlet.http.HttpServletResponse +import jakarta.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + +@Configuration("org.openapitools.api.DefaultExceptionHandler") +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ItemsApi.kt new file mode 100644 index 000000000000..25d8fa0f4ed9 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -0,0 +1,99 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.ItemsApi.Companion.BASE_PATH + +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +interface ItemsApi { + + @Operation( + tags = ["default",], + summary = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + operationId = "itemsItemIdSomethingItemSubIdGet", + description = """SQ = "; SBS = \; DBS = \\; SD = ${'$'}some""", + responses = [ + ApiResponse(responseCode = "200", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", content = [Content(schema = Schema(implementation = ItemsItemIdSomethingItemSubIdGet200Response::class))]) + ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], + produces = ["application/json"] + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["default",], + summary = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + operationId = "itemsPost", + description = """SQ = "; SBS = \; DBS = \\; SD = ${'$'}some""", + responses = [ + ApiResponse(responseCode = "201", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", content = [Content(schema = Schema(implementation = ItemWithDollarAttributesAndExamples::class))]) + ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/PetApi.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/PetApi.kt new file mode 100644 index 000000000000..80daa9dac69d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/PetApi.kt @@ -0,0 +1,238 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.PetApi.Companion.BASE_PATH + +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +interface PetApi { + + @Operation( + tags = ["pet",], + summary = "Add a new pet to the store", + operationId = "addPet", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Pet::class))]), + ApiResponse(responseCode = "405", description = "Invalid input") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ADD_PET /* "/pet" */], + produces = ["application/xml", "application/json"], + consumes = ["application/json", "application/xml"] + ) + fun addPet( + @Parameter(description = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody pet: Pet + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Deletes a pet", + operationId = "deletePet", + description = """""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid pet value") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_PET /* "/pet/{petId}" */] + ) + fun deletePet( + @Parameter(description = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "", `in` = ParameterIn.HEADER) @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String? + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Finds Pets by status", + operationId = "findPetsByStatus", + description = """Multiple status values can be provided with comma separated strings""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(array = ArraySchema(schema = Schema(implementation = Pet::class)))]), + ApiResponse(responseCode = "400", description = "Invalid status value") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByStatus( + @NotNull @Parameter(description = "Status values that need to be considered for filter", required = true, schema = Schema(allowableValues = ["available", "pending", "sold"])) @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Finds Pets by tags", + operationId = "findPetsByTags", + description = """Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(array = ArraySchema(schema = Schema(implementation = Pet::class)))]), + ApiResponse(responseCode = "400", description = "Invalid tag value") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByTags( + @NotNull @Parameter(description = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Find pet by ID", + operationId = "getPetById", + description = """Returns a single pet""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Pet::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Pet not found") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], + produces = ["application/xml", "application/json"] + ) + fun getPetById( + @Parameter(description = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Update an existing pet", + operationId = "updatePet", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Pet::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Pet not found"), + ApiResponse(responseCode = "405", description = "Validation exception") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_PET /* "/pet" */], + produces = ["application/xml", "application/json"], + consumes = ["application/json", "application/xml"] + ) + fun updatePet( + @Parameter(description = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody pet: Pet + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Updates a pet in the store with form data", + operationId = "updatePetWithForm", + description = """""", + responses = [ + ApiResponse(responseCode = "405", description = "Invalid input") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], + consumes = ["application/x-www-form-urlencoded"] + ) + fun updatePetWithForm( + @Parameter(description = "ID of pet that needs to be updated", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, + @Parameter(description = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String? + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "uploads an image", + operationId = "uploadFile", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = ModelApiResponse::class))]) + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadFile( + @Parameter(description = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String?, + @Parameter(description = "file to upload") @Valid @RequestPart("file", required = false) file: org.springframework.web.multipart.MultipartFile + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_ADD_PET: String = "/pet" + const val PATH_DELETE_PET: String = "/pet/{petId}" + const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" + const val PATH_FIND_PETS_BY_TAGS: String = "/pet/findByTags" + const val PATH_GET_PET_BY_ID: String = "/pet/{petId}" + const val PATH_UPDATE_PET: String = "/pet" + const val PATH_UPDATE_PET_WITH_FORM: String = "/pet/{petId}" + const val PATH_UPLOAD_FILE: String = "/pet/{petId}/uploadImage" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/StoreApi.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/StoreApi.kt new file mode 100644 index 000000000000..abcae142295a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/StoreApi.kt @@ -0,0 +1,133 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.StoreApi.Companion.BASE_PATH + +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +interface StoreApi { + + @Operation( + tags = ["store",], + summary = "Delete purchase order by ID", + operationId = "deleteOrder", + description = """For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Order not found") + ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] + ) + fun deleteOrder( + @Parameter(description = "ID of the order that needs to be deleted", required = true) @PathVariable("orderId") orderId: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["store",], + summary = "Returns pet inventories by status", + operationId = "getInventory", + description = """Returns a map of status codes to quantities""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = kotlin.collections.Map::class))]) + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_INVENTORY /* "/store/inventory" */], + produces = ["application/json"] + ) + fun getInventory(): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["store",], + summary = "Find purchase order by ID", + operationId = "getOrderById", + description = """For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Order::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Order not found") + ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], + produces = ["application/xml", "application/json"] + ) + fun getOrderById( + @Min(value=1L) @Max(value=5L) @Parameter(description = "ID of pet that needs to be fetched", required = true) @PathVariable("orderId") orderId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["store",], + summary = "Place an order for a pet", + operationId = "placeOrder", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Order::class))]), + ApiResponse(responseCode = "400", description = "Invalid Order") + ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_PLACE_ORDER /* "/store/order" */], + produces = ["application/xml", "application/json"], + consumes = ["application/json"] + ) + fun placeOrder( + @Parameter(description = "order placed for purchasing the pet", required = true) @Valid @RequestBody order: Order + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" + const val PATH_GET_INVENTORY: String = "/store/inventory" + const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" + const val PATH_PLACE_ORDER: String = "/store/order" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/UserApi.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/UserApi.kt new file mode 100644 index 000000000000..587f3b5817ca --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/UserApi.kt @@ -0,0 +1,223 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.UserApi.Companion.BASE_PATH + +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +interface UserApi { + + @Operation( + tags = ["user",], + summary = "Create user", + operationId = "createUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USER /* "/user" */], + consumes = ["application/json"] + ) + fun createUser( + @Parameter(description = "Created user object", required = true) @Valid @RequestBody user: User + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Creates list of users with given input array", + operationId = "createUsersWithArrayInput", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */], + consumes = ["application/json"] + ) + fun createUsersWithArrayInput( + @Parameter(description = "List of user object", required = true) @Valid @RequestBody user: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Creates list of users with given input array", + operationId = "createUsersWithListInput", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */], + consumes = ["application/json"] + ) + fun createUsersWithListInput( + @Parameter(description = "List of user object", required = true) @Valid @RequestBody user: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Delete user", + operationId = "deleteUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid username supplied"), + ApiResponse(responseCode = "404", description = "User not found") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_USER /* "/user/{username}" */] + ) + fun deleteUser( + @Parameter(description = "The name that needs to be deleted", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Get user by user name", + operationId = "getUserByName", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = User::class))]), + ApiResponse(responseCode = "400", description = "Invalid username supplied"), + ApiResponse(responseCode = "404", description = "User not found") + ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], + produces = ["application/xml", "application/json"] + ) + fun getUserByName( + @Parameter(description = "The name that needs to be fetched. Use user1 for testing.", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Logs user into the system", + operationId = "loginUser", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = kotlin.String::class))]), + ApiResponse(responseCode = "400", description = "Invalid username/password supplied") + ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGIN_USER /* "/user/login" */], + produces = ["application/xml", "application/json"] + ) + fun loginUser( + @NotNull @Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") @Parameter(description = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, + @NotNull @Parameter(description = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Logs out current logged in user session", + operationId = "logoutUser", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGOUT_USER /* "/user/logout" */] + ) + fun logoutUser(): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Updated user", + operationId = "updateUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid user supplied"), + ApiResponse(responseCode = "404", description = "User not found") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_USER /* "/user/{username}" */], + consumes = ["application/json"] + ) + fun updateUser( + @Parameter(description = "name that need to be deleted", required = true) @PathVariable("username") username: kotlin.String, + @Parameter(description = "Updated user object", required = true) @Valid @RequestBody user: User + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_CREATE_USER: String = "/user" + const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" + const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" + const val PATH_DELETE_USER: String = "/user/{username}" + const val PATH_GET_USER_BY_NAME: String = "/user/{username}" + const val PATH_LOGIN_USER: String = "/user/login" + const val PATH_LOGOUT_USER: String = "/user/logout" + const val PATH_UPDATE_USER: String = "/user/{username}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Category.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Category.kt new file mode 100644 index 000000000000..4d38e2f38b0c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Category.kt @@ -0,0 +1,37 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A category for a pet + * @param id + * @param name + */ +data class Category( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @get:Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") + @Schema(example = "null", description = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt new file mode 100644 index 000000000000..b94f16fe0c34 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt @@ -0,0 +1,40 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * Describes the result of uploading an image resource + * @param code + * @param type + * @param message + */ +data class ModelApiResponse( + + @Schema(example = "null", description = "") + @get:JsonProperty("code") val code: kotlin.Int? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("type") val type: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("message") val message: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Order.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Order.kt new file mode 100644 index 000000000000..f1f9dd136e4d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Order.kt @@ -0,0 +1,74 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * An order for a pets from the pet store + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +data class Order( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("petId") val petId: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("quantity") val quantity: kotlin.Int? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null, + + @Schema(example = "null", description = "Order Status") + @get:JsonProperty("status") val status: Order.Status? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("complete") val complete: kotlin.Boolean? = false +) : Serializable { + + /** + * Order Status + * Values: placed,approved,delivered + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + placed("placed"), + approved("approved"), + delivered("delivered"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Order'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Pet.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Pet.kt new file mode 100644 index 000000000000..e644f12f163d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Pet.kt @@ -0,0 +1,79 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import org.openapitools.model.Category +import org.openapitools.model.Tag +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A pet for sale in the pet store + * @param name + * @param photoUrls + * @param id + * @param category + * @param tags + * @param status pet status in the store + */ +data class Pet( + + @Schema(example = "doggie", required = true, description = "") + @get:JsonProperty("name", required = true) val name: kotlin.String, + + @Schema(example = "null", required = true, description = "") + @get:JsonProperty("photoUrls", required = true) val photoUrls: kotlin.collections.List, + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("category") val category: Category? = null, + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("tags") val tags: kotlin.collections.List? = null, + + @Schema(example = "null", description = "pet status in the store") + @Deprecated(message = "") + @get:JsonProperty("status") val status: Pet.Status? = null +) : Serializable { + + /** + * pet status in the store + * Values: available,pending,sold + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + available("available"), + pending("pending"), + sold("sold"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Pet'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Tag.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Tag.kt new file mode 100644 index 000000000000..9aeefda7ac75 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Tag.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A tag for a pet + * @param id + * @param name + */ +data class Tag( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/User.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/User.kt new file mode 100644 index 000000000000..3824ce08a5b2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/User.kt @@ -0,0 +1,60 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A User who is purchasing from the pet store + * @param id + * @param username + * @param firstName + * @param lastName + * @param email + * @param password + * @param phone + * @param userStatus User Status + */ +data class User( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("username") val username: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("firstName") val firstName: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("lastName") val lastName: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("email") val email: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("password") val password: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("phone") val phone: kotlin.String? = null, + + @Schema(example = "null", description = "User Status") + @get:JsonProperty("userStatus") val userStatus: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + From bd6c1ef5a7c653b1fae9b140d70a2b6f023de563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Fri, 28 Nov 2025 12:59:07 +0100 Subject: [PATCH 23/26] fix samples up to date --- .../.openapi-generator/FILES | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES index fae00c58b99b..65587b352876 100644 --- a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES @@ -1,4 +1,3 @@ -.openapi-generator-ignore README.md build.gradle.kts gradle/wrapper/gradle-wrapper.jar From da86be49a0f7cec490fc09ed935fca07beb8e01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Fri, 28 Nov 2025 14:07:27 +0100 Subject: [PATCH 24/26] fix samples up to date --- .../main/resources/kotlin-spring/api.mustache | 6 +- .../openapitools/api/ItemsApiController.kt | 12 ++-- .../org/openapitools/api/PetApiController.kt | 60 ++++++++++++------- .../openapitools/api/StoreApiController.kt | 24 +++++--- .../org/openapitools/api/UserApiController.kt | 54 +++++++++++------ .../org/openapitools/api/PetApiController.kt | 48 ++++++++++----- .../openapitools/api/StoreApiController.kt | 24 +++++--- .../org/openapitools/api/UserApiController.kt | 48 ++++++++++----- .../org/openapitools/api/PetApiController.kt | 48 ++++++++++----- .../openapitools/api/StoreApiController.kt | 24 +++++--- .../org/openapitools/api/UserApiController.kt | 48 ++++++++++----- .../openapitools/api/ItemsApiController.kt | 12 ++-- .../org/openapitools/api/PetApiController.kt | 48 ++++++++++----- .../openapitools/api/StoreApiController.kt | 24 +++++--- .../org/openapitools/api/UserApiController.kt | 48 ++++++++++----- 15 files changed, 352 insertions(+), 176 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache index 914fffbc9c40..cecfbde092e7 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache @@ -86,9 +86,11 @@ class {{classname}}Controller({{#serviceInterface}}@Autowired(required = true) v notes = "{{#lambda.escapeDollar}}{{{notes}}}{{/lambda.escapeDollar}}"{{#returnBaseType}}, response = {{{.}}}::class{{/returnBaseType}}{{#returnContainer}}, responseContainer = "{{{.}}}"{{/returnContainer}}{{#hasAuthMethods}}, - authorizations = [{{#authMethods}}Authorization(value = "{{name}}"{{#isOAuth}}, scopes = [{{#scopes}}AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{^-last}}, {{/-last}}{{/scopes}}]{{/isOAuth}}){{^-last}}, {{/-last}}{{/authMethods}}]{{/hasAuthMethods}}) + authorizations = [{{#authMethods}}Authorization(value = "{{name}}"{{#isOAuth}}, scopes = [{{#scopes}}AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{^-last}}, {{/-last}}{{/scopes}}]{{/isOAuth}}){{^-last}}, {{/-last}}{{/authMethods}}]{{/hasAuthMethods}} + ) @ApiResponses( - value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{#lambda.escapeDollar}}{{{message}}}{{/lambda.escapeDollar}}"{{#baseType}}, response = {{{.}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{.}}}"{{/containerType}}){{^-last}},{{/-last}}{{/responses}}]){{/swagger1AnnotationLibrary}} + value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{#lambda.escapeDollar}}{{{message}}}{{/lambda.escapeDollar}}"{{#baseType}}, response = {{{.}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{.}}}"{{/containerType}}){{^-last}},{{/-last}}{{/responses}}] + ){{/swagger1AnnotationLibrary}} @RequestMapping( method = [RequestMethod.{{httpMethod}}], value = [PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}} /* "{{{path}}}" */]{{#singleContentTypes}}{{#hasProduces}}, diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt index 0b5ed4395af5..d1a61211e519 100644 --- a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -41,9 +41,11 @@ class ItemsApiController(@Autowired(required = true) val service: ItemsApiServic value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", nickname = "itemsItemIdSomethingItemSubIdGet", notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - response = ItemsItemIdSomethingItemSubIdGet200Response::class) + response = ItemsItemIdSomethingItemSubIdGet200Response::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)]) + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], @@ -67,9 +69,11 @@ class ItemsApiController(@Autowired(required = true) val service: ItemsApiServic value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", nickname = "itemsPost", notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - response = ItemWithDollarAttributesAndExamples::class) + response = ItemWithDollarAttributesAndExamples::class + ) @ApiResponses( - value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)]) + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ITEMS_POST /* "/items" */], diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt index 3da2dce66840..acce2c6aef97 100644 --- a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -41,9 +41,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Add a new pet to the store", nickname = "addPet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ADD_PET /* "/pet" */], @@ -60,9 +62,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Deletes a pet", nickname = "deletePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid pet value")]) + value = [ApiResponse(code = 400, message = "Invalid pet value")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_PET /* "/pet/{petId}" */] @@ -81,9 +85,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple status values can be provided with comma separated strings", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], @@ -102,9 +108,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], @@ -122,9 +130,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "getImage", notes = "", response = org.springframework.core.io.Resource::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = org.springframework.core.io.Resource::class)]) + value = [ApiResponse(code = 200, message = "successful operation", response = org.springframework.core.io.Resource::class)] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_IMAGE /* "/pet/{petId}/getImage" */], @@ -142,9 +152,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "getPetById", notes = "Returns a single pet", response = Pet::class, - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], @@ -161,9 +173,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Update an existing pet", nickname = "updatePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_PET /* "/pet" */], @@ -180,9 +194,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Updates a pet in the store with form data", nickname = "updatePetWithForm", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], @@ -202,9 +218,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "uploadFile", notes = "", response = ModelApiResponse::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], @@ -225,9 +243,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "uploadMultipleFile", notes = "", response = ModelApiResponse::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPLOAD_MULTIPLE_FILE /* "/pet/{petId}/uploadMultipleImage" */], diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt index c3e35118b567..755eb01d364d 100644 --- a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -39,9 +39,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic @ApiOperation( value = "Delete purchase order by ID", nickname = "deleteOrder", - notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors") + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors" + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] @@ -59,9 +61,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic notes = "Returns a map of status codes to quantities", response = kotlin.Int::class, responseContainer = "Map", - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_INVENTORY /* "/store/inventory" */], @@ -76,9 +80,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Find purchase order by ID", nickname = "getOrderById", notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], @@ -95,9 +101,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Place an order for a pet", nickname = "placeOrder", notes = "", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_PLACE_ORDER /* "/store/order" */], diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt index 44a68f6ebf3f..34a1ec737fb2 100644 --- a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -39,9 +39,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Create user", nickname = "createUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USER /* "/user" */] @@ -56,9 +58,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithArrayInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] @@ -73,9 +77,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithListInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] @@ -90,9 +96,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Delete user", nickname = "deleteUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_USER /* "/user/{username}" */] @@ -108,9 +116,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Get user by user name", nickname = "getUserByName", notes = "", - response = User::class) + response = User::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], @@ -127,9 +137,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Logs user into the system", nickname = "loginUser", notes = "", - response = kotlin.String::class) + response = kotlin.String::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGIN_USER /* "/user/login" */], @@ -146,9 +158,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Logs out current logged in user session", nickname = "logoutUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGOUT_USER /* "/user/logout" */] @@ -161,9 +175,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "logoutUserOptions", nickname = "logoutUserOptions", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "endpoint configuration response")]) + value = [ApiResponse(code = 200, message = "endpoint configuration response")] + ) @RequestMapping( method = [RequestMethod.OPTIONS], value = [PATH_LOGOUT_USER_OPTIONS /* "/user/logout" */] @@ -176,9 +192,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Updated user", nickname = "updateUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_USER /* "/user/{username}" */] diff --git a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt index f99b4146027c..ad0ad481db79 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -43,9 +43,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Add a new pet to the store", nickname = "addPet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ADD_PET /* "/pet" */], @@ -62,9 +64,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Deletes a pet", nickname = "deletePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid pet value")]) + value = [ApiResponse(code = 400, message = "Invalid pet value")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_PET /* "/pet/{petId}" */] @@ -83,9 +87,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple status values can be provided with comma separated strings", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], @@ -104,9 +110,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], @@ -124,9 +132,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "getPetById", notes = "Returns a single pet", response = Pet::class, - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], @@ -143,9 +153,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Update an existing pet", nickname = "updatePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_PET /* "/pet" */], @@ -162,9 +174,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Updates a pet in the store with form data", nickname = "updatePetWithForm", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], @@ -184,9 +198,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "uploadFile", notes = "", response = ModelApiResponse::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], diff --git a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt index fa400197c7ca..90dfe1ddfe07 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -41,9 +41,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic @ApiOperation( value = "Delete purchase order by ID", nickname = "deleteOrder", - notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors") + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors" + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] @@ -61,9 +63,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic notes = "Returns a map of status codes to quantities", response = kotlin.Int::class, responseContainer = "Map", - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_INVENTORY /* "/store/inventory" */], @@ -78,9 +82,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Find purchase order by ID", nickname = "getOrderById", notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], @@ -97,9 +103,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Place an order for a pet", nickname = "placeOrder", notes = "", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_PLACE_ORDER /* "/store/order" */], diff --git a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt index cbaedc3d378b..b3c71c688c29 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -41,9 +41,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Create user", nickname = "createUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USER /* "/user" */] @@ -58,9 +60,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithArrayInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] @@ -75,9 +79,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithListInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] @@ -92,9 +98,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Delete user", nickname = "deleteUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_USER /* "/user/{username}" */] @@ -110,9 +118,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Get user by user name", nickname = "getUserByName", notes = "", - response = User::class) + response = User::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], @@ -129,9 +139,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Logs user into the system", nickname = "loginUser", notes = "", - response = kotlin.String::class) + response = kotlin.String::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGIN_USER /* "/user/login" */], @@ -148,9 +160,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Logs out current logged in user session", nickname = "logoutUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGOUT_USER /* "/user/logout" */] @@ -163,9 +177,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Updated user", nickname = "updateUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_USER /* "/user/{username}" */] diff --git a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/PetApiController.kt index f99b4146027c..ad0ad481db79 100644 --- a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/PetApiController.kt +++ b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -43,9 +43,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Add a new pet to the store", nickname = "addPet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ADD_PET /* "/pet" */], @@ -62,9 +64,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Deletes a pet", nickname = "deletePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid pet value")]) + value = [ApiResponse(code = 400, message = "Invalid pet value")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_PET /* "/pet/{petId}" */] @@ -83,9 +87,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple status values can be provided with comma separated strings", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], @@ -104,9 +110,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], @@ -124,9 +132,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "getPetById", notes = "Returns a single pet", response = Pet::class, - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], @@ -143,9 +153,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Update an existing pet", nickname = "updatePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_PET /* "/pet" */], @@ -162,9 +174,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Updates a pet in the store with form data", nickname = "updatePetWithForm", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], @@ -184,9 +198,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "uploadFile", notes = "", response = ModelApiResponse::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], diff --git a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiController.kt index fa400197c7ca..90dfe1ddfe07 100644 --- a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiController.kt +++ b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -41,9 +41,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic @ApiOperation( value = "Delete purchase order by ID", nickname = "deleteOrder", - notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors") + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors" + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] @@ -61,9 +63,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic notes = "Returns a map of status codes to quantities", response = kotlin.Int::class, responseContainer = "Map", - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_INVENTORY /* "/store/inventory" */], @@ -78,9 +82,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Find purchase order by ID", nickname = "getOrderById", notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], @@ -97,9 +103,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Place an order for a pet", nickname = "placeOrder", notes = "", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_PLACE_ORDER /* "/store/order" */], diff --git a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/UserApiController.kt index cbaedc3d378b..b3c71c688c29 100644 --- a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/UserApiController.kt +++ b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -41,9 +41,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Create user", nickname = "createUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USER /* "/user" */] @@ -58,9 +60,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithArrayInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] @@ -75,9 +79,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithListInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] @@ -92,9 +98,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Delete user", nickname = "deleteUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_USER /* "/user/{username}" */] @@ -110,9 +118,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Get user by user name", nickname = "getUserByName", notes = "", - response = User::class) + response = User::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], @@ -129,9 +139,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Logs user into the system", nickname = "loginUser", notes = "", - response = kotlin.String::class) + response = kotlin.String::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGIN_USER /* "/user/login" */], @@ -148,9 +160,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Logs out current logged in user session", nickname = "logoutUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGOUT_USER /* "/user/logout" */] @@ -163,9 +177,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Updated user", nickname = "updateUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_USER /* "/user/{username}" */] diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt index 1afe5147feaf..457d0e7251ed 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -43,9 +43,11 @@ class ItemsApiController() { value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", nickname = "itemsItemIdSomethingItemSubIdGet", notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - response = ItemsItemIdSomethingItemSubIdGet200Response::class) + response = ItemsItemIdSomethingItemSubIdGet200Response::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)]) + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], @@ -70,9 +72,11 @@ class ItemsApiController() { value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", nickname = "itemsPost", notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", - response = ItemWithDollarAttributesAndExamples::class) + response = ItemWithDollarAttributesAndExamples::class + ) @ApiResponses( - value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)]) + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ITEMS_POST /* "/items" */], diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt index 8eab3c69bcc6..d2bd3af5781f 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -43,9 +43,11 @@ class PetApiController() { value = "Add a new pet to the store", nickname = "addPet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ADD_PET /* "/pet" */], @@ -63,9 +65,11 @@ class PetApiController() { value = "Deletes a pet", nickname = "deletePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid pet value")]) + value = [ApiResponse(code = 400, message = "Invalid pet value")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_PET /* "/pet/{petId}" */] @@ -85,9 +89,11 @@ class PetApiController() { notes = "Multiple status values can be provided with comma separated strings", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], @@ -107,9 +113,11 @@ class PetApiController() { notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], @@ -128,9 +136,11 @@ class PetApiController() { nickname = "getPetById", notes = "Returns a single pet", response = Pet::class, - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], @@ -148,9 +158,11 @@ class PetApiController() { value = "Update an existing pet", nickname = "updatePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_PET /* "/pet" */], @@ -168,9 +180,11 @@ class PetApiController() { value = "Updates a pet in the store with form data", nickname = "updatePetWithForm", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], @@ -191,9 +205,11 @@ class PetApiController() { nickname = "uploadFile", notes = "", response = ModelApiResponse::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt index 944a8f92c6ed..685b3f1a68aa 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -41,9 +41,11 @@ class StoreApiController() { @ApiOperation( value = "Delete purchase order by ID", nickname = "deleteOrder", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] @@ -62,9 +64,11 @@ class StoreApiController() { notes = "", response = kotlin.Int::class, responseContainer = "Map", - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_INVENTORY /* "/store/inventory" */], @@ -79,9 +83,11 @@ class StoreApiController() { value = "Find purchase order by ID", nickname = "getOrderById", notes = "", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], @@ -99,9 +105,11 @@ class StoreApiController() { value = "Place an order for a pet", nickname = "placeOrder", notes = "", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_PLACE_ORDER /* "/store/order" */], diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt index 429bcf6a2682..f257f0533cc5 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -41,9 +41,11 @@ class UserApiController() { @ApiOperation( value = "Create user", nickname = "createUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USER /* "/user" */], @@ -60,9 +62,11 @@ class UserApiController() { @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithArrayInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */], @@ -79,9 +83,11 @@ class UserApiController() { @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithListInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */], @@ -98,9 +104,11 @@ class UserApiController() { @ApiOperation( value = "Delete user", nickname = "deleteUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_USER /* "/user/{username}" */] @@ -117,9 +125,11 @@ class UserApiController() { value = "Get user by user name", nickname = "getUserByName", notes = "", - response = User::class) + response = User::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], @@ -137,9 +147,11 @@ class UserApiController() { value = "Logs user into the system", nickname = "loginUser", notes = "", - response = kotlin.String::class) + response = kotlin.String::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGIN_USER /* "/user/login" */], @@ -157,9 +169,11 @@ class UserApiController() { @ApiOperation( value = "Logs out current logged in user session", nickname = "logoutUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGOUT_USER /* "/user/logout" */] @@ -172,9 +186,11 @@ class UserApiController() { @ApiOperation( value = "Updated user", nickname = "updateUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_USER /* "/user/{username}" */], From 7a6509447b3ecac8c494fbf980c1a31aae0180e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Fri, 28 Nov 2025 15:34:00 +0100 Subject: [PATCH 25/26] fix javadoc --- .../codegen/CodegenOperation.java | 6 ++-- .../openapitools/codegen/CodegenResponse.java | 5 ++- .../openapitools/codegen/DefaultCodegen.java | 5 +++ .../generatedCodeWarning.mustache | 5 +++ .../resources/kotlin-spring/service.mustache | 14 ++++---- .../org/openapitools/api/ItemsApiService.kt | 34 +++++++++---------- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/ItemsApiService.kt | 34 +++++++++---------- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- .../org/openapitools/api/StoreApiService.kt | 4 +-- 21 files changed, 87 insertions(+), 72 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/generatedCodeWarning.mustache diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java index 47e09ea292d4..e8c89ac9b6fa 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java @@ -33,7 +33,7 @@ public class CodegenOperation { hasErrorResponseObject; // if 4xx, 5xx responses have at least one error object defined public CodegenProperty returnProperty; public String path, operationId, returnType, returnFormat, httpMethod, returnBaseType, - returnContainer, summary, unescapedNotes, notes, baseName, defaultResponse; + returnContainer, summary, unescapedSummary, unescapedNotes, notes, baseName, defaultResponse; public CodegenDiscriminator discriminator; public List> consumes, produces, prioritizedContentTypes; public List servers = new ArrayList(); @@ -429,6 +429,7 @@ public String toString() { sb.append(", returnBaseType='").append(returnBaseType).append('\''); sb.append(", returnContainer='").append(returnContainer).append('\''); sb.append(", summary='").append(summary).append('\''); + sb.append(", unescapedSummary='").append(unescapedSummary).append('\''); sb.append(", unescapedNotes='").append(unescapedNotes).append('\''); sb.append(", notes='").append(notes).append('\''); sb.append(", baseName='").append(baseName).append('\''); @@ -502,6 +503,7 @@ public boolean equals(Object o) { Objects.equals(returnBaseType, that.returnBaseType) && Objects.equals(returnContainer, that.returnContainer) && Objects.equals(summary, that.summary) && + Objects.equals(unescapedSummary, that.unescapedSummary) && Objects.equals(unescapedNotes, that.unescapedNotes) && Objects.equals(notes, that.notes) && Objects.equals(baseName, that.baseName) && @@ -547,7 +549,7 @@ public int hashCode() { returnTypeIsPrimitive, returnSimpleType, subresourceOperation, isMap, isArray, isMultipart, isVoid, isResponseBinary, isResponseFile, isResponseOptional, hasReference, isDeprecated, isCallbackRequest, uniqueItems, path, operationId, returnType, httpMethod, - returnBaseType, returnContainer, summary, unescapedNotes, notes, baseName, defaultResponse, + returnBaseType, returnContainer, summary, unescapedSummary, unescapedNotes, notes, baseName, defaultResponse, discriminator, consumes, produces, prioritizedContentTypes, servers, bodyParam, allParams, bodyParams, pathParams, queryParams, headerParams, formParams, cookieParams, requiredParams, returnProperty, optionalParams, authMethods, tags, responses, callbacks, imports, examples, requestBodyExamples, externalDocs, diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java index 3298d80868f2..c9a426d7b9a1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java @@ -33,6 +33,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { public boolean is4xx; public boolean is5xx; public String message; + public String unescapedMessage; public List> examples; public String dataType; public String baseType; @@ -109,7 +110,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { @Override public int hashCode() { - return Objects.hash(headers, code, message, examples, dataType, baseType, containerType, containerTypeMapped, hasHeaders, + return Objects.hash(headers, code, message, unescapedMessage, examples, dataType, baseType, containerType, containerTypeMapped, hasHeaders, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBoolean, isDate, isDateTime, isUuid, isEmail, isPassword, isModel, isFreeFormObject, isAnyType, isDefault, simpleType, primitiveType, isMap, isOptional, isArray, isBinary, isFile, schema, jsonSchema, vendorExtensions, items, additionalProperties, @@ -182,6 +183,7 @@ public boolean equals(Object o) { Objects.equals(headers, that.headers) && Objects.equals(code, that.code) && Objects.equals(message, that.message) && + Objects.equals(unescapedMessage, that.unescapedMessage) && Objects.equals(examples, that.examples) && Objects.equals(dataType, that.dataType) && Objects.equals(baseType, that.baseType) && @@ -582,6 +584,7 @@ public String toString() { sb.append(", is4xx='").append(is4xx).append('\''); sb.append(", is5xx='").append(is5xx).append('\''); sb.append(", message='").append(message).append('\''); + sb.append(", unescapedMessage='").append(unescapedMessage).append('\''); sb.append(", examples=").append(examples); sb.append(", dataType='").append(dataType).append('\''); sb.append(", baseType='").append(baseType).append('\''); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index bd2683cf6826..c1e609891642 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4675,6 +4675,7 @@ public CodegenOperation fromOperation(String path, } op.summary = escapeText(operation.getSummary()); + op.unescapedSummary = operation.getSummary(); op.unescapedNotes = operation.getDescription(); op.notes = escapeText(operation.getDescription()); op.hasConsumes = false; @@ -4839,6 +4840,7 @@ public CodegenOperation fromOperation(String path, if (bodyParam != null) { bodyParam.description = escapeText(requestBody.getDescription()); + bodyParam.unescapedDescription = requestBody.getDescription(); postProcessParameter(bodyParam); bodyParams.add(bodyParam); if (prependFormOrBodyParameters) { @@ -5029,6 +5031,7 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) { } r.schema = responseSchema; r.message = escapeText(response.getDescription()); + r.unescapedMessage = response.getDescription(); // adding examples to API responses Map examples = ExamplesUtils.getExamplesFromResponse(openAPI, response); @@ -7575,6 +7578,7 @@ protected void addBodyModelSchema(CodegenParameter codegenParameter, String name codegenParameter.baseType = codegenModel.classname; codegenParameter.dataType = getTypeDeclaration(codegenModel.classname); codegenParameter.description = codegenModel.description; + codegenParameter.unescapedDescription = codegenModel.unescapedDescription; codegenParameter.isNullable = codegenModel.isNullable; imports.add(codegenParameter.baseType); } else { @@ -7948,6 +7952,7 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S codegenParameter.baseName = "UNKNOWN_BASE_NAME"; codegenParameter.paramName = "UNKNOWN_PARAM_NAME"; codegenParameter.description = escapeText(body.getDescription()); + codegenParameter.unescapedDescription = body.getDescription(); codegenParameter.required = body.getRequired() != null ? body.getRequired() : Boolean.FALSE; codegenParameter.isBodyParam = Boolean.TRUE; if (body.getExtensions() != null) { diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/generatedCodeWarning.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/generatedCodeWarning.mustache new file mode 100644 index 000000000000..de30078ab3ab --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/generatedCodeWarning.mustache @@ -0,0 +1,5 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) ({{{generatorVersion}}}). + * https://openapi-generator.tech + * Do not edit the class manually. + */ \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache index 309be55743b4..3aa62e4e17f1 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache @@ -11,22 +11,22 @@ interface {{classname}}Service { {{#operation}} /** - * {{httpMethod}} {{{path}}}{{#summary}} : {{.}}{{/summary}} - {{#notes}} - * {{.}} - {{/notes}} + * {{httpMethod}} {{{path}}}{{#unescapedSummary}} : {{{.}}}{{/unescapedSummary}} + {{#unescapedNotes}} + * {{{.}}} + {{/unescapedNotes}} * {{#allParams}} - * @param {{{paramName}}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}} + * @param {{{paramName}}} {{{unescapedDescription}}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{^isString}}{{{.}}}{{/isString}}{{#isString}}{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}{{/isString}}{{/defaultValue}}){{/required}} {{/allParams}} - * @return {{#responses}}{{message}} (status code {{code}}){{^-last}} + * @return {{#responses}}{{{unescapedMessage}}} (status code {{code}}){{^-last}} * or {{/-last}}{{/responses}} {{#isDeprecated}} * @deprecated {{/isDeprecated}} {{#externalDocs}} * {{description}} - * @see {{summary}} Documentation + * @see {{{summary}}} Documentation {{/externalDocs}} * @see {{classname}}#{{operationId}} */ diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt index 2e8d2a7b6637..918cb1610b33 100644 --- a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt @@ -6,30 +6,30 @@ import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response interface ItemsApiService { /** - * GET /items/{item$Id}/something/{item$SubId} : SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * GET /items/{item$Id}/something/{item$SubId} : SQ = "; SBS = \; DBS = \\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some * - * @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some (required) - * @param itemDollarSubId SQ = \"; SBS = \\; DBS = \\\\; SD = $some (required) - * @param filterDollarType SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - * @param filterDollarSubType SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - * @param xCustomHeader SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @param xCustomHeaderTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @param sessionDollarToken SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @param sessionDollarTokenTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @return SQ = \"; SBS = \\; DBS = \\\\; SD = $some (status code 200) + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some (required) + * @param itemDollarSubId SQ = "; SBS = \; DBS = \\; SD = $some (required) + * @param filterDollarType SQ = "; SBS = \; DBS = \\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @param filterDollarSubType SQ = "; SBS = \; DBS = \\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @param xCustomHeader SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param xCustomHeaderTwo SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param sessionDollarToken SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param sessionDollarTokenTwo SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @return SQ = "; SBS = \; DBS = \\; SD = $some (status code 200) * @see ItemsApi#itemsItemIdSomethingItemSubIdGet */ fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response /** - * POST /items : SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * POST /items : SQ = "; SBS = \; DBS = \\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some * - * @param xPostHeader SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @param formDollarName SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some (optional) - * @param formDollarValue SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - * @return SQ = \"; SBS = \\; DBS = \\\\; SD = $some (status code 201) + * @param xPostHeader SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param formDollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param formDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @return SQ = "; SBS = \; DBS = \\; SD = $some (status code 201) * @see ItemsApi#itemsPost */ fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-3-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-3-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 474b51456b27..b532e9076953 100644 --- a/samples/server/petstore/kotlin-springboot-3-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-3-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 474b51456b27..b532e9076953 100644 --- a/samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-additionalproperties/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-additionalproperties/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 474b51456b27..b532e9076953 100644 --- a/samples/server/petstore/kotlin-springboot-additionalproperties/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-additionalproperties/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt index 2e8d2a7b6637..918cb1610b33 100644 --- a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt @@ -6,30 +6,30 @@ import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response interface ItemsApiService { /** - * GET /items/{item$Id}/something/{item$SubId} : SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * GET /items/{item$Id}/something/{item$SubId} : SQ = "; SBS = \; DBS = \\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some * - * @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some (required) - * @param itemDollarSubId SQ = \"; SBS = \\; DBS = \\\\; SD = $some (required) - * @param filterDollarType SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - * @param filterDollarSubType SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - * @param xCustomHeader SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @param xCustomHeaderTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @param sessionDollarToken SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @param sessionDollarTokenTwo SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @return SQ = \"; SBS = \\; DBS = \\\\; SD = $some (status code 200) + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some (required) + * @param itemDollarSubId SQ = "; SBS = \; DBS = \\; SD = $some (required) + * @param filterDollarType SQ = "; SBS = \; DBS = \\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @param filterDollarSubType SQ = "; SBS = \; DBS = \\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @param xCustomHeader SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param xCustomHeaderTwo SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param sessionDollarToken SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param sessionDollarTokenTwo SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @return SQ = "; SBS = \; DBS = \\; SD = $some (status code 200) * @see ItemsApi#itemsItemIdSomethingItemSubIdGet */ fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response /** - * POST /items : SQ = \"; SBS = \\; DBS = \\\\; SD = $some - * SQ = \"; SBS = \\; DBS = \\\\; SD = $some + * POST /items : SQ = "; SBS = \; DBS = \\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some * - * @param xPostHeader SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) - * @param formDollarName SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some (optional) - * @param formDollarValue SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = $some") - * @return SQ = \"; SBS = \\; DBS = \\\\; SD = $some (status code 201) + * @param xPostHeader SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param formDollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param formDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @return SQ = "; SBS = \; DBS = \\; SD = $some (status code 201) * @see ItemsApi#itemsPost */ fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-no-response-entity-delegate/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-no-response-entity-delegate/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-no-response-entity-delegate/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-no-response-entity-delegate/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-reactive-without-flow/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-reactive-without-flow/src/main/kotlin/org/openapitools/api/StoreApiService.kt index ca81edd9f2b0..4e35128d4949 100644 --- a/samples/server/petstore/kotlin-springboot-reactive-without-flow/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-reactive-without-flow/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -7,7 +7,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -27,7 +27,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-reactive/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-reactive/src/main/kotlin/org/openapitools/api/StoreApiService.kt index ca81edd9f2b0..4e35128d4949 100644 --- a/samples/server/petstore/kotlin-springboot-reactive/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-reactive/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -7,7 +7,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -27,7 +27,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-source-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-source-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) From f6692f42cca6354858d0f25e186c549f6bb200f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1chym=20Metli=C4=8Dka?= Date: Fri, 28 Nov 2025 15:45:13 +0100 Subject: [PATCH 26/26] update samples --- samples/documentation/html2/index.html | 126 ++++++++++++------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/samples/documentation/html2/index.html b/samples/documentation/html2/index.html index defce7cd6ce2..d74b2161a56e 100644 --- a/samples/documentation/html2/index.html +++ b/samples/documentation/html2/index.html @@ -1216,7 +1216,7 @@

Usage and SDK Samples

// Create an instance of the API class PetApi apiInstance = new PetApi(); - Pet pet = ; // Pet | + Pet pet = ; // Pet | Pet object that needs to be added to the store try { Pet result = apiInstance.addPet(pet); @@ -1235,7 +1235,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final Pet pet = new Pet(); // Pet | +final Pet pet = new Pet(); // Pet | Pet object that needs to be added to the store try { final result = await api_instance.addPet(pet); @@ -1253,7 +1253,7 @@

Usage and SDK Samples

public class PetApiExample { public static void main(String[] args) { PetApi apiInstance = new PetApi(); - Pet pet = ; // Pet | + Pet pet = ; // Pet | Pet object that needs to be added to the store try { Pet result = apiInstance.addPet(pet); @@ -1278,7 +1278,7 @@

Usage and SDK Samples

// Create an instance of the API class PetApi *apiInstance = [[PetApi alloc] init]; -Pet *pet = ; // +Pet *pet = ; // Pet object that needs to be added to the store // Add a new pet to the store [apiInstance addPetWith:pet @@ -1303,7 +1303,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.PetApi() -var pet = ; // {Pet} +var pet = ; // {Pet} Pet object that needs to be added to the store var callback = function(error, data, response) { if (error) { @@ -1337,7 +1337,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new PetApi(); - var pet = new Pet(); // Pet | + var pet = new Pet(); // Pet | Pet object that needs to be added to the store try { // Add a new pet to the store @@ -1361,7 +1361,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\PetApi(); -$pet = ; // Pet | +$pet = ; // Pet | Pet object that needs to be added to the store try { $result = $api_instance->addPet($pet); @@ -1382,7 +1382,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::PetApi->new(); -my $pet = WWW::OPenAPIClient::Object::Pet->new(); # Pet | +my $pet = WWW::OPenAPIClient::Object::Pet->new(); # Pet | Pet object that needs to be added to the store eval { my $result = $api_instance->addPet(pet => $pet); @@ -1405,7 +1405,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.PetApi() -pet = # Pet | +pet = # Pet | Pet object that needs to be added to the store try: # Add a new pet to the store @@ -3668,7 +3668,7 @@

Usage and SDK Samples

// Create an instance of the API class PetApi apiInstance = new PetApi(); - Pet pet = ; // Pet | + Pet pet = ; // Pet | Pet object that needs to be added to the store try { Pet result = apiInstance.updatePet(pet); @@ -3687,7 +3687,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final Pet pet = new Pet(); // Pet | +final Pet pet = new Pet(); // Pet | Pet object that needs to be added to the store try { final result = await api_instance.updatePet(pet); @@ -3705,7 +3705,7 @@

Usage and SDK Samples

public class PetApiExample { public static void main(String[] args) { PetApi apiInstance = new PetApi(); - Pet pet = ; // Pet | + Pet pet = ; // Pet | Pet object that needs to be added to the store try { Pet result = apiInstance.updatePet(pet); @@ -3730,7 +3730,7 @@

Usage and SDK Samples

// Create an instance of the API class PetApi *apiInstance = [[PetApi alloc] init]; -Pet *pet = ; // +Pet *pet = ; // Pet object that needs to be added to the store // Update an existing pet [apiInstance updatePetWith:pet @@ -3755,7 +3755,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.PetApi() -var pet = ; // {Pet} +var pet = ; // {Pet} Pet object that needs to be added to the store var callback = function(error, data, response) { if (error) { @@ -3789,7 +3789,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new PetApi(); - var pet = new Pet(); // Pet | + var pet = new Pet(); // Pet | Pet object that needs to be added to the store try { // Update an existing pet @@ -3813,7 +3813,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\PetApi(); -$pet = ; // Pet | +$pet = ; // Pet | Pet object that needs to be added to the store try { $result = $api_instance->updatePet($pet); @@ -3834,7 +3834,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::PetApi->new(); -my $pet = WWW::OPenAPIClient::Object::Pet->new(); # Pet | +my $pet = WWW::OPenAPIClient::Object::Pet->new(); # Pet | Pet object that needs to be added to the store eval { my $result = $api_instance->updatePet(pet => $pet); @@ -3857,7 +3857,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.PetApi() -pet = # Pet | +pet = # Pet | Pet object that needs to be added to the store try: # Update an existing pet @@ -6529,7 +6529,7 @@

Usage and SDK Samples

// Create an instance of the API class StoreApi apiInstance = new StoreApi(); - Order order = ; // Order | + Order order = ; // Order | order placed for purchasing the pet try { Order result = apiInstance.placeOrder(order); @@ -6548,7 +6548,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final Order order = new Order(); // Order | +final Order order = new Order(); // Order | order placed for purchasing the pet try { final result = await api_instance.placeOrder(order); @@ -6566,7 +6566,7 @@

Usage and SDK Samples

public class StoreApiExample { public static void main(String[] args) { StoreApi apiInstance = new StoreApi(); - Order order = ; // Order | + Order order = ; // Order | order placed for purchasing the pet try { Order result = apiInstance.placeOrder(order); @@ -6587,7 +6587,7 @@

Usage and SDK Samples

// Create an instance of the API class StoreApi *apiInstance = [[StoreApi alloc] init]; -Order *order = ; // +Order *order = ; // order placed for purchasing the pet // Place an order for a pet [apiInstance placeOrderWith:order @@ -6607,7 +6607,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.StoreApi() -var order = ; // {Order} +var order = ; // {Order} order placed for purchasing the pet var callback = function(error, data, response) { if (error) { @@ -6639,7 +6639,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new StoreApi(); - var order = new Order(); // Order | + var order = new Order(); // Order | order placed for purchasing the pet try { // Place an order for a pet @@ -6660,7 +6660,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\StoreApi(); -$order = ; // Order | +$order = ; // Order | order placed for purchasing the pet try { $result = $api_instance->placeOrder($order); @@ -6678,7 +6678,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::StoreApi->new(); -my $order = WWW::OPenAPIClient::Object::Order->new(); # Order | +my $order = WWW::OPenAPIClient::Object::Order->new(); # Order | order placed for purchasing the pet eval { my $result = $api_instance->placeOrder(order => $order); @@ -6698,7 +6698,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.StoreApi() -order = # Order | +order = # Order | order placed for purchasing the pet try: # Place an order for a pet @@ -7007,7 +7007,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi apiInstance = new UserApi(); - User user = ; // User | + User user = ; // User | Created user object try { apiInstance.createUser(user); @@ -7025,7 +7025,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final User user = new User(); // User | +final User user = new User(); // User | Created user object try { final result = await api_instance.createUser(user); @@ -7043,7 +7043,7 @@

Usage and SDK Samples

public class UserApiExample { public static void main(String[] args) { UserApi apiInstance = new UserApi(); - User user = ; // User | + User user = ; // User | Created user object try { apiInstance.createUser(user); @@ -7069,7 +7069,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi *apiInstance = [[UserApi alloc] init]; -User *user = ; // +User *user = ; // Created user object // Create user [apiInstance createUserWith:user @@ -7093,7 +7093,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.UserApi() -var user = ; // {User} +var user = ; // {User} Created user object var callback = function(error, data, response) { if (error) { @@ -7129,7 +7129,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new UserApi(); - var user = new User(); // User | + var user = new User(); // User | Created user object try { // Create user @@ -7154,7 +7154,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\UserApi(); -$user = ; // User | +$user = ; // User | Created user object try { $api_instance->createUser($user); @@ -7176,7 +7176,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::UserApi->new(); -my $user = WWW::OPenAPIClient::Object::User->new(); # User | +my $user = WWW::OPenAPIClient::Object::User->new(); # User | Created user object eval { $api_instance->createUser(user => $user); @@ -7200,7 +7200,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.UserApi() -user = # User | +user = # User | Created user object try: # Create user @@ -7424,7 +7424,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi apiInstance = new UserApi(); - array[User] user = ; // array[User] | + array[User] user = ; // array[User] | List of user object try { apiInstance.createUsersWithArrayInput(user); @@ -7442,7 +7442,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final array[User] user = new array[User](); // array[User] | +final array[User] user = new array[User](); // array[User] | List of user object try { final result = await api_instance.createUsersWithArrayInput(user); @@ -7460,7 +7460,7 @@

Usage and SDK Samples

public class UserApiExample { public static void main(String[] args) { UserApi apiInstance = new UserApi(); - array[User] user = ; // array[User] | + array[User] user = ; // array[User] | List of user object try { apiInstance.createUsersWithArrayInput(user); @@ -7486,7 +7486,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi *apiInstance = [[UserApi alloc] init]; -array[User] *user = ; // +array[User] *user = ; // List of user object // Creates list of users with given input array [apiInstance createUsersWithArrayInputWith:user @@ -7510,7 +7510,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.UserApi() -var user = ; // {array[User]} +var user = ; // {array[User]} List of user object var callback = function(error, data, response) { if (error) { @@ -7546,7 +7546,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new UserApi(); - var user = new array[User](); // array[User] | + var user = new array[User](); // array[User] | List of user object try { // Creates list of users with given input array @@ -7571,7 +7571,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\UserApi(); -$user = ; // array[User] | +$user = ; // array[User] | List of user object try { $api_instance->createUsersWithArrayInput($user); @@ -7593,7 +7593,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::UserApi->new(); -my $user = [WWW::OPenAPIClient::Object::array[User]->new()]; # array[User] | +my $user = [WWW::OPenAPIClient::Object::array[User]->new()]; # array[User] | List of user object eval { $api_instance->createUsersWithArrayInput(user => $user); @@ -7617,7 +7617,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.UserApi() -user = # array[User] | +user = # array[User] | List of user object try: # Creates list of users with given input array @@ -7844,7 +7844,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi apiInstance = new UserApi(); - array[User] user = ; // array[User] | + array[User] user = ; // array[User] | List of user object try { apiInstance.createUsersWithListInput(user); @@ -7862,7 +7862,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final array[User] user = new array[User](); // array[User] | +final array[User] user = new array[User](); // array[User] | List of user object try { final result = await api_instance.createUsersWithListInput(user); @@ -7880,7 +7880,7 @@

Usage and SDK Samples

public class UserApiExample { public static void main(String[] args) { UserApi apiInstance = new UserApi(); - array[User] user = ; // array[User] | + array[User] user = ; // array[User] | List of user object try { apiInstance.createUsersWithListInput(user); @@ -7906,7 +7906,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi *apiInstance = [[UserApi alloc] init]; -array[User] *user = ; // +array[User] *user = ; // List of user object // Creates list of users with given input array [apiInstance createUsersWithListInputWith:user @@ -7930,7 +7930,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.UserApi() -var user = ; // {array[User]} +var user = ; // {array[User]} List of user object var callback = function(error, data, response) { if (error) { @@ -7966,7 +7966,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new UserApi(); - var user = new array[User](); // array[User] | + var user = new array[User](); // array[User] | List of user object try { // Creates list of users with given input array @@ -7991,7 +7991,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\UserApi(); -$user = ; // array[User] | +$user = ; // array[User] | List of user object try { $api_instance->createUsersWithListInput($user); @@ -8013,7 +8013,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::UserApi->new(); -my $user = [WWW::OPenAPIClient::Object::array[User]->new()]; # array[User] | +my $user = [WWW::OPenAPIClient::Object::array[User]->new()]; # array[User] | List of user object eval { $api_instance->createUsersWithListInput(user => $user); @@ -8037,7 +8037,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.UserApi() -user = # array[User] | +user = # array[User] | List of user object try: # Creates list of users with given input array @@ -10096,7 +10096,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi apiInstance = new UserApi(); String username = username_example; // String | name that need to be deleted - User user = ; // User | + User user = ; // User | Updated user object try { apiInstance.updateUser(username, user); @@ -10115,7 +10115,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); final String username = new String(); // String | name that need to be deleted -final User user = new User(); // User | +final User user = new User(); // User | Updated user object try { final result = await api_instance.updateUser(username, user); @@ -10134,7 +10134,7 @@

Usage and SDK Samples

public static void main(String[] args) { UserApi apiInstance = new UserApi(); String username = username_example; // String | name that need to be deleted - User user = ; // User | + User user = ; // User | Updated user object try { apiInstance.updateUser(username, user); @@ -10161,7 +10161,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi *apiInstance = [[UserApi alloc] init]; String *username = username_example; // name that need to be deleted (default to null) -User *user = ; // +User *user = ; // Updated user object // Updated user [apiInstance updateUserWith:username @@ -10187,7 +10187,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.UserApi() var username = username_example; // {String} name that need to be deleted -var user = ; // {User} +var user = ; // {User} Updated user object var callback = function(error, data, response) { if (error) { @@ -10224,7 +10224,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new UserApi(); var username = username_example; // String | name that need to be deleted (default to null) - var user = new User(); // User | + var user = new User(); // User | Updated user object try { // Updated user @@ -10250,7 +10250,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\UserApi(); $username = username_example; // String | name that need to be deleted -$user = ; // User | +$user = ; // User | Updated user object try { $api_instance->updateUser($username, $user); @@ -10273,7 +10273,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::UserApi->new(); my $username = username_example; # String | name that need to be deleted -my $user = WWW::OPenAPIClient::Object::User->new(); # User | +my $user = WWW::OPenAPIClient::Object::User->new(); # User | Updated user object eval { $api_instance->updateUser(username => $username, user => $user); @@ -10298,7 +10298,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.UserApi() username = username_example # String | name that need to be deleted (default to null) -user = # User | +user = # User | Updated user object try: # Updated user