Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,12 @@
}}{{/serializableModel}}{{! no newline
}}{{/parent}} {
{{#discriminator}}
{{#requiredVars}}
{{>interfaceReqVar}}{{! prevent indent}}
{{/requiredVars}}
{{#optionalVars}}
{{>interfaceOptVar}}{{! prevent indent}}
{{/optionalVars}}
{{#requiredVars}}
{{>interfaceReqVar}}{{! prevent indent}}
{{/requiredVars}}
{{#optionalVars}}
{{>interfaceOptVar}}{{! prevent indent}}
{{/optionalVars}}
{{/discriminator}}
{{#hasEnums}}{{#vars}}{{#isEnum}}
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,24 @@
{{#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}}
@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}}
{{! comments are used to break long lines into multiple lines for better readability }}
{{#useBeanValidation}}{{>beanValidation}}{{>beanValidationModel}}{{/useBeanValidation}}{{!
}}{{#swagger2AnnotationLibrary}}
Comment on lines +1 to +3
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am using these dummy multi-line comments as a way to make the long lines more readable.

@Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = false, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{!
}}{{/swagger2AnnotationLibrary}}{{!
}}{{#swagger1AnnotationLibrary}}
@ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = false, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{!
}}{{/swagger1AnnotationLibrary}}{{!
}}{{#deprecated}}
@Deprecated(message = ""){{!
}}{{/deprecated}}{{!
}}{{#vendorExtensions.x-field-extra-annotation}}
{{{.}}}{{!
}}{{/vendorExtensions.x-field-extra-annotation}}
@get:JsonProperty("{{{baseName}}}", required = false)
{{#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}}
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
{{#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}}
{{{.}}}{{/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}}
{{! comments are used to break long lines into multiple lines for better readability }}
{{#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}}
{{{.}}}{{!
}}{{/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}}
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
{{! comments are used to break long lines into multiple lines for better readability }}
{{#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}}
{{{.}}}{{/vendorExtensions.x-field-extra-annotation}}
{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? {{^discriminator}}= {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}}{{/discriminator}}
@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}}
{{{.}}}{{!
}}{{/vendorExtensions.x-field-extra-annotation}}
{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{!
}}{{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{!
}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{!
}}{{^defaultValue}}?{{/defaultValue}}{{!
}}{{^discriminator}} = {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}}{{/discriminator}}
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
{{! comments are used to break long lines into multiple lines for better readability }}
{{#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}}
{{{.}}}{{/vendorExtensions.x-field-extra-annotation}}
{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}
@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}}
{{{.}}}{{!
}}{{/vendorExtensions.x-field-extra-annotation}}
{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{!
}}{{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{!
}}{{^isEnum}}{{{dataType}}}{{/isEnum}}
Original file line number Diff line number Diff line change
Expand Up @@ -1064,6 +1064,73 @@ public void generateNonSerializableModelWithXimplements() throws Exception {
);
}

@Test
public void generateModelWithRequiredFalseWithDefaults() 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 dogPath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Dog.kt");
assertFileContains(
dogPath,
"@get:JsonProperty(\"category\", required = false)",
"override val category: Category? = null", // without default (fallback) value is nullable
"@get:JsonProperty(\"nonRequiredWithDefaultList\", required = false)",
"override val nonRequiredWithDefaultList: kotlin.collections.List<kotlin.String> = arrayListOf(\"just some default string\",\"another default string\"),", // elsewhere with default (fallback) value is not nullable
"@get:JsonProperty(\"nonRequiredWithDefaultSet\", required = false)",
"override val nonRequiredWithDefaultSet: kotlin.collections.Set<kotlin.String> = setOf(\"more strings\",\"look, it's a string!\")",
"@get:JsonProperty(\"nonRequiredWithDefaultString\", required = false)",
"override val nonRequiredWithDefaultString: kotlin.String = \"defaultValue\"",
"@get:JsonProperty(\"nonRequiredWithDefaultInt\", required = false)",
"override val nonRequiredWithDefaultInt: java.math.BigDecimal = java.math.BigDecimal(\"15\")",
"@get:JsonProperty(\"nonRequiredWithDefaultLong\", required = false)",
"override val nonRequiredWithDefaultLong: java.math.BigDecimal = java.math.BigDecimal(\"15\")",
"@get:JsonProperty(\"nonRequiredWithDefaultFloat\", required = false)",
"override val nonRequiredWithDefaultFloat: kotlin.Float = 15.45f",
"@get:JsonProperty(\"nonRequiredWithDefaultDouble\", required = false)",
"override val nonRequiredWithDefaultDouble: kotlin.Double = 15.45",
"@get:JsonProperty(\"nonRequiredWithDefaultEnum\", required = false)",
"override val nonRequiredWithDefaultEnum: Dog.NonRequiredWithDefaultEnum = NonRequiredWithDefaultEnum.THIS",
"@get:JsonProperty(\"nonRequiredWithDefaultEnumList\", required = false)",
"override val nonRequiredWithDefaultEnumList: kotlin.collections.List<Dog.NonRequiredWithDefaultEnumList> = arrayListOf(NonRequiredWithDefaultEnumList.THESE,NonRequiredWithDefaultEnumList.THOSE)",
"@get:JsonProperty(\"nonRequiredWithDefaultEnumSet\", required = false)",
"override val nonRequiredWithDefaultEnumSet: kotlin.collections.Set<Dog.NonRequiredWithDefaultEnumSet> = setOf(NonRequiredWithDefaultEnumSet.THEM,NonRequiredWithDefaultEnumSet.THOSE)"
);

Path petPath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Pet.kt");
assertFileContains(
petPath,
"override val category: Category?", // without default (fallback) value is nullable
"val nonRequiredWithDefaultList: kotlin.collections.List<kotlin.String>", // elsewhere with default (fallback) value is not nullable
"val nonRequiredWithDefaultSet: kotlin.collections.Set<kotlin.String>",
"val nonRequiredWithDefaultString: kotlin.String",
"val nonRequiredWithDefaultInt: java.math.BigDecimal",
"val nonRequiredWithDefaultLong: java.math.BigDecimal",
"val nonRequiredWithDefaultFloat: kotlin.Float",
"val nonRequiredWithDefaultDouble: kotlin.Double",
"val nonRequiredWithDefaultEnum: Pet.NonRequiredWithDefaultEnum",
"val nonRequiredWithDefaultEnumList: Pet.NonRequiredWithDefaultEnumList",
"val nonRequiredWithDefaultEnumSet: Pet.NonRequiredWithDefaultEnumSet"
);
}

@Test
public void reactiveWithoutFlow() throws Exception {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,61 @@ components:
$ref: '#/components/schemas/Category'
name:
type: string
nonRequiredWithDefaultList:
type: array
items:
type: string
default: [ "just some default string", "another default string" ]
nonRequiredWithDefaultSet:
type: array
items:
type: string
uniqueItems: true
default: [ "more strings", "look, it's a string!" ]
nonRequiredWithDefaultString:
type: string
default: defaultValue
nonRequiredWithDefaultInt:
type: number
format: int32
default: 15
nonRequiredWithDefaultLong:
type: number
format: int64
default: 15
nonRequiredWithDefaultFloat:
type: number
format: float
default: 15.45
nonRequiredWithDefaultDouble:
type: number
format: double
default: 15.45
nonRequiredWithDefaultEnum:
type: string
enum:
- THIS
- THAT
default: THIS
nonRequiredWithDefaultEnumList:
type: array
items:
type: string
enum:
- THESE
- THOSE
- THEM
default: [ THESE, THOSE ]
nonRequiredWithDefaultEnumSet:
type: array
uniqueItems: true
items:
type: string
enum:
- THESE
- THOSE
- THEM
default: [ THEM, THOSE ]
photoUrls:
type: array
items:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ import javax.validation.Valid
*/
data class Category(

@get:JsonProperty("id") val id: kotlin.Long? = null,
@get:JsonProperty("id", required = false)
val id: kotlin.Long? = null,
Comment on lines +24 to +25
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now the attribute is neatly lined below the annotations


@get:Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$")
@get:JsonProperty("name") val name: kotlin.String? = null
@get:JsonProperty("name", required = false)
val name: kotlin.String? = null
) : Serializable {

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@ import javax.validation.Valid
*/
data class ModelApiResponse(

@get:JsonProperty("code") val code: kotlin.Int? = null,
@get:JsonProperty("code", required = false)
val code: kotlin.Int? = null,

@get:JsonProperty("type") val type: kotlin.String? = null,
@get:JsonProperty("type", required = false)
val type: kotlin.String? = null,

@get:JsonProperty("message") val message: kotlin.String? = null
@get:JsonProperty("message", required = false)
val message: kotlin.String? = null
) : Serializable {

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,23 @@ import javax.validation.Valid
*/
data class Order(

@get:JsonProperty("id") val id: kotlin.Long? = null,
@get:JsonProperty("id", required = false)
val id: kotlin.Long? = null,

@get:JsonProperty("petId") val petId: kotlin.Long? = null,
@get:JsonProperty("petId", required = false)
val petId: kotlin.Long? = null,

@get:JsonProperty("quantity") val quantity: kotlin.Int? = null,
@get:JsonProperty("quantity", required = false)
val quantity: kotlin.Int? = null,

@get:JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null,
@get:JsonProperty("shipDate", required = false)
val shipDate: java.time.OffsetDateTime? = null,

@get:JsonProperty("status") val status: Order.Status? = null,
@get:JsonProperty("status", required = false)
val status: Order.Status? = null,

@get:JsonProperty("complete") val complete: kotlin.Boolean? = false
@get:JsonProperty("complete", required = false)
val complete: kotlin.Boolean = false
) : Serializable {

/**
Expand Down
Loading
Loading