From 4f3593e7bb57c50ec7521baf125d74362e59bec2 Mon Sep 17 00:00:00 2001 From: Cromefire_ <cromefire_@outlook.com> Date: Thu, 6 Aug 2020 21:11:49 +0200 Subject: [PATCH 1/8] Upgraded the version of kotlin and ktor for multiplatform --- .../languages/KotlinClientCodegen.java | 40 ++-- .../resources/kotlin-client/README.mustache | 10 +- .../kotlin-client/class_doc.mustache | 2 +- .../kotlin-client/data_class.mustache | 21 +- .../kotlin-client/data_class_opt_var.mustache | 6 +- .../kotlin-client/data_class_req_var.mustache | 10 +- .../kotlin-client/enum_class.mustache | 25 ++- .../resources/kotlin-client/gradle.properties | 1 + .../kotlin-client/interface_opt_var.mustache | 4 +- .../kotlin-client/interface_req_var.mustache | 4 +- .../multiplatform/build.gradle.kts.mustache | 132 +++++++++++++ .../multiplatform/build.gradle.mustache | 161 --------------- .../multiplatform/gradle-wrapper.jar | Bin 53639 -> 58694 bytes .../gradle-wrapper.properties.mustache | 2 +- .../libraries/multiplatform/gradlew | 183 ++++++++++++++++++ .../libraries/multiplatform/gradlew.bat | 103 ++++++++++ .../settings.gradle.kts.mustache | 1 + .../kotlin-client/licenseInfo.mustache | 20 +- .../kotlin-client/settings.gradle.mustache | 1 - 19 files changed, 497 insertions(+), 229 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/gradle.properties create mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache delete mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.mustache create mode 100755 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradlew create mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradlew.bat create mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/settings.gradle.kts.mustache diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java index 1ac723a984e..72ff8cc8b81 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java @@ -284,7 +284,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { super.processOpts(); if (MULTIPLATFORM.equals(getLibrary())) { - sourceFolder = "src/commonMain/kotlin"; + sourceFolder = "common/src/main"; } @@ -311,13 +311,13 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { if (hasConflict) { LOGGER.warn("You specified RxJava versions 1 and 2 and 3 or Coroutines together, please choose one of them."); } else if (hasRx) { - this.setUseRxJava(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA).toString())); + this.setUseRxJava(Boolean.parseBoolean(additionalProperties.get(USE_RX_JAVA).toString())); } else if (hasRx2) { - this.setUseRxJava2(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA2).toString())); + this.setUseRxJava2(Boolean.parseBoolean(additionalProperties.get(USE_RX_JAVA2).toString())); } else if (hasRx3) { - this.setUseRxJava3(Boolean.valueOf(additionalProperties.get(USE_RX_JAVA3).toString())); + this.setUseRxJava3(Boolean.parseBoolean(additionalProperties.get(USE_RX_JAVA3).toString())); } else if (hasCoroutines) { - this.setUseCoroutines(Boolean.valueOf(additionalProperties.get(USE_COROUTINES).toString())); + this.setUseCoroutines(Boolean.parseBoolean(additionalProperties.get(USE_COROUTINES).toString())); } if (!hasRx && !hasRx2 && !hasRx3 && !hasCoroutines) { @@ -521,15 +521,15 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { typeMapping.put("object", "kotlin.String"); // kotlin.Any not serializable // multiplatform import mapping - importMapping.put("BigDecimal", "kotlin.Double"); - importMapping.put("UUID", "kotlin.String"); - importMapping.put("URI", "kotlin.String"); + importMapping.put("BigDecimal", "Double"); + importMapping.put("UUID", "String"); + importMapping.put("URI", "String"); importMapping.put("InputProvider", "io.ktor.client.request.forms.InputProvider"); importMapping.put("File", packageName + ".infrastructure.OctetByteArray"); - importMapping.put("Timestamp", "kotlin.String"); + importMapping.put("Timestamp", "String"); importMapping.put("LocalDateTime", "kotlin.String"); - importMapping.put("LocalDate", "kotlin.String"); - importMapping.put("LocalTime", "kotlin.String"); + importMapping.put("LocalDate", "String"); + importMapping.put("LocalTime", "String"); importMapping.put("Base64ByteArray", packageName + ".infrastructure.Base64ByteArray"); importMapping.put("OctetByteArray", packageName + ".infrastructure.OctetByteArray"); @@ -547,14 +547,15 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { supportingFiles.add(new SupportingFile("auth/OAuth.kt.mustache", authFolder, "OAuth.kt")); // multiplatform specific testing files - supportingFiles.add(new SupportingFile("commonTest/Coroutine.kt.mustache", "src/commonTest/kotlin/util", "Coroutine.kt")); - supportingFiles.add(new SupportingFile("iosTest/Coroutine.kt.mustache", "src/iosTest/kotlin/util", "Coroutine.kt")); - supportingFiles.add(new SupportingFile("jsTest/Coroutine.kt.mustache", "src/jsTest/kotlin/util", "Coroutine.kt")); - supportingFiles.add(new SupportingFile("jvmTest/Coroutine.kt.mustache", "src/jvmTest/kotlin/util", "Coroutine.kt")); + supportingFiles.add(new SupportingFile("commonTest/Coroutine.kt.mustache", "common/src/test/util", "Coroutine.kt")); + supportingFiles.add(new SupportingFile("iosTest/Coroutine.kt.mustache", "ios/src/test/util", "Coroutine.kt")); + supportingFiles.add(new SupportingFile("jsTest/Coroutine.kt.mustache", "js/src/test/util", "Coroutine.kt")); + supportingFiles.add(new SupportingFile("jvmTest/Coroutine.kt.mustache", "jvm/src/test/util", "Coroutine.kt")); // gradle wrapper supporting files supportingFiles.add(new SupportingFile("gradlew.mustache", "", "gradlew")); supportingFiles.add(new SupportingFile("gradlew.bat.mustache", "", "gradlew.bat")); + supportingFiles.add(new SupportingFile("gradle.properties", "", "gradle.peoperties")); supportingFiles.add(new SupportingFile("gradle-wrapper.properties.mustache", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.properties")); supportingFiles.add(new SupportingFile("gradle-wrapper.jar", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.jar")); } @@ -568,9 +569,14 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { } private void commonSupportingFiles() { + if (getLibrary().equals(MULTIPLATFORM)) { + supportingFiles.add(new SupportingFile("build.gradle.kts.mustache", "", "build.gradle.kts")); + supportingFiles.add(new SupportingFile("settings.gradle.kts.mustache", "", "settings.gradle.kts")); + } else { + supportingFiles.add(new SupportingFile("build.gradle.mustache", "", "build.gradle")); + supportingFiles.add(new SupportingFile("settings.gradle.mustache", "", "settings.gradle")); + } supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); - supportingFiles.add(new SupportingFile("build.gradle.mustache", "", "build.gradle")); - supportingFiles.add(new SupportingFile("settings.gradle.mustache", "", "settings.gradle")); } @Override diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/README.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/README.mustache index eebddf4b196..85e183eed49 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/README.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/README.mustache @@ -7,7 +7,7 @@ * Gradle 4.9 {{/jvm}} {{#multiplatform}} -* Kotlin 1.3.50 +* Kotlin 1.3.72 {{/multiplatform}} ## Build @@ -36,7 +36,7 @@ This runs all tests and packages the library. {{#jvm}}* Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets.{{/jvm}} {{#generateApiDocs}} -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *{{{basePath}}}* @@ -48,7 +48,7 @@ Class | Method | HTTP request | Description {{/generateApiDocs}} {{#generateModelDocs}} -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models {{#modelPackage}} @@ -60,7 +60,7 @@ No model defined in this package {{/modelPackage}} {{/generateModelDocs}} -<a name="documentation-for-authorization"></a>{{! TODO: optional documentation for authorization? }} +<a id="documentation-for-authorization"></a>{{! TODO: optional documentation for authorization? }} ## Documentation for Authorization {{^authMethods}} @@ -72,7 +72,7 @@ Authentication schemes defined for the API: {{/last}} {{/authMethods}} {{#authMethods}} -<a name="{{name}}"></a> +<a id="{{name}}"></a> ### {{name}} {{#isApiKey}}- **Type**: API key diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/class_doc.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/class_doc.mustache index a3405b25c84..b6b482afb78 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/class_doc.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/class_doc.mustache @@ -7,7 +7,7 @@ Name | Type | Description | Notes {{/vars}} {{#vars}}{{#isEnum}} -<a name="{{{datatypeWithEnum}}}"></a>{{!NOTE: see java's resources "pojo_doc.mustache" once enums are fully implemented}} +<a id="{{{datatypeWithEnum}}}"></a>{{!NOTE: see java's resources "pojo_doc.mustache" once enums are fully implemented}} ## Enum: {{baseName}} Name | Value ---- | -----{{#allowableValues}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache index 1b63b087811..9374c72417b 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache @@ -23,14 +23,15 @@ import kotlinx.android.parcel.Parcelize {{/multiplatform}} {{#multiplatform}} import kotlinx.serialization.* -import kotlinx.serialization.internal.CommonEnumSerializer {{/multiplatform}} {{#serializableModel}} import java.io.Serializable {{/serializableModel}} +import kotlin.collections.* /** * {{{description}}} + * {{#allVars}} * @param {{{name}}} {{{description}}} {{/allVars}} @@ -60,14 +61,13 @@ import java.io.Serializable {{#vars}} {{#isEnum}} /** - * {{{description}}} - * Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} - */ - {{#multiplatform}}@Serializable(with = {{nameInCamelCase}}.Serializer::class){{/multiplatform}} - {{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{{nameInCamelCase}}}(val value: {{^isContainer}}{{dataType}}{{/isContainer}}{{#isContainer}}kotlin.String{{/isContainer}}){ + * {{{description}}} + * + * Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} + */ + {{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{{nameInCamelCase}}}(val value: {{^isContainer}}{{dataType}}{{/isContainer}}{{#isContainer}}String{{/isContainer}}){ {{#allowableValues}} {{#enumVars}} - {{^multiplatform}} {{#moshi}} @Json(name = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}} {{/moshi}} @@ -77,16 +77,11 @@ import java.io.Serializable {{#jackson}} @JsonProperty(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}} {{/jackson}} - {{/multiplatform}} {{#multiplatform}} - {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}} + @SerialName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}} {{/multiplatform}} {{/enumVars}} {{/allowableValues}} - {{#multiplatform}} - - {{#nonPublicApi}}internal {{/nonPublicApi}}object Serializer : CommonEnumSerializer<{{nameInCamelCase}}>("{{nameInCamelCase}}", values(), values().map { it.value.toString() }.toTypedArray()) - {{/multiplatform}} } {{/isEnum}} {{/vars}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache index cbf85029fca..8fd2f6063e5 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache @@ -1,5 +1,7 @@ {{#description}} - /* {{{description}}} */ + /** + * {{{description}}} + */ {{/description}} {{^multiplatform}} {{#moshi}} @@ -15,4 +17,4 @@ {{#deprecated}} @Deprecated(message = "This property is deprecated.") {{/deprecated}} - {{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}}{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}} \ No newline at end of file + {{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}}{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}List{{/isList}}{{^isList}}Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_req_var.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_req_var.mustache index eb18e85c4ce..fd9740086a7 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_req_var.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_req_var.mustache @@ -1,5 +1,7 @@ {{#description}} - /* {{{description}}} */ + /** + * {{{description}}} + */ {{/description}} {{^multiplatform}} {{#moshi}} @@ -15,4 +17,8 @@ {{#deprecated}} @Deprecated(message = "This property is deprecated.") {{/deprecated}} - {{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") @Required {{/multiplatform}}{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}} \ No newline at end of file + {{#multiplatform}} + @SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") + @Required + {{/multiplatform}} + {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}List{{/isList}}{{^isList}}Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache index 8de73d46049..2bce60dbe8c 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache @@ -11,18 +11,17 @@ import com.fasterxml.jackson.annotation.JsonProperty {{/multiplatform}} {{#multiplatform}} import kotlinx.serialization.* -import kotlinx.serialization.internal.CommonEnumSerializer {{/multiplatform}} /** -* {{{description}}} -* Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} -*/ -{{#multiplatform}}@Serializable(with = {{classname}}.Serializer::class){{/multiplatform}} -{{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{classname}}(val value: {{{dataType}}}){ + * {{{description}}} + * + * Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} + */ +{{#multiplatform}}@Serializable{{/multiplatform}} +{{#nonPublicApi}}internal {{/nonPublicApi}}enum class{{classname}}(val value: {{{dataType}}}) { {{#allowableValues}}{{#enumVars}} - {{^multiplatform}} {{#moshi}} @Json(name = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{/moshi}} @@ -32,6 +31,8 @@ import kotlinx.serialization.internal.CommonEnumSerializer {{#jackson}} @JsonProperty(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{/jackson}} + {{#multiplatform}} + @SerialName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{/multiplatform}} {{#isListContainer}} {{#isList}} @@ -48,14 +49,10 @@ import kotlinx.serialization.internal.CommonEnumSerializer {{/enumVars}}{{/allowableValues}} /** - This override toString avoids using the enum var name and uses the actual api value instead. - In cases the var name and value are different, the client would send incorrect enums to the server. - **/ + * This override toString avoids using the enum var name and uses the actual api value instead. + * In cases the var name and value are different, the client would send incorrect enums to the server. + */ override fun toString(): String { return value{{^isString}}.toString(){{/isString}} } - -{{#multiplatform}} - {{#nonPublicApi}}internal {{/nonPublicApi}}object Serializer : CommonEnumSerializer<{{classname}}>("{{classname}}", values(), values().map { it.value.toString() }.toTypedArray()) -{{/multiplatform}} } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/gradle.properties b/modules/openapi-generator/src/main/resources/kotlin-client/gradle.properties new file mode 100644 index 00000000000..29e08e8ca88 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/gradle.properties @@ -0,0 +1 @@ +kotlin.code.style=official \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/interface_opt_var.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/interface_opt_var.mustache index 3284d7b1db4..3c12573fbff 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/interface_opt_var.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/interface_opt_var.mustache @@ -1,5 +1,7 @@ {{#description}} - /* {{{description}}} */ + /** + * {{{description}}} + */ {{/description}} {{^multiplatform}} {{#moshi}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/interface_req_var.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/interface_req_var.mustache index ee62fbb2d12..cef7ea0a283 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/interface_req_var.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/interface_req_var.mustache @@ -1,5 +1,7 @@ {{#description}} - /* {{{description}}} */ + /** + * {{{description}}} + */ {{/description}} {{^multiplatform}} {{#moshi}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache new file mode 100644 index 00000000000..59392ff8aae --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache @@ -0,0 +1,132 @@ +plugins { + kotlin("multiplatform") version "1.3.72" + kotlin("plugin.serialization") version "1.3.72" +} + +group = "{{groupId}}" +version = "{{artifactVersion}}" + +val kotlin_version = "1.3.72" +val kotlinx_io_version = "0.1.16" +val ktor_version = "1.3.2" + +repositories { + jcenter() +} + +kotlin { + /* + * To find out how to configure the targets, please follow the link: + * https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#setting-up-targets + */ + jvm { + val main by compilations.getting { + kotlinOptions { + // Setup the Kotlin compiler options for the 'main' compilation: + jvmTarget = "1.8" + } + } + } + ios { + binaries { + framework { + freeCompilerArgs.add("-Xobjc-generics") + } + } + } + js() + + sourceSets { + val commonMain by getting { + kotlin.srcDir("common/src/main") + + dependencies { + implementation(kotlin("stdlib-common")) + api("io.ktor:ktor-client-core:$ktor_version") + api("io.ktor:ktor-client-json:$ktor_version") + api("io.ktor:ktor-client-serialization:$ktor_version") + implementation("org.jetbrains.kotlinx:kotlinx-io:$kotlinx_io_version") + } + } + + val commonTest by getting { + kotlin.srcDir("common/src/test") + + dependencies { + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + implementation("io.ktor:ktor-client-mock:$ktor_version") + } + } + + val jvmMain by getting { + kotlin.srcDir("jvm/src/main") + + dependencies { + implementation(kotlin("stdlib-jdk8")) + api("io.ktor:ktor-client-core-jvm:$ktor_version") + api("io.ktor:ktor-client-json-jvm:$ktor_version") + api("io.ktor:ktor-client-serialization-jvm:$ktor_version") + } + } + + val jvmTest by getting { + kotlin.srcDir("jvm/src/test") + + dependencies { + implementation(kotlin("test")) + implementation(kotlin("test-junit5")) + implementation("org.junit.jupiter:junit-jupiter:5.6.2") + implementation("io.ktor:ktor-client-mock-jvm:$ktor_version") + } + } + + val iosMain by getting { + kotlin.srcDir("ios/src/main") + + dependencies { + api("io.ktor:ktor-client-ios:$ktor_version") + api("io.ktor:ktor-client-json-native:$ktor_version") + api("io.ktor:ktor-client-serialization-native:$ktor_version") + } + } + + val iosTest by getting { + kotlin.srcDir("ios/src/test") + + dependencies { + implementation("io.ktor:ktor-client-mock-native:$ktor_version") + } + } + + val jsMain by getting { + kotlin.srcDir("js/src/main") + + dependencies { + implementation(kotlin("stdlib-js")) + api("io.ktor:ktor-client-js:$ktor_version") + api("io.ktor:ktor-client-json-js:$ktor_version") + api("io.ktor:ktor-client-serialization-js:$ktor_version") + } + } + + val jsTest by getting { + kotlin.srcDir("js/src/test") + + dependencies { + implementation("io.ktor:ktor-client-mock-js:$ktor_version") + } + } + } +} + +task iosTest { + def device = project.findProperty("device")?.toString() ?: "iPhone 8" + dependsOn("linkDebugTestIosX64") + group = JavaBasePlugin.VERIFICATION_GROUP + description = "Execute unit tests on $device simulator" + doLast { + val binary = kotlin.targets.iosX64.binaries.getTest("DEBUG") + exec { commandLine "xcrun", "simctl", "spawn", device, binary.outputFile } + } +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.mustache deleted file mode 100644 index dfc6736dc6d..00000000000 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.mustache +++ /dev/null @@ -1,161 +0,0 @@ -apply plugin: 'kotlin-multiplatform' -apply plugin: 'kotlinx-serialization' - -group '{{groupId}}' -version '{{artifactVersion}}' - -ext { - kotlin_version = '1.3.50' - kotlinx_version = '1.1.0' - coroutines_version = '1.3.1' - serialization_version = '0.12.0' - ktor_version = '1.2.4' -} - -buildscript { - repositories { - jcenter() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50" // $kotlin_version - classpath "org.jetbrains.kotlin:kotlin-serialization:1.3.50" // $kotlin_version - } -} - -repositories { - jcenter() -} - -kotlin { - jvm() - iosArm64() { binaries { framework { freeCompilerArgs.add("-Xobjc-generics") } } } - iosX64() { binaries { framework { freeCompilerArgs.add("-Xobjc-generics") } } } - js() - - sourceSets { - commonMain { - dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version" - api "io.ktor:ktor-client-core:$ktor_version" - api "io.ktor:ktor-client-json:$ktor_version" - api "io.ktor:ktor-client-serialization:$ktor_version" - } - } - - commonTest { - dependencies { - implementation "org.jetbrains.kotlin:kotlin-test-common" - implementation "org.jetbrains.kotlin:kotlin-test-annotations-common" - implementation "io.ktor:ktor-client-mock:$ktor_version" - } - } - - jvmMain { - dependsOn commonMain - dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serialization_version" - api "io.ktor:ktor-client-core-jvm:$ktor_version" - api "io.ktor:ktor-client-json-jvm:$ktor_version" - api "io.ktor:ktor-client-serialization-jvm:$ktor_version" - } - } - - jvmTest { - dependsOn commonTest - dependencies { - implementation "org.jetbrains.kotlin:kotlin-test" - implementation "org.jetbrains.kotlin:kotlin-test-junit" - implementation "io.ktor:ktor-client-mock-jvm:$ktor_version" - } - } - - iosMain { - dependsOn commonMain - dependencies { - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version" - api "io.ktor:ktor-client-ios:$ktor_version" - } - } - - iosTest { - dependsOn commonTest - dependencies { - implementation "io.ktor:ktor-client-mock-native:$ktor_version" - } - } - - iosArm64().compilations.main.defaultSourceSet { - dependsOn iosMain - dependencies { - api "io.ktor:ktor-client-ios-iosarm64:$ktor_version" - api "io.ktor:ktor-client-json-iosarm64:$ktor_version" - api "io.ktor:ktor-client-serialization-iosarm64:$ktor_version" - } - } - - iosArm64().compilations.test.defaultSourceSet { - dependsOn iosTest - } - - iosX64().compilations.main.defaultSourceSet { - dependsOn iosMain - dependencies { - api "io.ktor:ktor-client-ios-iosx64:$ktor_version" - api "io.ktor:ktor-client-json-iosx64:$ktor_version" - api "io.ktor:ktor-client-serialization-iosx64:$ktor_version" - } - } - - jsMain { - dependsOn commonMain - dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-js:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$serialization_version" - api "io.ktor:ktor-client-js:$ktor_version" - api "io.ktor:ktor-client-json-js:$ktor_version" - api "io.ktor:ktor-client-serialization-js:$ktor_version" - } - } - - jsTest { - dependsOn commonTest - dependencies { - implementation "io.ktor:ktor-client-mock-js:$ktor_version" - implementation "io.ktor:ktor-client-js:$ktor_version" - implementation "io.ktor:ktor-client-json:$ktor_version" - implementation "io.ktor:ktor-client-serialization-js:$ktor_version" - } - } - - iosX64().compilations.test.defaultSourceSet { - dependsOn iosTest - } - - all { - languageSettings { - useExperimentalAnnotation('kotlin.Experimental') - } - } - } -} - -task iosTest { - def device = project.findProperty("device")?.toString() ?: "iPhone 8" - dependsOn 'linkDebugTestIosX64' - group = JavaBasePlugin.VERIFICATION_GROUP - description = "Execute unit tests on ${device} simulator" - doLast { - def binary = kotlin.targets.iosX64.binaries.getTest('DEBUG') - exec { commandLine 'xcrun', 'simctl', 'spawn', device, binary.outputFile } - } -} - -configurations { // workaround for https://youtrack.jetbrains.com/issue/KT-27170 - compileClasspath -} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradle-wrapper.jar b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradle-wrapper.jar index 2c6137b87896c8f70315ae454e00a969ef5f6019..490fda8577df6c95960ba7077c43220e5bb2c0d9 100644 GIT binary patch literal 58694 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 delta 48559 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	S^vU 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 RyN?YF4IK>3u>04i{|7N0*}VV& diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradle-wrapper.properties.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradle-wrapper.properties.mustache index ce3ca77db54..8f38dbc2bfd 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradle-wrapper.properties.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradle-wrapper.properties.mustache @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradlew b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradlew new file mode 100755 index 00000000000..2fe81a7d95e --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# 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"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# 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 + ;; + 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" + which java >/dev/null 2>&1 || 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 + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradlew.bat b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradlew.bat new file mode 100644 index 00000000000..62bd9b9ccef --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/gradlew.bat @@ -0,0 +1,103 @@ +@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=. +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%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +: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 %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/settings.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/settings.gradle.kts.mustache new file mode 100644 index 00000000000..ba0114cb176 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/settings.gradle.kts.mustache @@ -0,0 +1 @@ +rootProject.name = "{{artifactId}}" diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/licenseInfo.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/licenseInfo.mustache index 3a547de74bb..835764cfc72 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/licenseInfo.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/licenseInfo.mustache @@ -1,11 +1,11 @@ /** -* {{{appName}}} -* {{{appDescription}}} -* -* {{#version}}The version of the OpenAPI document: {{{version}}}{{/version}} -* {{#infoEmail}}Contact: {{{infoEmail}}}{{/infoEmail}} -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ \ No newline at end of file + * {{{appName}}} + * {{{appDescription}}} + * + * {{#version}}The version of the OpenAPI document: {{{version}}}{{/version}} + * {{#infoEmail}}Contact: {{{infoEmail}}}{{/infoEmail}} + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * 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-client/settings.gradle.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/settings.gradle.mustache index 2a789fe8d04..448dc07602e 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/settings.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/settings.gradle.mustache @@ -1,2 +1 @@ -{{#multiplatform}}enableFeaturePreview('GRADLE_METADATA'){{/multiplatform}} rootProject.name = '{{artifactId}}' \ No newline at end of file -- GitLab From 5e4eff6227ac451291368c8ed02f65c660998075 Mon Sep 17 00:00:00 2001 From: Cromefire_ <cromefire_@outlook.com> Date: Fri, 7 Aug 2020 01:22:50 +0200 Subject: [PATCH 2/8] Fixed a lot of issues --- .gitignore | 7 +- .../languages/KotlinClientCodegen.java | 26 +-- .../kotlin-client/data_class.mustache | 2 +- .../kotlin-client/data_class_opt_var.mustache | 3 +- .../kotlin-client/enum_class.mustache | 4 +- .../libraries/multiplatform/api.mustache | 68 +++---- .../multiplatform/auth/ApiKeyAuth.kt.mustache | 2 +- .../auth/Authentication.kt.mustache | 4 +- .../auth/HttpBasicAuth.kt.mustache | 2 +- .../auth/HttpBearerAuth.kt.mustache | 2 +- .../multiplatform/auth/OAuth.kt.mustache | 2 +- .../multiplatform/build.gradle.kts.mustache | 31 +-- .../infrastructure/ApiClient.kt.mustache | 82 +++----- .../Base64ByteArray.kt.mustache | 5 +- .../infrastructure/Bytes.kt.mustache | 4 +- .../infrastructure/HttpResponse.kt.mustache | 28 +-- .../infrastructure/OctetByteArray.kt.mustache | 5 +- .../infrastructure/RequestConfig.kt.mustache | 16 ++ .../jvmTest/Coroutine.kt.mustache | 3 +- .../serial_wrapper_request_list.mustache | 11 +- .../serial_wrapper_request_map.mustache | 4 +- .../serial_wrapper_response_list.mustache | 11 +- .../serial_wrapper_response_map.mustache | 4 +- .../kotlin-client/settings.gradle.mustache | 2 +- samples/client/petstore/kotlin-gson/README.md | 10 +- .../client/petstore/kotlin-gson/docs/Order.md | 2 +- .../client/petstore/kotlin-gson/docs/Pet.md | 2 +- .../petstore/kotlin-gson/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../client/petstore/kotlin-jackson/README.md | 10 +- .../petstore/kotlin-jackson/docs/Order.md | 2 +- .../petstore/kotlin-jackson/docs/Pet.md | 2 +- .../petstore/kotlin-jackson/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../kotlin-json-request-string/README.md | 10 +- .../kotlin-json-request-string/docs/Order.md | 2 +- .../kotlin-json-request-string/docs/Pet.md | 2 +- .../settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../kotlin-jvm-okhttp4-coroutines/README.md | 10 +- .../docs/Order.md | 2 +- .../kotlin-jvm-okhttp4-coroutines/docs/Pet.md | 2 +- .../settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../petstore/kotlin-moshi-codegen/README.md | 10 +- .../kotlin-moshi-codegen/docs/Order.md | 2 +- .../petstore/kotlin-moshi-codegen/docs/Pet.md | 2 +- .../kotlin-moshi-codegen/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../.openapi-generator-ignore | 26 ++- .../.openapi-generator/FILES | 61 +++--- .../petstore/kotlin-multiplatform/README.md | 12 +- .../kotlin-multiplatform/build.gradle | 161 --------------- .../kotlin-multiplatform/build.gradle.kts | 119 +++++++++++ .../kotlin-multiplatform/docs/Order.md | 2 +- .../petstore/kotlin-multiplatform/docs/Pet.md | 2 +- .../kotlin-multiplatform/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.jar | Bin 58702 -> 99747 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../petstore/kotlin-multiplatform/gradlew | 109 ++++------ .../petstore/kotlin-multiplatform/gradlew.bat | 190 +++++++++--------- .../petstore/kotlin-multiplatform/pom.xml | 47 ----- .../kotlin-multiplatform/settings.gradle | 2 - .../kotlin-multiplatform/settings.gradle.kts | 1 + .../org/openapitools/client/apis/PetApi.kt | 188 +++++++++-------- .../org/openapitools/client/apis/StoreApi.kt | 97 +++++---- .../org/openapitools/client/apis/UserApi.kt | 178 ++++++++-------- .../openapitools/client/auth/ApiKeyAuth.kt | 2 +- .../client/auth/Authentication.kt | 4 +- .../openapitools/client/auth/HttpBasicAuth.kt | 2 +- .../client/auth/HttpBearerAuth.kt | 2 +- .../org/openapitools/client/auth/OAuth.kt | 2 +- .../client/infrastructure/ApiAbstractions.kt | 0 .../client/infrastructure/ApiClient.kt | 87 +++----- .../client/infrastructure/Base64ByteArray.kt | 5 +- .../client/infrastructure/Bytes.kt | 4 +- .../client/infrastructure/HttpResponse.kt | 28 +-- .../client/infrastructure/OctetByteArray.kt | 5 +- .../client/infrastructure/RequestConfig.kt | 6 +- .../client/infrastructure/RequestMethod.kt | 0 .../openapitools/client/models/ApiResponse.kt | 34 ++++ .../openapitools/client/models/Category.kt | 31 +++ .../org/openapitools/client/models/Order.kt | 61 ++++++ .../org/openapitools/client/models/Pet.kt | 65 ++++++ .../org/openapitools/client/models/Tag.kt | 31 +++ .../org/openapitools/client/models/User.kt | 52 +++++ .../src/common/test/util/Coroutine.kt | 23 +++ .../openapitools/client/models/ApiResponse.kt | 30 --- .../openapitools/client/models/Category.kt | 28 --- .../org/openapitools/client/models/Order.kt | 51 ----- .../org/openapitools/client/models/Pet.kt | 53 ----- .../org/openapitools/client/models/Tag.kt | 28 --- .../org/openapitools/client/models/User.kt | 41 ---- .../src/commonTest/kotlin/util/Coroutine.kt | 23 --- .../src/ios/test/util/Coroutine.kt | 18 ++ .../src/iosTest/kotlin/util/Coroutine.kt | 18 -- .../kotlin => js/test}/util/Coroutine.kt | 0 .../src/jvm/test/util/Coroutine.kt | 19 ++ .../src/jvmTest/kotlin/util/Coroutine.kt | 18 -- .../petstore/kotlin-nonpublic/README.md | 10 +- .../petstore/kotlin-nonpublic/docs/Order.md | 2 +- .../petstore/kotlin-nonpublic/docs/Pet.md | 2 +- .../petstore/kotlin-nonpublic/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../client/petstore/kotlin-nullable/README.md | 10 +- .../petstore/kotlin-nullable/docs/Order.md | 2 +- .../petstore/kotlin-nullable/docs/Pet.md | 2 +- .../petstore/kotlin-nullable/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../client/petstore/kotlin-okhttp3/README.md | 10 +- .../petstore/kotlin-okhttp3/docs/Order.md | 2 +- .../petstore/kotlin-okhttp3/docs/Pet.md | 2 +- .../petstore/kotlin-okhttp3/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../petstore/kotlin-retrofit2-rx3/README.md | 10 +- .../kotlin-retrofit2-rx3/docs/Order.md | 2 +- .../petstore/kotlin-retrofit2-rx3/docs/Pet.md | 2 +- .../kotlin-retrofit2-rx3/settings.gradle | 3 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../petstore/kotlin-retrofit2/README.md | 10 +- .../petstore/kotlin-retrofit2/docs/Order.md | 2 +- .../petstore/kotlin-retrofit2/docs/Pet.md | 2 +- .../petstore/kotlin-retrofit2/settings.gradle | 3 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../client/petstore/kotlin-string/README.md | 10 +- .../petstore/kotlin-string/docs/Order.md | 2 +- .../client/petstore/kotlin-string/docs/Pet.md | 2 +- .../petstore/kotlin-string/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- .../petstore/kotlin-threetenbp/README.md | 10 +- .../petstore/kotlin-threetenbp/docs/Order.md | 2 +- .../petstore/kotlin-threetenbp/docs/Pet.md | 2 +- .../kotlin-threetenbp/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- samples/client/petstore/kotlin/README.md | 10 +- samples/client/petstore/kotlin/docs/Order.md | 2 +- samples/client/petstore/kotlin/docs/Pet.md | 2 +- .../client/petstore/kotlin/settings.gradle | 3 +- .../org/openapitools/client/apis/PetApi.kt | 20 +- .../org/openapitools/client/apis/StoreApi.kt | 20 +- .../org/openapitools/client/apis/UserApi.kt | 20 +- .../openapitools/client/models/ApiResponse.kt | 27 ++- .../openapitools/client/models/Category.kt | 26 ++- .../org/openapitools/client/models/Order.kt | 42 ++-- .../org/openapitools/client/models/Pet.kt | 40 ++-- .../org/openapitools/client/models/Tag.kt | 26 ++- .../org/openapitools/client/models/User.kt | 36 ++-- 237 files changed, 3092 insertions(+), 2648 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/RequestConfig.kt.mustache delete mode 100644 samples/client/petstore/kotlin-multiplatform/build.gradle create mode 100644 samples/client/petstore/kotlin-multiplatform/build.gradle.kts create mode 100644 samples/client/petstore/kotlin-multiplatform/gradle.properties mode change 100755 => 100644 samples/client/petstore/kotlin-multiplatform/gradlew delete mode 100644 samples/client/petstore/kotlin-multiplatform/pom.xml delete mode 100644 samples/client/petstore/kotlin-multiplatform/settings.gradle create mode 100644 samples/client/petstore/kotlin-multiplatform/settings.gradle.kts rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/apis/PetApi.kt (65%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/apis/StoreApi.kt (70%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/apis/UserApi.kt (64%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/auth/ApiKeyAuth.kt (82%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/auth/Authentication.kt (71%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/auth/HttpBasicAuth.kt (80%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/auth/HttpBearerAuth.kt (81%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/auth/OAuth.kt (66%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/infrastructure/ApiAbstractions.kt (100%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/infrastructure/ApiClient.kt (60%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/infrastructure/Base64ByteArray.kt (75%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/infrastructure/Bytes.kt (96%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/infrastructure/HttpResponse.kt (54%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/infrastructure/OctetByteArray.kt (75%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/infrastructure/RequestConfig.kt (77%) rename samples/client/petstore/kotlin-multiplatform/src/{commonMain/kotlin => common/main}/org/openapitools/client/infrastructure/RequestMethod.kt (100%) create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/ApiResponse.kt create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Category.kt create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Order.kt create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Pet.kt create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Tag.kt create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/User.kt create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/test/util/Coroutine.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/ApiResponse.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Category.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Order.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Tag.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/User.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/commonTest/kotlin/util/Coroutine.kt create mode 100644 samples/client/petstore/kotlin-multiplatform/src/ios/test/util/Coroutine.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/iosTest/kotlin/util/Coroutine.kt rename samples/client/petstore/kotlin-multiplatform/src/{jsTest/kotlin => js/test}/util/Coroutine.kt (100%) create mode 100644 samples/client/petstore/kotlin-multiplatform/src/jvm/test/util/Coroutine.kt delete mode 100644 samples/client/petstore/kotlin-multiplatform/src/jvmTest/kotlin/util/Coroutine.kt diff --git a/.gitignore b/.gitignore index 14b5a330802..818f28173f7 100644 --- a/.gitignore +++ b/.gitignore @@ -188,14 +188,11 @@ samples/server/petstore/aspnetcore/.vs/ effective.pom # kotlin -samples/client/petstore/kotlin/src/main/kotlin/test/ -samples/client/petstore/kotlin-threetenbp/build -samples/client/petstore/kotlin-string/build +samples/client/petstore/kotlin*/build +samples/client/petstore/kotlin*/.gradle samples/openapi3/client/petstore/kotlin/build samples/server/petstore/kotlin-server/ktor/build samples/server/petstore/kotlin-springboot/build -samples/client/petstore/kotlin-multiplatform/build/ -samples/client/petstore/kotlin-okhttp3/build/ \? # haskell diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java index 72ff8cc8b81..e19250bcfae 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java @@ -150,6 +150,8 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { // cliOptions default redefinition need to be updated updateOption(CodegenConstants.ARTIFACT_ID, this.artifactId); updateOption(CodegenConstants.PACKAGE_NAME, this.packageName); + // Kotlin convention + updateOption(CodegenConstants.ENUM_PROPERTY_NAMING, "PascalCase"); outputFolder = "generated-code" + File.separator + "kotlin-client"; modelTemplateFiles.put("model.mustache", ".kt"); @@ -284,7 +286,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { super.processOpts(); if (MULTIPLATFORM.equals(getLibrary())) { - sourceFolder = "common/src/main"; + sourceFolder = "src/common/main"; } @@ -522,14 +524,14 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { // multiplatform import mapping importMapping.put("BigDecimal", "Double"); - importMapping.put("UUID", "String"); - importMapping.put("URI", "String"); + importMapping.put("UUID", "kotlin.String"); + importMapping.put("URI", "kotlin.String"); importMapping.put("InputProvider", "io.ktor.client.request.forms.InputProvider"); importMapping.put("File", packageName + ".infrastructure.OctetByteArray"); - importMapping.put("Timestamp", "String"); + importMapping.put("Timestamp", "kotlin.String"); importMapping.put("LocalDateTime", "kotlin.String"); - importMapping.put("LocalDate", "String"); - importMapping.put("LocalTime", "String"); + importMapping.put("LocalDate", "kotlin.String"); + importMapping.put("LocalTime", "kotlin.String"); importMapping.put("Base64ByteArray", packageName + ".infrastructure.Base64ByteArray"); importMapping.put("OctetByteArray", packageName + ".infrastructure.OctetByteArray"); @@ -547,15 +549,15 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { supportingFiles.add(new SupportingFile("auth/OAuth.kt.mustache", authFolder, "OAuth.kt")); // multiplatform specific testing files - supportingFiles.add(new SupportingFile("commonTest/Coroutine.kt.mustache", "common/src/test/util", "Coroutine.kt")); - supportingFiles.add(new SupportingFile("iosTest/Coroutine.kt.mustache", "ios/src/test/util", "Coroutine.kt")); - supportingFiles.add(new SupportingFile("jsTest/Coroutine.kt.mustache", "js/src/test/util", "Coroutine.kt")); - supportingFiles.add(new SupportingFile("jvmTest/Coroutine.kt.mustache", "jvm/src/test/util", "Coroutine.kt")); + supportingFiles.add(new SupportingFile("commonTest/Coroutine.kt.mustache", "src/common/test/util", "Coroutine.kt")); + supportingFiles.add(new SupportingFile("iosTest/Coroutine.kt.mustache", "src/ios/test/util", "Coroutine.kt")); + supportingFiles.add(new SupportingFile("jsTest/Coroutine.kt.mustache", "src/js/test/util", "Coroutine.kt")); + supportingFiles.add(new SupportingFile("jvmTest/Coroutine.kt.mustache", "src/jvm/test/util", "Coroutine.kt")); // gradle wrapper supporting files supportingFiles.add(new SupportingFile("gradlew.mustache", "", "gradlew")); supportingFiles.add(new SupportingFile("gradlew.bat.mustache", "", "gradlew.bat")); - supportingFiles.add(new SupportingFile("gradle.properties", "", "gradle.peoperties")); + supportingFiles.add(new SupportingFile("gradle.properties", "", "gradle.properties")); supportingFiles.add(new SupportingFile("gradle-wrapper.properties.mustache", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.properties")); supportingFiles.add(new SupportingFile("gradle-wrapper.jar", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.jar")); } @@ -569,7 +571,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { } private void commonSupportingFiles() { - if (getLibrary().equals(MULTIPLATFORM)) { + if (MULTIPLATFORM.equals(getLibrary())) { supportingFiles.add(new SupportingFile("build.gradle.kts.mustache", "", "build.gradle.kts")); supportingFiles.add(new SupportingFile("settings.gradle.kts.mustache", "", "settings.gradle.kts")); } else { diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache index 9374c72417b..ba3132e00d6 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache @@ -43,7 +43,7 @@ import kotlin.collections.* {{#isDeprecated}} @Deprecated(message = "This schema is deprecated.") {{/isDeprecated}} -{{#nonPublicApi}}internal {{/nonPublicApi}}{{#discriminator}}interface{{/discriminator}}{{^discriminator}}data class{{/discriminator}} {{classname}}{{^discriminator}} ( +{{#nonPublicApi}}internal {{/nonPublicApi}}{{#discriminator}}interface{{/discriminator}}{{^discriminator}}data class{{/discriminator}} {{classname}}{{^discriminator}}( {{#allVars}} {{#required}}{{>data_class_req_var}}{{/required}}{{^required}}{{>data_class_opt_var}}{{/required}}{{^-last}},{{/-last}} {{/allVars}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache index 8fd2f6063e5..c2cca54ff4d 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache @@ -17,4 +17,5 @@ {{#deprecated}} @Deprecated(message = "This property is deprecated.") {{/deprecated}} - {{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}}{{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}List{{/isList}}{{^isList}}Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}} \ No newline at end of file + {{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}} + {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}List{{/isList}}{{^isList}}Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache index 2bce60dbe8c..8b9d30eb459 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache @@ -19,9 +19,10 @@ import kotlinx.serialization.* * Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} */ {{#multiplatform}}@Serializable{{/multiplatform}} -{{#nonPublicApi}}internal {{/nonPublicApi}}enum class{{classname}}(val value: {{{dataType}}}) { +{{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{classname}}(val value: {{{dataType}}}) { {{#allowableValues}}{{#enumVars}} + {{^multiplatform}} {{#moshi}} @Json(name = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{/moshi}} @@ -31,6 +32,7 @@ import kotlinx.serialization.* {{#jackson}} @JsonProperty(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{/jackson}} + {{/multiplatform}} {{#multiplatform}} @SerialName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{/multiplatform}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache index d268f23a77d..9856348d370 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache @@ -6,27 +6,27 @@ package {{apiPackage}} import {{packageName}}.infrastructure.* import io.ktor.client.request.forms.formData -import kotlinx.serialization.UnstableDefault import io.ktor.client.engine.HttpClientEngine import io.ktor.client.features.json.serializer.KotlinxSerializer +import io.ktor.client.request.forms.FormPart import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonConfiguration import io.ktor.http.ParametersBuilder import kotlinx.serialization.* -import kotlinx.serialization.internal.StringDescriptor +import kotlinx.serialization.builtins.list +import kotlinx.serialization.builtins.serializer {{#operations}} -{{#nonPublicApi}}internal {{/nonPublicApi}}class {{classname}} @UseExperimental(UnstableDefault::class) constructor( +{{#nonPublicApi}}internal {{/nonPublicApi}}class {{classname}} constructor( baseUrl: kotlin.String = "{{{basePath}}}", httpClientEngine: HttpClientEngine? = null, serializer: KotlinxSerializer ) : ApiClient(baseUrl, httpClientEngine, serializer) { - @UseExperimental(UnstableDefault::class) constructor( - baseUrl: kotlin.String = "{{{basePath}}}", + baseUrl: String = "{{{basePath}}}", httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Default + jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) {{#operation}} @@ -39,17 +39,21 @@ import kotlinx.serialization.internal.StringDescriptor {{#returnType}} @Suppress("UNCHECKED_CAST") {{/returnType}} - suspend fun {{operationId}}({{#allParams}}{{{paramName}}}: {{{dataType}}}{{^required}}?{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}): HttpResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}}> { - + suspend fun {{operationId}}( + {{#allParams}} + {{{paramName}}}: {{{dataType}}}{{^required}}? = null{{/required}}{{#hasMore}},{{/hasMore}} + {{/allParams}} + ): HttpResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}}> { + {{! TODO: Optimize all the ?.let to only the places where it's needed }} val localVariableAuthNames = listOf<String>({{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}}) - val localVariableBody = {{#hasBodyParam}}{{#bodyParam}}{{#isListContainer}}{{operationIdCamelCase}}Request({{{paramName}}}{{^isList}}.asList(){{/isList}}){{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}{{operationIdCamelCase}}Request({{{paramName}}}){{/isMapContainer}}{{^isMapContainer}}{{{paramName}}}{{/isMapContainer}}{{/isListContainer}}{{/bodyParam}}{{/hasBodyParam}} + val localVariableBody = {{#hasBodyParam}}{{#bodyParam}}{{#isListContainer}}{{{paramName}}}?.let { {{operationIdCamelCase}}Request(it{{^isList}}.asList(){{/isList}}) }{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}{{{paramName}}}?.let { {{operationIdCamelCase}}Request(it) }{{/isMapContainer}}{{^isMapContainer}}{{{paramName}}}{{/isMapContainer}}{{/isListContainer}}{{/bodyParam}}{{/hasBodyParam}} {{^hasBodyParam}} {{#hasFormParams}} {{#isMultipart}} formData { {{#formParams}} - {{{paramName}}}?.apply { append("{{{baseName}}}", {{{paramName}}}) } + {{{paramName}}}?.let { append(FormPart("{{{baseName}}}", it)) } {{/formParams}} } {{/isMultipart}} @@ -66,19 +70,22 @@ import kotlinx.serialization.internal.StringDescriptor {{/hasFormParams}} {{/hasBodyParam}} - val localVariableQuery = mutableMapOf<String, List<String>>() - {{#queryParams}} - {{{paramName}}}?.apply { localVariableQuery["{{baseName}}"] = {{#isContainer}}toMultiValue(this, "{{collectionFormat}}"){{/isContainer}}{{^isContainer}}listOf("${{{paramName}}}"){{/isContainer}} } - {{/queryParams}} + {{! TODO: Don't use all the listOf() }} + val localVariableQuery = mutableMapOf<String, List<String>?>( + {{#queryParams}} + "{{baseName}}" to {{#isContainer}}{{{paramName}}}?.let { toMultiValue(it, "{{collectionFormat}}") }{{/isContainer}}{{^isContainer}}listOf("${{{paramName}}}"){{/isContainer}}{{#hasMore}},{{/hasMore}} + {{/queryParams}} + ) - val localVariableHeaders = mutableMapOf<String, String>() - {{#headerParams}} - {{{paramName}}}?.apply { localVariableHeaders["{{baseName}}"] = {{#isContainer}}this.joinToString(separator = collectionDelimiter("{{collectionFormat}}")){{/isContainer}}{{^isContainer}}this.toString(){{/isContainer}} } - {{/headerParams}} + val localVariableHeaders = mutableMapOf<String, String?>( + {{#headerParams}} + "{{baseName}}" to {{#isContainer}}{{{paramName}}}?.joinToString(separator = collectionDelimiter("{{collectionFormat}}")){{/isContainer}}{{^isContainer}}this?.toString(){{/isContainer}}{{#hasMore}},{{/hasMore}} + {{/headerParams}} + ) val localVariableConfig = RequestConfig( RequestMethod.{{httpMethod}}, - "{{path}}"{{#pathParams}}.replace("{" + "{{baseName}}" + "}", "${{{paramName}}}"){{/pathParams}}, + "{{path}}"{{#pathParams}}.replace("{{curly true}}{{baseName}}{{curly}}", "${{{paramName}}}"){{/pathParams}}, query = localVariableQuery, headers = localVariableHeaders ) @@ -89,8 +96,8 @@ import kotlinx.serialization.internal.StringDescriptor localVariableAuthNames ).{{#isListContainer}}wrap<{{operationIdCamelCase}}Response>().map { value{{^isList}}.toTypedArray(){{/isList}} }{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}wrap<{{operationIdCamelCase}}Response>().map { value }{{/isMapContainer}}{{^isMapContainer}}wrap(){{/isMapContainer}}{{/isListContainer}} } - {{#hasBodyParam}} + {{#bodyParam}} {{#isListContainer}}{{>serial_wrapper_request_list}}{{/isListContainer}}{{#isMapContainer}}{{>serial_wrapper_request_map}}{{/isMapContainer}} {{/bodyParam}} @@ -101,25 +108,6 @@ import kotlinx.serialization.internal.StringDescriptor {{#isMapContainer}} {{>serial_wrapper_response_map}} {{/isMapContainer}} - - {{/operation}} - - {{#nonPublicApi}}internal {{/nonPublicApi}}companion object { - internal fun setMappers(serializer: KotlinxSerializer) { - {{#operation}} - {{#hasBodyParam}} - {{#bodyParam}} - {{#isListContainer}}serializer.setMapper({{operationIdCamelCase}}Request::class, {{operationIdCamelCase}}Request.serializer()){{/isListContainer}}{{#isMapContainer}}serializer.setMapper({{operationIdCamelCase}}Request::class, {{operationIdCamelCase}}Request.serializer()){{/isMapContainer}} - {{/bodyParam}} - {{/hasBodyParam}} - {{#isListContainer}} - serializer.setMapper({{operationIdCamelCase}}Response::class, {{operationIdCamelCase}}Response.serializer()) - {{/isListContainer}} - {{#isMapContainer}} - serializer.setMapper({{operationIdCamelCase}}Response::class, {{operationIdCamelCase}}Response.serializer()) - {{/isMapContainer}} - {{/operation}} - } - } +{{/operation}} } {{/operations}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/ApiKeyAuth.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/ApiKeyAuth.kt.mustache index 618fd7a8890..05447201fb8 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/ApiKeyAuth.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/ApiKeyAuth.kt.mustache @@ -4,7 +4,7 @@ class ApiKeyAuth(private val location: String, val paramName: String) : Authenti var apiKey: String? = null var apiKeyPrefix: String? = null - override fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) { + override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { val key: String = apiKey ?: return val prefix: String? = apiKeyPrefix val value: String = if (prefix != null) "$prefix $key" else key diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/Authentication.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/Authentication.kt.mustache index 1aab9156d98..4f7101a95f1 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/Authentication.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/Authentication.kt.mustache @@ -1,13 +1,11 @@ package {{packageName}}.auth interface Authentication { - /** * Apply authentication settings to header and query params. * * @param query Query parameters. * @param headers Header parameters. */ - fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) - + fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBasicAuth.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBasicAuth.kt.mustache index ef6c5888ae1..3a8c5a76cc2 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBasicAuth.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBasicAuth.kt.mustache @@ -8,7 +8,7 @@ class HttpBasicAuth : Authentication { var password: String? = null @InternalAPI - override fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) { + override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { if (username == null && password == null) return val str = (username ?: "") + ":" + (password ?: "") val auth = str.encodeBase64() diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBearerAuth.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBearerAuth.kt.mustache index 982389d0960..d7ac04766ee 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBearerAuth.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBearerAuth.kt.mustache @@ -3,7 +3,7 @@ package {{packageName}}.auth class HttpBearerAuth(private val scheme: String?) : Authentication { var bearerToken: String? = null - override fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) { + override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { val token: String = bearerToken ?: return headers["Authorization"] = (if (scheme != null) upperCaseBearer(scheme)!! + " " else "") + token } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/OAuth.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/OAuth.kt.mustache index 98bb449a609..5d9ccf6bb97 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/OAuth.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/OAuth.kt.mustache @@ -3,7 +3,7 @@ package {{packageName}}.auth class OAuth : Authentication { var accessToken: String? = null - override fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) { + override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { val token: String = accessToken ?: return headers["Authorization"] = "Bearer $token" } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache index 59392ff8aae..dbc070fe6f1 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache @@ -7,7 +7,6 @@ group = "{{groupId}}" version = "{{artifactVersion}}" val kotlin_version = "1.3.72" -val kotlinx_io_version = "0.1.16" val ktor_version = "1.3.2" repositories { @@ -30,7 +29,7 @@ kotlin { ios { binaries { framework { - freeCompilerArgs.add("-Xobjc-generics") + freeCompilerArgs = listOf("-Xobjc-generics") } } } @@ -38,19 +37,18 @@ kotlin { sourceSets { val commonMain by getting { - kotlin.srcDir("common/src/main") + kotlin.srcDir("src/common/main") dependencies { implementation(kotlin("stdlib-common")) api("io.ktor:ktor-client-core:$ktor_version") api("io.ktor:ktor-client-json:$ktor_version") api("io.ktor:ktor-client-serialization:$ktor_version") - implementation("org.jetbrains.kotlinx:kotlinx-io:$kotlinx_io_version") } } val commonTest by getting { - kotlin.srcDir("common/src/test") + kotlin.srcDir("src/common/test") dependencies { implementation(kotlin("test-common")) @@ -60,7 +58,7 @@ kotlin { } val jvmMain by getting { - kotlin.srcDir("jvm/src/main") + kotlin.srcDir("src/jvm/main") dependencies { implementation(kotlin("stdlib-jdk8")) @@ -71,7 +69,7 @@ kotlin { } val jvmTest by getting { - kotlin.srcDir("jvm/src/test") + kotlin.srcDir("src/jvm/test") dependencies { implementation(kotlin("test")) @@ -82,7 +80,7 @@ kotlin { } val iosMain by getting { - kotlin.srcDir("ios/src/main") + kotlin.srcDir("src/ios/main") dependencies { api("io.ktor:ktor-client-ios:$ktor_version") @@ -92,7 +90,7 @@ kotlin { } val iosTest by getting { - kotlin.srcDir("ios/src/test") + kotlin.srcDir("src/ios/test") dependencies { implementation("io.ktor:ktor-client-mock-native:$ktor_version") @@ -100,7 +98,7 @@ kotlin { } val jsMain by getting { - kotlin.srcDir("js/src/main") + kotlin.srcDir("src/js/main") dependencies { implementation(kotlin("stdlib-js")) @@ -111,7 +109,7 @@ kotlin { } val jsTest by getting { - kotlin.srcDir("js/src/test") + kotlin.srcDir("src/js/test") dependencies { implementation("io.ktor:ktor-client-mock-js:$ktor_version") @@ -119,14 +117,3 @@ kotlin { } } } - -task iosTest { - def device = project.findProperty("device")?.toString() ?: "iPhone 8" - dependsOn("linkDebugTestIosX64") - group = JavaBasePlugin.VERIFICATION_GROUP - description = "Execute unit tests on $device simulator" - doLast { - val binary = kotlin.targets.iosX64.binaries.getTest("DEBUG") - exec { commandLine "xcrun", "simctl", "spawn", device, binary.outputFile } - } -} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache index ae65921bb77..632b95c575f 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache @@ -2,44 +2,35 @@ package {{packageName}}.infrastructure import io.ktor.client.HttpClient import io.ktor.client.HttpClientConfig -import io.ktor.client.call.call import io.ktor.client.engine.HttpClientEngine import io.ktor.client.features.json.JsonFeature -import io.ktor.client.features.json.JsonSerializer import io.ktor.client.features.json.serializer.KotlinxSerializer -import io.ktor.client.request.accept import io.ktor.client.request.forms.FormDataContent import io.ktor.client.request.forms.MultiPartFormDataContent import io.ktor.client.request.header import io.ktor.client.request.parameter -import io.ktor.client.response.HttpResponse +import io.ktor.client.request.request +import io.ktor.client.statement.HttpResponse import io.ktor.client.utils.EmptyContent import io.ktor.http.* import io.ktor.http.content.OutgoingContent import io.ktor.http.content.PartData -import kotlinx.serialization.UnstableDefault import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonConfiguration -import {{apiPackage}}.* -import {{modelPackage}}.* import {{packageName}}.auth.* {{#nonPublicApi}}internal {{/nonPublicApi}}open class ApiClient( private val baseUrl: String, httpClientEngine: HttpClientEngine?, - serializer: KotlinxSerializer) { + private val serializer: KotlinxSerializer +) { - @UseExperimental(UnstableDefault::class) constructor( baseUrl: String, httpClientEngine: HttpClientEngine?, - jsonConfiguration: JsonConfiguration) : - this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) - - private val serializer: JsonSerializer by lazy { - serializer.apply { setMappers(this) }.ignoreOutgoingContent() - } + jsonConfiguration: JsonConfiguration + ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) private val client: HttpClient by lazy { val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClient.serializer } @@ -47,29 +38,20 @@ import {{packageName}}.auth.* httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig) } {{#hasAuthMethods}} - private val authentications: kotlin.collections.Map<String, Authentication> by lazy { - mapOf({{#authMethods}}{{#isBasic}}{{#isBasicBasic}} + private val authentications: Map<String, Authentication> = mapOf({{#authMethods}}{{#isBasic}}{{#isBasicBasic}} "{{name}}" to HttpBasicAuth(){{/isBasicBasic}}{{^isBasicBasic}} "{{name}}" to HttpBearerAuth("{{scheme}}"){{/isBasicBasic}}{{/isBasic}}{{#isApiKey}} "{{name}}" to ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{^isKeyInHeader}}"query"{{/isKeyInHeader}}, "{{keyParamName}}"){{/isApiKey}}{{#isOAuth}} - "{{name}}" to OAuth(){{/isOAuth}}{{#hasMore}}, {{/hasMore}}{{/authMethods}}) - } + "{{name}}" to OAuth(){{/isOAuth}}{{#hasMore}}, {{/hasMore}}{{/authMethods}} + ) {{/hasAuthMethods}} + {{^hasAuthMethods}} - private val authentications: kotlin.collections.Map<String, Authentication>? = null + private val authentications: Map<String, Authentication> = mapOf() {{/hasAuthMethods}} {{#nonPublicApi}}internal {{/nonPublicApi}}companion object { protected val UNSAFE_HEADERS = listOf(HttpHeaders.ContentType) - - private fun setMappers(serializer: KotlinxSerializer) { - {{#apiInfo}}{{#apis}} - {{classname}}.setMappers(serializer) - {{/apis}}{{/apiInfo}} - {{#models}} - {{#model}}{{^isAlias}}serializer.setMapper({{modelPackage}}.{{classname}}::class, {{modelPackage}}.{{classname}}.{{#isEnum}}Serializer{{/isEnum}}{{^isEnum}}serializer(){{/isEnum}}){{/isAlias}}{{/model}} - {{/models}} - } } /** @@ -78,7 +60,7 @@ import {{packageName}}.auth.* * @param username Username */ fun setUsername(username: String) { - val auth = authentications?.values?.firstOrNull { it is HttpBasicAuth } as HttpBasicAuth? + val auth = authentications.values.firstOrNull { it is HttpBasicAuth } as HttpBasicAuth? ?: throw Exception("No HTTP basic authentication configured") auth.username = username } @@ -89,7 +71,7 @@ import {{packageName}}.auth.* * @param password Password */ fun setPassword(password: String) { - val auth = authentications?.values?.firstOrNull { it is HttpBasicAuth } as HttpBasicAuth? + val auth = authentications.values.firstOrNull { it is HttpBasicAuth } as HttpBasicAuth? ?: throw Exception("No HTTP basic authentication configured") auth.password = password } @@ -101,7 +83,7 @@ import {{packageName}}.auth.* * @param paramName The name of the API key parameter, or null or set the first key. */ fun setApiKey(apiKey: String, paramName: String? = null) { - val auth = authentications?.values?.firstOrNull { it is ApiKeyAuth && (paramName == null || paramName == it.paramName)} as ApiKeyAuth? + val auth = authentications.values.firstOrNull { it is ApiKeyAuth && (paramName == null || paramName == it.paramName)} as ApiKeyAuth? ?: throw Exception("No API key authentication configured") auth.apiKey = apiKey } @@ -113,7 +95,7 @@ import {{packageName}}.auth.* * @param paramName The name of the API key parameter, or null or set the first key. */ fun setApiKeyPrefix(apiKeyPrefix: String, paramName: String? = null) { - val auth = authentications?.values?.firstOrNull { it is ApiKeyAuth && (paramName == null || paramName == it.paramName) } as ApiKeyAuth? + val auth = authentications.values.firstOrNull { it is ApiKeyAuth && (paramName == null || paramName == it.paramName) } as ApiKeyAuth? ?: throw Exception("No API key authentication configured") auth.apiKeyPrefix = apiKeyPrefix } @@ -124,7 +106,7 @@ import {{packageName}}.auth.* * @param accessToken Access token */ fun setAccessToken(accessToken: String) { - val auth = authentications?.values?.firstOrNull { it is OAuth } as OAuth? + val auth = authentications.values.firstOrNull { it is OAuth } as OAuth? ?: throw Exception("No OAuth2 authentication configured") auth.accessToken = accessToken } @@ -135,36 +117,36 @@ import {{packageName}}.auth.* * @param bearerToken The bearer token. */ fun setBearerToken(bearerToken: String) { - val auth = authentications?.values?.firstOrNull { it is HttpBearerAuth } as HttpBearerAuth? + val auth = authentications.values.firstOrNull { it is HttpBearerAuth } as HttpBearerAuth? ?: throw Exception("No Bearer authentication configured") auth.bearerToken = bearerToken } - protected suspend fun multipartFormRequest(requestConfig: RequestConfig, body: kotlin.collections.List<PartData>?, authNames: kotlin.collections.List<String>): HttpResponse { + protected suspend fun multipartFormRequest(requestConfig: RequestConfig, body: List<PartData>?, authNames: List<String>): HttpResponse { return request(requestConfig, MultiPartFormDataContent(body ?: listOf()), authNames) } - protected suspend fun urlEncodedFormRequest(requestConfig: RequestConfig, body: Parameters?, authNames: kotlin.collections.List<String>): HttpResponse { + protected suspend fun urlEncodedFormRequest(requestConfig: RequestConfig, body: Parameters?, authNames: List<String>): HttpResponse { return request(requestConfig, FormDataContent(body ?: Parameters.Empty), authNames) } - protected suspend fun jsonRequest(requestConfig: RequestConfig, body: Any? = null, authNames: kotlin.collections.List<String>): HttpResponse { + protected suspend fun jsonRequest(requestConfig: RequestConfig, body: Any? = null, authNames: List<String>): HttpResponse { val contentType = (requestConfig.headers[HttpHeaders.ContentType]?.let { ContentType.parse(it) } ?: ContentType.Application.Json) return if (body != null) request(requestConfig, serializer.write(body, contentType), authNames) else request(requestConfig, authNames = authNames) } - protected suspend fun request(requestConfig: RequestConfig, body: OutgoingContent = EmptyContent, authNames: kotlin.collections.List<String>): HttpResponse { + protected suspend fun request(requestConfig: RequestConfig, body: OutgoingContent = EmptyContent, authNames: List<String>): HttpResponse { requestConfig.updateForAuth(authNames) val headers = requestConfig.headers - return client.call { + return client.request { this.url { this.takeFrom(URLBuilder(baseUrl)) appendPath(requestConfig.path.trimStart('/').split('/')) requestConfig.query.forEach { query -> - query.value.forEach { value -> + query.value?.forEach { value -> parameter(query.key, value) } } @@ -174,17 +156,17 @@ import {{packageName}}.auth.* if (requestConfig.method in listOf(RequestMethod.PUT, RequestMethod.POST, RequestMethod.PATCH)) this.body = body - }.response + } } - private fun RequestConfig.updateForAuth(authNames: kotlin.collections.List<String>) { + private fun RequestConfig.updateForAuth(authNames: List<String>) { for (authName in authNames) { - val auth = authentications?.get(authName) ?: throw Exception("Authentication undefined: $authName") + val auth = authentications[authName] ?: throw Exception("Authentication undefined: $authName") auth.apply(query, headers) } } - private fun URLBuilder.appendPath(components: kotlin.collections.List<String>): URLBuilder = apply { + private fun URLBuilder.appendPath(components: List<String>): URLBuilder = apply { encodedPath = encodedPath.trimEnd('/') + components.joinToString("/", prefix = "/") { it.encodeURLQueryComponent() } } @@ -199,13 +181,3 @@ import {{packageName}}.auth.* RequestMethod.OPTIONS -> HttpMethod.Options } } - -// https://github.com/ktorio/ktor/issues/851 -private fun JsonSerializer.ignoreOutgoingContent() = IgnoreOutgoingContentJsonSerializer(this) - -private class IgnoreOutgoingContentJsonSerializer(private val delegate: JsonSerializer) : JsonSerializer by delegate { - override fun write(data: Any): OutgoingContent { - if (data is OutgoingContent) return data - return delegate.write(data) - } -} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Base64ByteArray.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Base64ByteArray.kt.mustache index 168cfc993c3..14ff8ddf45d 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Base64ByteArray.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Base64ByteArray.kt.mustache @@ -1,14 +1,13 @@ package {{packageName}}.infrastructure import kotlinx.serialization.* -import kotlinx.serialization.internal.StringDescriptor @Serializable class Base64ByteArray(val value: ByteArray) { @Serializer(Base64ByteArray::class) companion object : KSerializer<Base64ByteArray> { - override val descriptor = StringDescriptor.withName("Base64ByteArray") - override fun serialize(encoder: Encoder, obj: Base64ByteArray) = encoder.encodeString(obj.value.encodeBase64()) + override val descriptor = PrimitiveDescriptor("Base64ByteArray", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: Base64ByteArray) = encoder.encodeString(value.value.encodeBase64()) override fun deserialize(decoder: Decoder) = Base64ByteArray(decoder.decodeString().decodeBase64Bytes()) } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Bytes.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Bytes.kt.mustache index b85013e647b..dc30e36dcc1 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Bytes.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Bytes.kt.mustache @@ -1,6 +1,6 @@ package {{packageName}}.infrastructure -import kotlinx.io.core.* +import io.ktor.utils.io.core.* import kotlin.experimental.and private val digits = "0123456789abcdef".toCharArray() @@ -14,7 +14,7 @@ private fun ByteArray.clearFrom(from: Int) = (from until size).forEach { this[it private fun Int.toBase64(): Char = BASE64_ALPHABET[this] private fun Byte.fromBase64(): Byte = BASE64_INVERSE_ALPHABET[toInt() and 0xff].toByte() and BASE64_MASK internal fun ByteArray.encodeBase64(): String = buildPacket { writeFully(this@encodeBase64) }.encodeBase64() -internal fun String.decodeBase64Bytes(): ByteArray = buildPacket { writeStringUtf8(dropLastWhile { it == BASE64_PAD }) }.decodeBase64Bytes().readBytes() +internal fun String.decodeBase64Bytes(): ByteArray = buildPacket { writeText(dropLastWhile { it == BASE64_PAD }) }.decodeBase64Bytes().readBytes() /** * Encode [bytes] as a HEX string with no spaces, newlines and `0x` prefixes. diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/HttpResponse.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/HttpResponse.kt.mustache index 87f27a5cf56..a570d4a5138 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/HttpResponse.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/HttpResponse.kt.mustache @@ -4,8 +4,9 @@ import io.ktor.client.call.TypeInfo import io.ktor.client.call.typeInfo import io.ktor.http.Headers import io.ktor.http.isSuccess +import io.ktor.client.statement.HttpResponse as KtorHttpResponse -{{#nonPublicApi}}internal {{/nonPublicApi}}open class HttpResponse<T : Any>(val response: io.ktor.client.response.HttpResponse, val provider: BodyProvider<T>) { +{{#nonPublicApi}}internal {{/nonPublicApi}}open class HttpResponse<T : Any>(val response: KtorHttpResponse, val provider: BodyProvider<T>) { val status: Int = response.status.value val success: Boolean = response.status.isSuccess() val headers: Map<String, List<String>> = response.headers.mapEntries() @@ -22,29 +23,30 @@ import io.ktor.http.isSuccess } {{#nonPublicApi}}internal {{/nonPublicApi}}interface BodyProvider<T : Any> { - suspend fun body(response: io.ktor.client.response.HttpResponse): T - suspend fun <V : Any> typedBody(response: io.ktor.client.response.HttpResponse, type: TypeInfo): V + suspend fun body(response: KtorHttpResponse): T + suspend fun <V : Any> typedBody(response: KtorHttpResponse, type: TypeInfo): V } {{#nonPublicApi}}internal {{/nonPublicApi}}class TypedBodyProvider<T : Any>(private val type: TypeInfo) : BodyProvider<T> { @Suppress("UNCHECKED_CAST") - override suspend fun body(response: io.ktor.client.response.HttpResponse): T = - response.call.receive(type) as T + override suspend fun body(response: KtorHttpResponse): T = + response.call.receive(type) as T @Suppress("UNCHECKED_CAST") - override suspend fun <V : Any> typedBody(response: io.ktor.client.response.HttpResponse, type: TypeInfo): V = - response.call.receive(type) as V + override suspend fun <V : Any> typedBody(response: KtorHttpResponse, type: TypeInfo): V = + response.call.receive(type) as V } -{{#nonPublicApi}}internal {{/nonPublicApi}}class MappedBodyProvider<S : Any, T : Any>(private val provider: BodyProvider<S>, private val block: S.() -> T) : BodyProvider<T> { - override suspend fun body(response: io.ktor.client.response.HttpResponse): T = - block(provider.body(response)) +{{#nonPublicApi}}internal {{/nonPublicApi}}class MappedBodyProvider<S : Any, T : Any>(private val provider: BodyProvider<S>, private val block: S.() -> T) : + BodyProvider<T> { + override suspend fun body(response: KtorHttpResponse): T = + block(provider.body(response)) - override suspend fun <V : Any> typedBody(response: io.ktor.client.response.HttpResponse, type: TypeInfo): V = - provider.typedBody(response, type) + override suspend fun <V : Any> typedBody(response: KtorHttpResponse, type: TypeInfo): V = + provider.typedBody(response, type) } -{{#nonPublicApi}}internal {{/nonPublicApi}}inline fun <reified T : Any> io.ktor.client.response.HttpResponse.wrap(): HttpResponse<T> = +{{#nonPublicApi}}internal {{/nonPublicApi}}inline fun <reified T : Any> KtorHttpResponse.wrap(): HttpResponse<T> = HttpResponse(this, TypedBodyProvider(typeInfo<T>())) {{#nonPublicApi}}internal {{/nonPublicApi}}fun <T : Any, V : Any> HttpResponse<T>.map(block: T.() -> V): HttpResponse<V> = diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/OctetByteArray.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/OctetByteArray.kt.mustache index c23ac3ec000..3ba3b74be0c 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/OctetByteArray.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/OctetByteArray.kt.mustache @@ -1,14 +1,13 @@ package {{packageName}}.infrastructure import kotlinx.serialization.* -import kotlinx.serialization.internal.StringDescriptor @Serializable class OctetByteArray(val value: ByteArray) { @Serializer(OctetByteArray::class) companion object : KSerializer<OctetByteArray> { - override val descriptor = StringDescriptor.withName("OctetByteArray") - override fun serialize(encoder: Encoder, obj: OctetByteArray) = encoder.encodeString(hex(obj.value)) + override val descriptor = PrimitiveDescriptor("OctetByteArray", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OctetByteArray) = encoder.encodeString(hex(value.value)) override fun deserialize(decoder: Decoder) = OctetByteArray(hex(decoder.decodeString())) } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/RequestConfig.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/RequestConfig.kt.mustache new file mode 100644 index 00000000000..56ca714971e --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/RequestConfig.kt.mustache @@ -0,0 +1,16 @@ +package {{packageName}}.infrastructure + +/** + * Defines a config object for a given request. + * NOTE: This object doesn't include 'body' because it + * allows for caching of the constructed object + * for many request definitions. + * NOTE: Headers is a Map<String,String> because rfc2616 defines + * multi-valued headers as csv-only. + */ +{{#nonPublicApi}}internal {{/nonPublicApi}}data class RequestConfig( + val method: RequestMethod, + val path: String, + val headers: MutableMap<String, String?> = mutableMapOf(), + val query: MutableMap<String, List<String>?> = mutableMapOf() +) diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/jvmTest/Coroutine.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/jvmTest/Coroutine.kt.mustache index 351c0120b7b..5a4da4ee0f5 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/jvmTest/Coroutine.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/jvmTest/Coroutine.kt.mustache @@ -3,6 +3,7 @@ package util import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.runBlocking import kotlin.coroutines.EmptyCoroutineContext -internal actual fun <T> runTest(block: suspend CoroutineScope.() -> T): T = kotlinx.coroutines.runBlocking(EmptyCoroutineContext, block) +internal actual fun <T> runTest(block: suspend CoroutineScope.() -> T): T = runBlocking(EmptyCoroutineContext, block) diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_list.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_list.mustache index a44a242cbd2..d637b98683b 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_list.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_list.mustache @@ -2,9 +2,12 @@ private class {{operationIdCamelCase}}Request(val value: List<{{#bodyParam}}{{baseType}}{{/bodyParam}}>) { @Serializer({{operationIdCamelCase}}Request::class) {{#nonPublicApi}}internal {{/nonPublicApi}}companion object : KSerializer<{{operationIdCamelCase}}Request> { - private val serializer: KSerializer<List<{{#bodyParam}}{{baseType}}{{/bodyParam}}>> = {{#bodyParam}}{{baseType}}{{/bodyParam}}.serializer().list - override val descriptor = StringDescriptor.withName("{{operationIdCamelCase}}Request") - override fun serialize(encoder: Encoder, obj: {{operationIdCamelCase}}Request) = serializer.serialize(encoder, obj.value) - override fun deserialize(decoder: Decoder) = {{operationIdCamelCase}}Request(serializer.deserialize(decoder)) + private val serializer = {{#bodyParam}}{{baseType}}{{/bodyParam}}.serializer().list + override val descriptor = PrimitiveDescriptor("{{operationIdCamelCase}}Request", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: {{operationIdCamelCase}}Request) = + serializer.serialize(encoder, value.value) + + override fun deserialize(decoder: Decoder) = {{operationIdCamelCase}}Request(serializer.deserialize(decoder)) } } \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_map.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_map.mustache index 5dc6864aae8..011c57d6c66 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_map.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_map.mustache @@ -3,8 +3,8 @@ @Serializer({{operationIdCamelCase}}Request::class) {{#nonPublicApi}}internal {{/nonPublicApi}}companion object : KSerializer<{{operationIdCamelCase}}Request> { private val serializer: KSerializer<Map<kotlin.String, {{#bodyParam}}{{baseType}}{{/bodyParam}}>> = (kotlin.String.serializer() to {{#bodyParam}}{{baseType}}{{/bodyParam}}.serializer()).map - override val descriptor = StringDescriptor.withName("{{operationIdCamelCase}}Request") - override fun serialize(encoder: Encoder, obj: {{operationIdCamelCase}}Request) = serializer.serialize(encoder, obj.value) + override val descriptor = PrimitiveDescriptor("{{operationIdCamelCase}}Request", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: {{operationIdCamelCase}}Request) = serializer.serialize(encoder, value.value) override fun deserialize(decoder: Decoder) = {{operationIdCamelCase}}Request(serializer.deserialize(decoder)) } } \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_list.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_list.mustache index a4e70a219ca..c3ba3adce3d 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_list.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_list.mustache @@ -2,9 +2,12 @@ private class {{operationIdCamelCase}}Response(val value: List<{{returnBaseType}}>) { @Serializer({{operationIdCamelCase}}Response::class) {{#nonPublicApi}}internal {{/nonPublicApi}}companion object : KSerializer<{{operationIdCamelCase}}Response> { - private val serializer: KSerializer<List<{{returnBaseType}}>> = {{returnBaseType}}.serializer().list - override val descriptor = StringDescriptor.withName("{{operationIdCamelCase}}Response") - override fun serialize(encoder: Encoder, obj: {{operationIdCamelCase}}Response) = serializer.serialize(encoder, obj.value) - override fun deserialize(decoder: Decoder) = {{operationIdCamelCase}}Response(serializer.deserialize(decoder)) + private val serializer = {{returnBaseType}}.serializer().list + override val descriptor = PrimitiveDescriptor("{{operationIdCamelCase}}Response", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: {{operationIdCamelCase}}Response) = + serializer.serialize(encoder, value.value) + + override fun deserialize(decoder: Decoder) = {{operationIdCamelCase}}Response(serializer.deserialize(decoder)) } } \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_map.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_map.mustache index 8253dc1f1a1..7c747b1e425 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_map.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_map.mustache @@ -3,8 +3,8 @@ @Serializer({{operationIdCamelCase}}Response::class) {{#nonPublicApi}}internal {{/nonPublicApi}}companion object : KSerializer<{{operationIdCamelCase}}Response> { private val serializer: KSerializer<Map<kotlin.String, {{returnBaseType}}>> = (kotlin.String.serializer() to {{returnBaseType}}.serializer()).map - override val descriptor = StringDescriptor.withName("{{operationIdCamelCase}}Response") - override fun serialize(encoder: Encoder, obj: {{operationIdCamelCase}}Response) = serializer.serialize(encoder, obj.value) + override val descriptor = PrimitiveDescriptor("{{operationIdCamelCase}}Response", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: {{operationIdCamelCase}}Response) = serializer.serialize(encoder, value.value) override fun deserialize(decoder: Decoder) = {{operationIdCamelCase}}Response(serializer.deserialize(decoder)) } } \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/settings.gradle.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/settings.gradle.mustache index 448dc07602e..cc08101c2a2 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/settings.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/settings.gradle.mustache @@ -1 +1 @@ -rootProject.name = '{{artifactId}}' \ No newline at end of file +rootProject.name = '{{artifactId}}' diff --git a/samples/client/petstore/kotlin-gson/README.md b/samples/client/petstore/kotlin-gson/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-gson/README.md +++ b/samples/client/petstore/kotlin-gson/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-gson/docs/Order.md b/samples/client/petstore/kotlin-gson/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-gson/docs/Order.md +++ b/samples/client/petstore/kotlin-gson/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-gson/docs/Pet.md b/samples/client/petstore/kotlin-gson/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-gson/docs/Pet.md +++ b/samples/client/petstore/kotlin-gson/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-gson/settings.gradle b/samples/client/petstore/kotlin-gson/settings.gradle index 207bc66a067..a36725d2cb6 100644 --- a/samples/client/petstore/kotlin-gson/settings.gradle +++ b/samples/client/petstore/kotlin-gson/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-gson' \ No newline at end of file +rootProject.name = 'kotlin-petstore-gson' diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 60f72b51af9..621943f0f01 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 08822c67e32..c42220e5f4c 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 258a2540e9e..df7073fbc88 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 54df813fcee..6409c6cc0f3 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,32 +1,37 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @SerializedName("code") + val code: kotlin.Int? = null, @SerializedName("type") + val type: kotlin.String? = null, @SerializedName("message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt index fdefa74fda0..65412f610b3 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Order.kt index 049c89df313..8375127110e 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -24,27 +26,35 @@ import com.google.gson.annotations.SerializedName * @param complete */ -data class Order ( +data class Order( @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("petId") + val petId: kotlin.Long? = null, @SerializedName("quantity") + val quantity: kotlin.Int? = null, @SerializedName("shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @SerializedName("status") + val status: Order.Status? = null, @SerializedName("complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @SerializedName(value = "placed") placed("placed"), @SerializedName(value = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Pet.kt index af29ef2b61b..e852fd3fa4d 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,23 +1,25 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category import org.openapitools.client.models.Tag import com.google.gson.annotations.SerializedName +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -26,27 +28,33 @@ import com.google.gson.annotations.SerializedName * @param status pet status in the store */ -data class Pet ( +data class Pet( @SerializedName("name") val name: kotlin.String, @SerializedName("photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("category") + val category: Category? = null, @SerializedName("tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @SerializedName("status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @SerializedName(value = "available") available("available"), @SerializedName(value = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Tag.kt index 28e82b1df68..380648dcd14 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/User.kt index 62baf33e927..f84ff307825 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -26,23 +28,33 @@ import com.google.gson.annotations.SerializedName * @param userStatus User Status */ -data class User ( +data class User( @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("username") + val username: kotlin.String? = null, @SerializedName("firstName") + val firstName: kotlin.String? = null, @SerializedName("lastName") + val lastName: kotlin.String? = null, @SerializedName("email") + val email: kotlin.String? = null, @SerializedName("password") + val password: kotlin.String? = null, @SerializedName("phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @SerializedName("userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-jackson/README.md b/samples/client/petstore/kotlin-jackson/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-jackson/README.md +++ b/samples/client/petstore/kotlin-jackson/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-jackson/docs/Order.md b/samples/client/petstore/kotlin-jackson/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-jackson/docs/Order.md +++ b/samples/client/petstore/kotlin-jackson/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-jackson/docs/Pet.md b/samples/client/petstore/kotlin-jackson/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-jackson/docs/Pet.md +++ b/samples/client/petstore/kotlin-jackson/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-jackson/settings.gradle b/samples/client/petstore/kotlin-jackson/settings.gradle index 28e8da587f0..ef91c4caa68 100644 --- a/samples/client/petstore/kotlin-jackson/settings.gradle +++ b/samples/client/petstore/kotlin-jackson/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-jackson' \ No newline at end of file +rootProject.name = 'kotlin-petstore-jackson' diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 60f72b51af9..621943f0f01 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 08822c67e32..c42220e5f4c 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 258a2540e9e..df7073fbc88 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index c341f8ca321..d188547f609 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,32 +1,37 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.fasterxml.jackson.annotation.JsonProperty +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @field:JsonProperty("code") + val code: kotlin.Int? = null, @field:JsonProperty("type") + val type: kotlin.String? = null, @field:JsonProperty("message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Category.kt index 2ed5390c1f3..282700d3878 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.fasterxml.jackson.annotation.JsonProperty +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @field:JsonProperty("id") + val id: kotlin.Long? = null, @field:JsonProperty("name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Order.kt index c7df5b55614..9355bd6ac31 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.fasterxml.jackson.annotation.JsonProperty +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -24,27 +26,35 @@ import com.fasterxml.jackson.annotation.JsonProperty * @param complete */ -data class Order ( +data class Order( @field:JsonProperty("id") + val id: kotlin.Long? = null, @field:JsonProperty("petId") + val petId: kotlin.Long? = null, @field:JsonProperty("quantity") + val quantity: kotlin.Int? = null, @field:JsonProperty("shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @field:JsonProperty("status") + val status: Order.Status? = null, @field:JsonProperty("complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: PLACED,APPROVED,DELIVERED - */ - + * Order Status + * + * Values: PLACED,APPROVED,DELIVERED + */ enum class Status(val value: kotlin.String){ @JsonProperty(value = "placed") PLACED("placed"), @JsonProperty(value = "approved") APPROVED("approved"), diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Pet.kt index be5b168e2d8..f929547b0f3 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,23 +1,25 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category import org.openapitools.client.models.Tag import com.fasterxml.jackson.annotation.JsonProperty +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -26,27 +28,33 @@ import com.fasterxml.jackson.annotation.JsonProperty * @param status pet status in the store */ -data class Pet ( +data class Pet( @field:JsonProperty("name") val name: kotlin.String, @field:JsonProperty("photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @field:JsonProperty("id") + val id: kotlin.Long? = null, @field:JsonProperty("category") + val category: Category? = null, @field:JsonProperty("tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @field:JsonProperty("status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: AVAILABLE,PENDING,SOLD - */ - + * pet status in the store + * + * Values: AVAILABLE,PENDING,SOLD + */ enum class Status(val value: kotlin.String){ @JsonProperty(value = "available") AVAILABLE("available"), @JsonProperty(value = "pending") PENDING("pending"), diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Tag.kt index 7243f42ed7d..106b57ab299 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.fasterxml.jackson.annotation.JsonProperty +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @field:JsonProperty("id") + val id: kotlin.Long? = null, @field:JsonProperty("name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/User.kt index e8f639e5092..15bdd07bfa2 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.fasterxml.jackson.annotation.JsonProperty +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -26,23 +28,33 @@ import com.fasterxml.jackson.annotation.JsonProperty * @param userStatus User Status */ -data class User ( +data class User( @field:JsonProperty("id") + val id: kotlin.Long? = null, @field:JsonProperty("username") + val username: kotlin.String? = null, @field:JsonProperty("firstName") + val firstName: kotlin.String? = null, @field:JsonProperty("lastName") + val lastName: kotlin.String? = null, @field:JsonProperty("email") + val email: kotlin.String? = null, @field:JsonProperty("password") + val password: kotlin.String? = null, @field:JsonProperty("phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @field:JsonProperty("userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-json-request-string/README.md b/samples/client/petstore/kotlin-json-request-string/README.md index 971d17b1e24..ed9b800a0f1 100644 --- a/samples/client/petstore/kotlin-json-request-string/README.md +++ b/samples/client/petstore/kotlin-json-request-string/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-json-request-string/docs/Order.md b/samples/client/petstore/kotlin-json-request-string/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-json-request-string/docs/Order.md +++ b/samples/client/petstore/kotlin-json-request-string/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-json-request-string/docs/Pet.md b/samples/client/petstore/kotlin-json-request-string/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-json-request-string/docs/Pet.md +++ b/samples/client/petstore/kotlin-json-request-string/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-json-request-string/settings.gradle b/samples/client/petstore/kotlin-json-request-string/settings.gradle index 24764e682e7..dedd56bdccd 100644 --- a/samples/client/petstore/kotlin-json-request-string/settings.gradle +++ b/samples/client/petstore/kotlin-json-request-string/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-json-request-string' \ No newline at end of file +rootProject.name = 'kotlin-petstore-json-request-string' diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 584c6ef0686..fb60b108c95 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 08822c67e32..c42220e5f4c 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 258a2540e9e..df7073fbc88 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index fafca8738f6..36db4bcb996 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,32 +1,37 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Category.kt index a4c17c3b49d..653069f5198 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Order.kt index a66c335904e..bf6fb8a4d2c 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -24,27 +26,35 @@ import com.squareup.moshi.Json * @param complete */ -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Pet.kt index a3df06cb6eb..e800cb5f94f 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,23 +1,25 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category import org.openapitools.client.models.Tag import com.squareup.moshi.Json +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -26,27 +28,33 @@ import com.squareup.moshi.Json * @param status pet status in the store */ -data class Pet ( +data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Tag.kt index 6e619023a5c..f8b04268ae3 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/User.kt index af1e270325d..a8efdaeb5fe 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -26,23 +28,33 @@ import com.squareup.moshi.Json * @param userStatus User Status */ -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/README.md b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/README.md +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/docs/Order.md b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/docs/Order.md +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/docs/Pet.md b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/docs/Pet.md +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/settings.gradle b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/settings.gradle index 6ca85294a54..47dee9b1180 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/settings.gradle +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-okhttp4-coroutines-client' \ No newline at end of file +rootProject.name = 'kotlin-petstore-okhttp4-coroutines-client' diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 1cff24913d6..f1f3c09d631 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index deb7ba6cf49..2ba42eb5ab7 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 6494674c7f3..bf66ae62348 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index fc89bf34e7f..b477db1469e 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,33 +1,38 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName import java.io.Serializable +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @SerializedName("code") + val code: kotlin.Int? = null, @SerializedName("type") + val type: kotlin.String? = null, @SerializedName("message") + val message: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Category.kt index b483bee69b3..b07978b706e 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName import java.io.Serializable +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("name") + val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Order.kt index d6bacf867c4..454fbcf9156 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName import java.io.Serializable +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -25,19 +27,27 @@ import java.io.Serializable * @param complete */ -data class Order ( +data class Order( @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("petId") + val petId: kotlin.Long? = null, @SerializedName("quantity") + val quantity: kotlin.Int? = null, @SerializedName("shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @SerializedName("status") + val status: Order.Status? = null, @SerializedName("complete") + val complete: kotlin.Boolean? = null ) : Serializable { companion object { @@ -45,10 +55,10 @@ data class Order ( } /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @SerializedName(value = "placed") placed("placed"), @SerializedName(value = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Pet.kt index afa65785d38..ffcb6f11dcc 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category @@ -16,9 +16,11 @@ import org.openapitools.client.models.Tag import com.google.gson.annotations.SerializedName import java.io.Serializable +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -27,19 +29,25 @@ import java.io.Serializable * @param status pet status in the store */ -data class Pet ( +data class Pet( @SerializedName("name") val name: kotlin.String, @SerializedName("photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("category") + val category: Category? = null, @SerializedName("tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @SerializedName("status") + val status: Pet.Status? = null ) : Serializable { companion object { @@ -47,10 +55,10 @@ data class Pet ( } /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @SerializedName(value = "available") available("available"), @SerializedName(value = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Tag.kt index a1a282cb38d..febd9eae081 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName import java.io.Serializable +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("name") + val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/User.kt index 59ba0254f60..0de0ad65eeb 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.google.gson.annotations.SerializedName import java.io.Serializable +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -27,23 +29,33 @@ import java.io.Serializable * @param userStatus User Status */ -data class User ( +data class User( @SerializedName("id") + val id: kotlin.Long? = null, @SerializedName("username") + val username: kotlin.String? = null, @SerializedName("firstName") + val firstName: kotlin.String? = null, @SerializedName("lastName") + val lastName: kotlin.String? = null, @SerializedName("email") + val email: kotlin.String? = null, @SerializedName("password") + val password: kotlin.String? = null, @SerializedName("phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @SerializedName("userStatus") + val userStatus: kotlin.Int? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-moshi-codegen/README.md b/samples/client/petstore/kotlin-moshi-codegen/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/README.md +++ b/samples/client/petstore/kotlin-moshi-codegen/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-moshi-codegen/docs/Order.md b/samples/client/petstore/kotlin-moshi-codegen/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/docs/Order.md +++ b/samples/client/petstore/kotlin-moshi-codegen/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-moshi-codegen/docs/Pet.md b/samples/client/petstore/kotlin-moshi-codegen/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/docs/Pet.md +++ b/samples/client/petstore/kotlin-moshi-codegen/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-moshi-codegen/settings.gradle b/samples/client/petstore/kotlin-moshi-codegen/settings.gradle index 692eb84d7e1..a49864cc295 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/settings.gradle +++ b/samples/client/petstore/kotlin-moshi-codegen/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-moshi-codegen' \ No newline at end of file +rootProject.name = 'kotlin-petstore-moshi-codegen' diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 60f72b51af9..621943f0f01 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 08822c67e32..c42220e5f4c 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 258a2540e9e..df7073fbc88 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 18d2ce3dbbe..e9f96bf1c99 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,33 +1,38 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ @JsonClass(generateAdapter = true) -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Category.kt index 8396fa42357..0fa0d400851 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ @JsonClass(generateAdapter = true) -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Order.kt index d7091dd4c0c..5544a8f122c 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -25,27 +27,35 @@ import com.squareup.moshi.JsonClass * @param complete */ @JsonClass(generateAdapter = true) -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Pet.kt index 8b4e6b44d4c..1d4b7ebc2f3 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category @@ -16,9 +16,11 @@ import org.openapitools.client.models.Tag import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -27,27 +29,33 @@ import com.squareup.moshi.JsonClass * @param status pet status in the store */ @JsonClass(generateAdapter = true) -data class Pet ( +data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Tag.kt index e7cdab2bb5d..4b382da5e4d 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ @JsonClass(generateAdapter = true) -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/User.kt index 1bfad844904..0a51a7fb86b 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -27,23 +29,33 @@ import com.squareup.moshi.JsonClass * @param userStatus User Status */ @JsonClass(generateAdapter = true) -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-multiplatform/.openapi-generator-ignore b/samples/client/petstore/kotlin-multiplatform/.openapi-generator-ignore index 93eeb6b4940..7484ee590a3 100644 --- a/samples/client/petstore/kotlin-multiplatform/.openapi-generator-ignore +++ b/samples/client/petstore/kotlin-multiplatform/.openapi-generator-ignore @@ -1,5 +1,23 @@ # OpenAPI Generator Ignore -gradle/wrapper/gradle-wrapper.jar -gradle/wrapper/gradle-wrapper.properties -gradlew -gradlew.bat +# 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/client/petstore/kotlin-multiplatform/.openapi-generator/FILES b/samples/client/petstore/kotlin-multiplatform/.openapi-generator/FILES index e79293ae571..d14d905efe4 100644 --- a/samples/client/petstore/kotlin-multiplatform/.openapi-generator/FILES +++ b/samples/client/petstore/kotlin-multiplatform/.openapi-generator/FILES @@ -1,5 +1,5 @@ README.md -build.gradle +build.gradle.kts docs/ApiResponse.md docs/Category.md docs/Order.md @@ -9,30 +9,35 @@ docs/StoreApi.md docs/Tag.md docs/User.md docs/UserApi.md -settings.gradle -src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt -src/commonMain/kotlin/org/openapitools/client/apis/StoreApi.kt -src/commonMain/kotlin/org/openapitools/client/apis/UserApi.kt -src/commonMain/kotlin/org/openapitools/client/auth/ApiKeyAuth.kt -src/commonMain/kotlin/org/openapitools/client/auth/Authentication.kt -src/commonMain/kotlin/org/openapitools/client/auth/HttpBasicAuth.kt -src/commonMain/kotlin/org/openapitools/client/auth/HttpBearerAuth.kt -src/commonMain/kotlin/org/openapitools/client/auth/OAuth.kt -src/commonMain/kotlin/org/openapitools/client/infrastructure/ApiAbstractions.kt -src/commonMain/kotlin/org/openapitools/client/infrastructure/ApiClient.kt -src/commonMain/kotlin/org/openapitools/client/infrastructure/Base64ByteArray.kt -src/commonMain/kotlin/org/openapitools/client/infrastructure/Bytes.kt -src/commonMain/kotlin/org/openapitools/client/infrastructure/HttpResponse.kt -src/commonMain/kotlin/org/openapitools/client/infrastructure/OctetByteArray.kt -src/commonMain/kotlin/org/openapitools/client/infrastructure/RequestConfig.kt -src/commonMain/kotlin/org/openapitools/client/infrastructure/RequestMethod.kt -src/commonMain/kotlin/org/openapitools/client/models/ApiResponse.kt -src/commonMain/kotlin/org/openapitools/client/models/Category.kt -src/commonMain/kotlin/org/openapitools/client/models/Order.kt -src/commonMain/kotlin/org/openapitools/client/models/Pet.kt -src/commonMain/kotlin/org/openapitools/client/models/Tag.kt -src/commonMain/kotlin/org/openapitools/client/models/User.kt -src/commonTest/kotlin/util/Coroutine.kt -src/iosTest/kotlin/util/Coroutine.kt -src/jsTest/kotlin/util/Coroutine.kt -src/jvmTest/kotlin/util/Coroutine.kt +gradle.properties +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +settings.gradle.kts +src/common/main/org/openapitools/client/apis/PetApi.kt +src/common/main/org/openapitools/client/apis/StoreApi.kt +src/common/main/org/openapitools/client/apis/UserApi.kt +src/common/main/org/openapitools/client/auth/ApiKeyAuth.kt +src/common/main/org/openapitools/client/auth/Authentication.kt +src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt +src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt +src/common/main/org/openapitools/client/auth/OAuth.kt +src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt +src/common/main/org/openapitools/client/infrastructure/ApiClient.kt +src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt +src/common/main/org/openapitools/client/infrastructure/Bytes.kt +src/common/main/org/openapitools/client/infrastructure/HttpResponse.kt +src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt +src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt +src/common/main/org/openapitools/client/infrastructure/RequestMethod.kt +src/common/main/org/openapitools/client/models/ApiResponse.kt +src/common/main/org/openapitools/client/models/Category.kt +src/common/main/org/openapitools/client/models/Order.kt +src/common/main/org/openapitools/client/models/Pet.kt +src/common/main/org/openapitools/client/models/Tag.kt +src/common/main/org/openapitools/client/models/User.kt +src/common/test/util/Coroutine.kt +src/ios/test/util/Coroutine.kt +src/js/test/util/Coroutine.kt +src/jvm/test/util/Coroutine.kt diff --git a/samples/client/petstore/kotlin-multiplatform/README.md b/samples/client/petstore/kotlin-multiplatform/README.md index 308e8b1c99e..a5b79d8bbbb 100644 --- a/samples/client/petstore/kotlin-multiplatform/README.md +++ b/samples/client/petstore/kotlin-multiplatform/README.md @@ -2,7 +2,7 @@ ## Requires -* Kotlin 1.3.50 +* Kotlin 1.3.72 ## Build @@ -19,7 +19,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -48,7 +48,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -59,17 +59,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-multiplatform/build.gradle b/samples/client/petstore/kotlin-multiplatform/build.gradle deleted file mode 100644 index 47045bb577e..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/build.gradle +++ /dev/null @@ -1,161 +0,0 @@ -apply plugin: 'kotlin-multiplatform' -apply plugin: 'kotlinx-serialization' - -group 'org.openapitools' -version '1.0.0' - -ext { - kotlin_version = '1.3.50' - kotlinx_version = '1.1.0' - coroutines_version = '1.3.1' - serialization_version = '0.12.0' - ktor_version = '1.2.4' -} - -buildscript { - repositories { - jcenter() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50" // $kotlin_version - classpath "org.jetbrains.kotlin:kotlin-serialization:1.3.50" // $kotlin_version - } -} - -repositories { - jcenter() -} - -kotlin { - jvm() - iosArm64() { binaries { framework { freeCompilerArgs.add("-Xobjc-generics") } } } - iosX64() { binaries { framework { freeCompilerArgs.add("-Xobjc-generics") } } } - js() - - sourceSets { - commonMain { - dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version" - api "io.ktor:ktor-client-core:$ktor_version" - api "io.ktor:ktor-client-json:$ktor_version" - api "io.ktor:ktor-client-serialization:$ktor_version" - } - } - - commonTest { - dependencies { - implementation "org.jetbrains.kotlin:kotlin-test-common" - implementation "org.jetbrains.kotlin:kotlin-test-annotations-common" - implementation "io.ktor:ktor-client-mock:$ktor_version" - } - } - - jvmMain { - dependsOn commonMain - dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serialization_version" - api "io.ktor:ktor-client-core-jvm:$ktor_version" - api "io.ktor:ktor-client-json-jvm:$ktor_version" - api "io.ktor:ktor-client-serialization-jvm:$ktor_version" - } - } - - jvmTest { - dependsOn commonTest - dependencies { - implementation "org.jetbrains.kotlin:kotlin-test" - implementation "org.jetbrains.kotlin:kotlin-test-junit" - implementation "io.ktor:ktor-client-mock-jvm:$ktor_version" - } - } - - iosMain { - dependsOn commonMain - dependencies { - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version" - api "io.ktor:ktor-client-ios:$ktor_version" - } - } - - iosTest { - dependsOn commonTest - dependencies { - implementation "io.ktor:ktor-client-mock-native:$ktor_version" - } - } - - iosArm64().compilations.main.defaultSourceSet { - dependsOn iosMain - dependencies { - api "io.ktor:ktor-client-ios-iosarm64:$ktor_version" - api "io.ktor:ktor-client-json-iosarm64:$ktor_version" - api "io.ktor:ktor-client-serialization-iosarm64:$ktor_version" - } - } - - iosArm64().compilations.test.defaultSourceSet { - dependsOn iosTest - } - - iosX64().compilations.main.defaultSourceSet { - dependsOn iosMain - dependencies { - api "io.ktor:ktor-client-ios-iosx64:$ktor_version" - api "io.ktor:ktor-client-json-iosx64:$ktor_version" - api "io.ktor:ktor-client-serialization-iosx64:$ktor_version" - } - } - - jsMain { - dependsOn commonMain - dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-js:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$serialization_version" - api "io.ktor:ktor-client-js:$ktor_version" - api "io.ktor:ktor-client-json-js:$ktor_version" - api "io.ktor:ktor-client-serialization-js:$ktor_version" - } - } - - jsTest { - dependsOn commonTest - dependencies { - implementation "io.ktor:ktor-client-mock-js:$ktor_version" - implementation "io.ktor:ktor-client-js:$ktor_version" - implementation "io.ktor:ktor-client-json:$ktor_version" - implementation "io.ktor:ktor-client-serialization-js:$ktor_version" - } - } - - iosX64().compilations.test.defaultSourceSet { - dependsOn iosTest - } - - all { - languageSettings { - useExperimentalAnnotation('kotlin.Experimental') - } - } - } -} - -task iosTest { - def device = project.findProperty("device")?.toString() ?: "iPhone 8" - dependsOn 'linkDebugTestIosX64' - group = JavaBasePlugin.VERIFICATION_GROUP - description = "Execute unit tests on ${device} simulator" - doLast { - def binary = kotlin.targets.iosX64.binaries.getTest('DEBUG') - exec { commandLine 'xcrun', 'simctl', 'spawn', device, binary.outputFile } - } -} - -configurations { // workaround for https://youtrack.jetbrains.com/issue/KT-27170 - compileClasspath -} diff --git a/samples/client/petstore/kotlin-multiplatform/build.gradle.kts b/samples/client/petstore/kotlin-multiplatform/build.gradle.kts new file mode 100644 index 00000000000..8093161799a --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/build.gradle.kts @@ -0,0 +1,119 @@ +plugins { + kotlin("multiplatform") version "1.3.72" + kotlin("plugin.serialization") version "1.3.72" +} + +group = "org.openapitools" +version = "1.0.0" + +val kotlin_version = "1.3.72" +val ktor_version = "1.3.2" + +repositories { + jcenter() +} + +kotlin { + /* + * To find out how to configure the targets, please follow the link: + * https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#setting-up-targets + */ + jvm { + val main by compilations.getting { + kotlinOptions { + // Setup the Kotlin compiler options for the 'main' compilation: + jvmTarget = "1.8" + } + } + } + ios { + binaries { + framework { + freeCompilerArgs = listOf("-Xobjc-generics") + } + } + } + js() + + sourceSets { + val commonMain by getting { + kotlin.srcDir("src/common/main") + + dependencies { + implementation(kotlin("stdlib-common")) + api("io.ktor:ktor-client-core:$ktor_version") + api("io.ktor:ktor-client-json:$ktor_version") + api("io.ktor:ktor-client-serialization:$ktor_version") + } + } + + val commonTest by getting { + kotlin.srcDir("src/common/test") + + dependencies { + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + implementation("io.ktor:ktor-client-mock:$ktor_version") + } + } + + val jvmMain by getting { + kotlin.srcDir("src/jvm/main") + + dependencies { + implementation(kotlin("stdlib-jdk8")) + api("io.ktor:ktor-client-core-jvm:$ktor_version") + api("io.ktor:ktor-client-json-jvm:$ktor_version") + api("io.ktor:ktor-client-serialization-jvm:$ktor_version") + } + } + + val jvmTest by getting { + kotlin.srcDir("src/jvm/test") + + dependencies { + implementation(kotlin("test")) + implementation(kotlin("test-junit5")) + implementation("org.junit.jupiter:junit-jupiter:5.6.2") + implementation("io.ktor:ktor-client-mock-jvm:$ktor_version") + } + } + + val iosMain by getting { + kotlin.srcDir("src/ios/main") + + dependencies { + api("io.ktor:ktor-client-ios:$ktor_version") + api("io.ktor:ktor-client-json-native:$ktor_version") + api("io.ktor:ktor-client-serialization-native:$ktor_version") + } + } + + val iosTest by getting { + kotlin.srcDir("src/ios/test") + + dependencies { + implementation("io.ktor:ktor-client-mock-native:$ktor_version") + } + } + + val jsMain by getting { + kotlin.srcDir("src/js/main") + + dependencies { + implementation(kotlin("stdlib-js")) + api("io.ktor:ktor-client-js:$ktor_version") + api("io.ktor:ktor-client-json-js:$ktor_version") + api("io.ktor:ktor-client-serialization-js:$ktor_version") + } + } + + val jsTest by getting { + kotlin.srcDir("src/js/test") + + dependencies { + implementation("io.ktor:ktor-client-mock-js:$ktor_version") + } + } + } +} diff --git a/samples/client/petstore/kotlin-multiplatform/docs/Order.md b/samples/client/petstore/kotlin-multiplatform/docs/Order.md index 4683c14c1cb..25e712e4728 100644 --- a/samples/client/petstore/kotlin-multiplatform/docs/Order.md +++ b/samples/client/petstore/kotlin-multiplatform/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-multiplatform/docs/Pet.md b/samples/client/petstore/kotlin-multiplatform/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-multiplatform/docs/Pet.md +++ b/samples/client/petstore/kotlin-multiplatform/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-multiplatform/gradle.properties b/samples/client/petstore/kotlin-multiplatform/gradle.properties new file mode 100644 index 00000000000..29e08e8ca88 --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/gradle.properties @@ -0,0 +1 @@ +kotlin.code.style=official \ No newline at end of file diff --git a/samples/client/petstore/kotlin-multiplatform/gradle/wrapper/gradle-wrapper.jar b/samples/client/petstore/kotlin-multiplatform/gradle/wrapper/gradle-wrapper.jar index cc4fdc293d0e50b0ad9b65c16e7ddd1db2f6025b..61b67b54bbb73d5f06e32a3f4783a9277ee421a2 100644 GIT binary patch literal 99747 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®85Hh~ zz#K<l^8f1J`7ic?!2JIIk{fHQF~K3H9euL1uR@Ikg{0Y(<#7c;rHximVe8kPg&qz9 zv>$AS%mbN%7zjMnrN*YWV-?B?Zb!$pSLc|5S*#Z;^Hog68k(4=>?$LhL#IImtR3{I zB`>(b%dn)xu!iI%FsLT!dB6c=HOn{|in#E|e0yYG)S!&8SPgiAF&}{H^?&_Ld#nU> z-VGNEDrG?D^<`=Zf-|ymef0_#tz*?Eu*q$vzZD(f^fJKx0}NLkt5qsB_N%u_0$w6~ zeg}NWnNgn0;B)~2@m87N+~(K?jot^wnrE1$0%pGzLxGFm4<t0^*#qo0E=<Mvce8X4 zGR}ceKTlD<^O?csF&p%o;0FxHzyG~-zA<wkYU;1AVQt-OuB~3*{!->mgHSoi1u}U< zCX22!2D-Fg%ut7Upv{6aQlsh?(_^0NrKMFLG(ixJwD+E<qx5l0-s~5QuzX*6`uHu< zT+#<bsS|Nz7m`6Hh=7>MiUi;GVx^cW4FvC6FrH&g^wNG2!YQE?x(%<y(gXMv`gnVb z%EfAr)rGW~EUnnIYX9gF83K3y=!Gop=f&NM`>uQtVNqSi8R82W@v|Ts7j@5pE@*)` zf7jVZ81+>XU}t_uM<y^FfN$>y<K0g1A8-7Yqk!7($A6G!n}~zFdqY_so!SSAilD?C zJc98z#)x-6{Q!7YXmFQpV(`HuMx~)bzC<7Dgr*W$?>h{wCRUnVYyeG@#r2{IKb)XK zyz{eL(KE+;0T8bWZ&z8-adjt_0hb|_#g(k~z-TdJj7jC>m&v&*+_le{Ks)|$dg50% zK^f~x_h_m1oT94$-j7&CVsq5Bq1Q2!Kl`1!EOgc>z()j&xDIaR@4tUo%@*~=I|($= zpqU(?J=Av`dbFbcVi^G6ve#8nh7-EO_zIKrpZ*YR+Fu4D|MvSQplyMCo0_+Gd7oPa z6@YZCE8`9^<8*9JG15I(Lc!^lpu_nx#yM0Jjd6gHCTN0iR+Y+ym1ccKt;3;xJ&U6P zyHal`$)F^bD_4*kh`XHuaS+H%6A6CiCyV_H+0tZ5&_49#t1Or3OG`4ufz1$qF8Cle z(TMBf-u8mOY^njRn2UG&hV96aYUf3<HfZmsg^l(rx#;TU4Fqst#{coH8^O7Jz;ruG z6mYwgd~Py1e-QkO$D4U&L3)s`t`|ZL%V(gdxNl%7Nr+J~%M}0)BElW>KW6OxAaeCy zn(jN;`<dm^scUy)s5a7u2W2oclWf6^bHJ$7wK3$re#{We_+zL5?lm2j1CXOBo4mzT zN-uaS7fv69gX-MDfYJ2g;$FzE-oiir<h_|w?{qR)8632mcUOXnFf<}~-a!m;4ZIW( z4O#-FF_=T5lx4Z3!>Z=wK|cs{hFc6MzlW{~bkYZTR;a6=-u6>#MF#^;ErT&GFuL$l zZVQMoW2jZCORY<%@Cmw<i!DzpD5>5k=jp*=gY5O`Qd73s3|gbT_m@uUKzfvM9E38j zDO9c((0+CPn|GyQY7nW)E)NrgK~yr%EA*~GH)rT7hM=)-dia?5P3EfDVHB!pf@THM z;k5q6J!p(bM;2$dI>PCghb=yzKIqH)M(hF@y?79dXlSn_bCgSZ(ZQ`>cxTP4oF>f7 zvdlVu8x*zH$wlSf)q=!GI^<u!c-Rx-pAWpimJT|Ix#v}`mEPQ<NEu=P0%qH*77#37 zz~ZqtLm}1;(%keahLY9bIqc_}0L|Y+`gb5!xnxeP!@jEN%e&E<OlHVW=>4MfLd=R< zE}~h)LB1bo(wij08zKnAHPBt@fg$C*Q~81f90dYEe2HKTQWvXIbD$?-NEJVIC;93( z=sfv8n4i<E0Rmw83mM2OgebG}4X<#F4zr7_3Zhpwd%=o8bgT(zS^G9Q4?X>piByRG z&+Y>UoD2MOrke6<p{Ck{1?99l(Oy1usVi5;Isqtys-lYyr)e25r*;1R>kq(Jq{q@9 z(&F;n48Bgs#gBdlNqe1o3(Qx03Fed=!*KKa<mt~|81!tcGYbsqVp_U@7()Op1f09& zZ!i1=QU&@-F!W6Z=2kY-PLR5?*~wCKo+fJD*^u5*5$Z5Ct(QIT^4TCxvQ|h#XCxbg zm#?rC)dokLe+`n;>0tCkE=iMi1*($2ep@u~hFzvf9cZib>XXu~qW}AUhyAbHU&Rsl zpOx_Md~W<Zua+AI7nksGvt<2S#W+d(QG_I?Qm86+ZC3yK-mOz;)B90YV1P=WhHmI) z(gohLZsbVc0?Qy)T1RQ>TpgTM;x(kKjv?)jhiy<)K~n+xDgC|;I{$hvIFMj{=B}^q zr*RWFabK--NW_<S#g|Uf9UUMSzWVs|c1HUoD1-5ny$UAKe(Sl(FEJg>czU~C`c>le zuX_%l<A`($r$?E2VW98)!8pu)Y^&N-vo$`a{{w%oIq*LdW$VH*{NcB3a&c+7d1Xiq z>*l8g>RcNc&UMiS@c4!XHdwrvtmX`BKt+k0jrPEpYj5?cKAOIC+guLf&S>GP{a~Zr zm~}(+nitbS@Z}?OP_lDVw|4bDUNfjIERBV*qPV5VHpFGf3%d5+C|^!6%56_PPk$zZ zELm>%r=&q?U!ES#(h5|?^I!%=rF4|C7zlV1uVH}E%s@P2KBBdjLZG&>$y94$x(w<= zQ08o_!Bs_*0j|n*vu$ufSxtJuhw?<-5TODV4Z7OC6-*fz+Wf-bpZTp<DzwI=cGjoT z3X5xhfQ&8+N%XYQe(^AC(XQpACukFZ*=*C^9AI56ZJn#-)^h$V7g|BET3RIvcOQ`{ z`eK;&5aVMnFo?Sn`Vt_P#&|?6?K~11$)5d5=v7ycps5s+XI_2F*;w!Wk0<{yv!m|W z>P+*mUO)O$4Z}hZ906GfIz&s--K{%dKom`&s!j@2<AwHo8FAc&T%<|0kGT0QsebKA zUUCStF<bja?F{c*KwEI2D*fBi!TJL1eWqAiF%bSBH&8m41{`YX0`D%Is<exi9+j<K z3=l&d*cUf1a*66v&^&qbS@Hk_7=zA#edrO0C{WQrT2*IGi}rVOG)F;nAz(#M30zIM zlp)Rvu$;7P7HiMI7_Tm+L(aa<3k#Ycm>i37Gu$IDTU5IP&h!oh0b3zQ>P-_eq_L9x z$KO3JDs8EPc%1r#s!vd>mlMJ3L92{@9iDcaJJ!oadJGV~s&cF3iIWkob2`AE2^Qop zT`mwt=Whph0MXw-rY{%|U=F9%n-xF+)*{Bw@-|3=>X^ti>Sr|uf<>HqXU&N5XC%!A z5yFd0&pcX6Q%txHOfxm7IWyO2#IgjK%|w>BM9kYlEnzS+xPelJGEeZAcJQPrlti<v zJX#9q=GH<)2j?|_EOm<>+WSH^`dDr9P56J77@8`vEqGDg(9oh87zTowR0EWp%0+3; zTCbVwWAu5F30N@Acky=T6$l2&AV|Q`N>MGp_m-%4i8=_6Tf|pkQ~&K7q6cpv@;29! ze&fJ2dtZo!y2S`uRACg9-_D4Sod*MG9$qy#%)J((Y+WsNoDr*oR!)#sNw`SmVD7FD zw0Qa#rYcWlT=>}7n)23#w*!sF7QVRw{f(xK1=>d4*C!ZRm8Q+$%QawJLkmcGiizvY z+-Ugxm+24@8|U7H5OgpDra|YP*#TG1@Goci?F9+eMWhrje*U6M9vXIZIZ)f351!CT z*8w&x={-4B++8IL$z;+9I4~mue7#6i3P!<S@4A_$TS;0B8<P=c*1w*6iJc%uBTb~E zOxK{Ob#y0qrca&wm5k6;b4g(b4}<REy_x4+2!+8o1v>FO7|?9*>kr{S1m-DSD%Q~$ z=WYRJt=h@})MmAx<(}aVT7VM_GXdCG1p$Y8Gq)k)?T)@c!Ic)5g8_#?+J{(J%I!e( z5m1_G=by=hVJvWsz}4Fv+B4TL{sL;U^k^UT=9x*n<yvrAbQi$8N&tv%1`1liPQB%8 zfUsHEwF}JQz!B!?1S==6FtY%55dQsWrO=T;F)g2B1J)xQ_7LS<zFTE4IK%89xWCD? zaYmsfC~miqR&C)~4AzjsT=0V!@I7{~vSnVK$-$9bX=s0yo@ndiZAxWGi0{Qatcs`h zzJ%vMgJpT9aN{f-g0-*<cR(8t;}W@42cuYH8Csq(UJ7nt86j0jXLYdl+)Ol7d2N^e z9TAKO573vlfhljPK;(h_4s-=T12Clkg9uY^$kG&=BrDp^{Ih4F#CkcT_*k#fxPS@A zB1O-K$SDT9^t5!OD*x=;#&Tkajk)jDKXlf*g5f3fimj1R-jAt&MWbVLi=+SU6*P0S z#R*LCmv`QP!aH%LFYAs4HOBdpir2|%G`KTgCKHD_gZnv^ZP4S+e4uv2I~2|1mI9{3 zf8C8Pt(YAGXJuim17E)jcIkK0Fo*!}-!)YSq|`A&%<Q$F`i6GwUa;W7&N6!L<9EOS zKSn-a^VtjZbOepfI^!D*2CzV9&<)Hs4hW($vTXd;xL9Bgq&+TTFmCSB{d6DWgPn{C z9}p9*jTISSJzi@S9XuP<mr?UEcQd~P#)Mn3XBd6^B$$9%ef}kt8cx$`heyBtKpzYf zExr~~-5|JnHaV1H2L?FC)4;sE+DBC8OiC1*wOrYS7gQWWzx-q(_<DP>+hj*B%~Di1 z9%p9?rE{4H6rH#CR6sNU&e^>sI(Tq5F9b0B_h&_;=G5!<GQ<Xm=B}lCfnH~@m5Wbl zKja3rM7qHpCc0Ur#x}X|xplq2NVG=1!wMP+SSsHE-({f+kse=&SkT_5?QHYVaQ^ru zUS2JM0Rt%aMU9sfIjo^wV+-aE`t(*X?iTp$o_q$9U`O35rIl(PKFxR$&|*d)?Kfw6 z7iPQwuAu5MFaxLp#89wq=}!)G<VA<twJ+~2LoEOSV*y|)uhN&odKsJl6VhnepiVBF zUI6BqmWN6^X+Ez6=>y-bVEqOhLA@~^Ow;ZKFtsD5tMZ{kE_4#tQ2rl}y;2?l1^DDO zu;x-}G=BbqDBzpghwi!TZBD<T56nZ`kBlfg?a!NsY2v{wFdNYE``XvKOD*Y6GZ4_{ zG`-*?YR0Na;l5D@C|q!RT_`wdk)@(j<s8(6tUx~qU>C$CEi%V|j~^2${K&yZwLe-h zEIhgPD#}8%zmrV5m(XmBNnp$~2E60xmzZt^%ssku)fr4+3_*uf(y%%_oW^MFgwJo5 zuH-7nKfdz3egG6x&>Zh}wthQl5L+M~<_4m{Sz*eReHbRG>qd#ZZWV2ygSV6NWyi&6 z-r{I`!T6R}RB1h@16rcN67tJOxF+VmQ#=@hr@d>=uw?4e0F|>2RGXzjD0_Hya|yi~ zg96N-`<W=<mu~^nZct{O(mCNy!|gU%OA|Z_M4L?>u1ZzqOCQT(iiZYi|C@m3QK5VW z{mSdKjbJbXGN*1mMw(0{V4TTMrzdRDg#gpx!n<IX-;s{VJ{7eC(zXp^*wBqYoCpU9 zD+ZENiF8;%n2#@5N=x`Kt(Q0f)+8O@`QQ*bxwx)cd^Q6TpF=MDF*oGm!KKm4*`?9h zrOD;V)zN1BM8fPi-r3^!E)G7EqPZ83>~S-!$+hXJChgDQEPbsLg&yn4G6G)9x_kC+ zy$!`*8Y-vggX^+@!2k@ffCPF=LpUu_%4$%o_bS_O)r}XZNf?e188m%kG|e2xL()M8 z-|7g6Y0%g(7!boi0Jhy{T-B?9UWS14a`>Pc;V9_ZFE<&R8z7oq2RG3M;><v-y9>B4 z?NH17VDg8ogne^w8#OMCg~@}#Y)#h-X4gaP!aegQSyB#y)f-?59i8q6@0AYllTVzz zpVRRc_3dr-c{0H2dB~5k?#k=2R0!w<fM(#vOq8v>P0;9_13QRFC$!wYxfgsl!hxaq zpYQPi)?z`vh>V#lbS$%U_Uv8Y=YPFI^Yx#+30x53;{~Og7aViC&UD(l=QHS6X(Y!V zdk&KI%=<9d7|72}l@OmE=79Dywby>@S2KhLBSN5dw1ifW^f1+|L<Qe_(BViVvj#X+ zede*G9nq5$N1)i%c6jk5Mx<cD{m4>h2lUAN?Cr&D`nCsT03C?^bY(!gj{y>9M00;h z`vH@nG2T{(H%7tDKsx-P?dUCCnWh8WH*&Zb9f8SHtdKRGV6#5jD{~dHa)`Gdm&SOg zjmVKMa0dDjI!H%~pRU#)ds%cY>dznE8pSBC8laV%WI!EjjMl}UfSJu_OtC;E$*^~v zNN`#S@aH0Q#3(D(nkGu$cRotCjb3#nd?YBs*~rN7W6D(Z?A+R{yl*1!q%<!NE|2Q( zpl~VptPt;6K*ouu!HuiIVoDcEAm|Jrw{1!pn8G7A!S3^WxVO}mvC}vD{_Fi)p;t7{ z7cY3`sWmbm9YH!W*R!DW_5{qB(A5W_b|0={Q-+Lqd*w{wAmcTztGq0lcNAAHZZtG; zq0a@%-|l>`vM2?LG4mPVDrs*M-u(rvZzd6OWj>IsDZE{uc>wH-=fUR9LQ|L|F~h## zg3&8?T6&3U6~IBj=E{xW8yh7bJw=Cj^%wL(M1p!h`lYHIXaM1P45f}@FjXI+F@?3C z!EhddW@fd+nh4Bt`)Q*4i%5W|1BJ~nlmTvKzbN>qaHAbKf2K0%H+OI`{n1Q|aI3f+ zd&qh&!X3nOc#n$=Nd^ZhKz{8@D>R#{bQL9<nu!LU!)R{hikj5?P<dCO4+Om`V@9(Q zv=2b}R5r7)WF+_HLC|>zF;YFSMhkcEPpAFl9!qdvEZCoZ{*WARzheT$A-3@RZy>do zkum_jBU-YG$pasSP&UN4k=LT7-C`>=dfX?O=R~mN2yEQ6PfdKz2$+pL^HbH^Ln{MU zZx+dYj)FK34WzE9T++axng#(ZzXnhnsKvRXt6&(4jxAk_i-xMIAhRI~)Rd#ftFzJS z0r`V~LQqt3pZ55EuH6$96dOjag38mJrW5omK#uk?BBy($E2Xb%qf=BH5tG_)Xh83p z%mweCo989~-Z`@U-FS5!sxC--72^C`yoR7!``Fzm=bdOf$-GdPps^O!JY~?GK|mL% zhUp6UXy5zN{+NkYlPWX4EFSd0+22}MueCr~Y;FJMNk{>0Ea+-Zpgm@<yaZmUcdG@k zPzaQx(BN!9@EYf@@dxu;Irf%x3UA1yrF;scHD(PNeetJ_=DkpOw&#?a45f1uOt6En z|Lh61<r)X>R6wI{1S*@AG@7IN-_PFkwwh>7N%Y#VoEkX36n6PNi0BKC`y79RHmCW{ zKL-W`<u`x_a}Un>(zOE7<F*aXDL5nT(Q_!iEl-;i4PYGPYR-jqp7^D7@zC@W&&OM( zef2a{^TS{lUI4TI&lhM`VCKY|(>|iw^4wX~fa(XDpR{j=uuT8^hreQIhW+FHXFc3l za!gEz7>0~>fCmA~mU$``(O{XfvjPiu;c)8Egh$J%TPNzF3;ucE<4|I}$)xAZvyduv zpiN3|Dy4f@9ykLU7-b=8Qg@#kuHp0FG7d+r4B!CI;PE=X=C%iSq+RLg{n<NEN1K?N zg8tSW7ExPJgfCdl64-Y`09}=zJj6pRPTv3lY=Ky!fz{QW;$0dMa0Oj?sxVkuGqDCy zz|%mfAf5=Y6i2WK3oJ#j<iu+a-{wsZr~+jv-_+1z>!4G=1=FGZj0D4p@lv<s)Kb69 zTZ}thz|(`;ok!>sfEEKXl-a{J?WCjJIY*QU2%aZUH-Or5WsgV}6qcuQTFN%qcqma0 z3}_LVtengRJ2Gy7ju4UBFJXu}HLtR_g8|Y3QpMx)1DjlFCJpNk;y!@AqYcoLLCS<) zY8!G;rigxCo6}u=H3?ifdhaija*XgPwP&;%S=eYk?w`KnnmQYcuimiEU1S{s6Lc*& z%|I(&mS!H~W(U-1y9sV{;g_>A;8z4`&e3ht9MhRhy3Mq@0-SLGlyf8DqAzi!OrQp7 z_o)If624y-muTW*9>5jR5#w%F%tXLO1i1DDJH5rrap|<_#hbkAAQnL(#&oPBOHv;< z3^;)}JXhYBS=f5*UZ@_+Vc@oW+16RsGzGy*#FGFTc>|<9m5!HS|2Rl6uQnpBSwAkI z5|o$I69r-L0Q=-&uz3)$|JpDvKzhLc_?utrI)lziZyh=Px=Qjk^!b6ZKyyw^zUCHA zW&o9gbX1Gh2tlU+yPyS7?yd{Z*!z)=cIe!wjvig((o~@HN{-*WW;(UN2sXE+{RG@9 z5ZRdU#|J)aTw)}yadj>&G_?f?DA8(HP&r>o)Pjo3gB|Lvp~QkrX7bxIAV)wRZeThl z*u~|u<^jt6fosxKNrcAL+akd2X|@0TIGxE|?Q*vQn!WDY|N8QSlp?w%$Q~?HhQOHs z1=s&=BTV~dJ^JOX6#PHsNBwQ1c5-P6Z=T5iQt-{J>;H>_>1J3k8q_AW*N<qsd#l8* zVI439aeZ8s^;fre(ZB;qVC|k@Uowh3=5oP-IT7GR${3!zMg`J&<t<3#YK!B)khb=_ z4*&JohiL8c8lSS?Y%xbhBP(N~R=Ub<Xq8KMN}sad=*dUo(Xm*<!1Dt2%W!o<FN0wd zr2V!6B#QuWcnK`MR~q1<zMtL<!GaUVdci0L(m;&1DNquZ1cZWEB^E*4(i%vICA98g zFqSVaJQZZu-UY7Rz9D@XNrG$<DrlNE*SU6phYPsO74D6xcKi)zwJv2`^tDuh0R^hc zRkHq<H%jLk)5dc~`?axFbt7ovf%M#HF&Gyg@$uuK4ngPN4}#9Z0WcGt8To)CD2LwV z-neOh&;SSs&C$MMoOABc6ECBg4En#Hef2gOjE3lT25V>nOOein9`2FW38y1Jd*Jdf zAVM=}CvTODYLgbr=u6?1lTF>@lxeDY%s?JkDd-@WTC9(wAj5{KcLd!Iu%9Pe`$$_j zt0OQucj;N1<}V&y@8-qar8An-*CdWJxBu(@r@?&;m4|)8CS}-KMABq^g=j}qayX&s zxyzet@nIP$giyYKX0%0HR?3jh{l?jo7#$})Dkh}C837g;V25GIkmNK6;m2%Tke-td zh#Yr=q|xarx(@J)ssU#T?CzKDQ4_Q?W@+c>%E)Mr(u9I7TCbAE^852GPe9}@atgsJ zgm;g9qkF&O{w8JU%>61v&Ge(8@ESm2Gnhvai}z?6YcRF1o}jt?-B&ZFA?H9k`cK{W ze?9b!G->>atZ=VnNb}geZ<{cl=)6cb1~KrR55lyVRp+BuFO@&)?HpAj*9I3yf9UNT zUX!_`|0*vX5C+O%#RvyQ*Me1p4n>2_N4uADjX~z6F>}69Xqr!60doM=gKXEqjKgfe ztG0~-A%NO%e-Trd;GTH(H_`?lACn>p)u`bUeA4gOZ=oh>?`pNEs7J>z*8y15eKBq| zd(T1|ZY!j_R%8^MA$5fdVF->Kd%&+T5em;r|MJFDui0>I^B@7&<-*#rHL3T}fez|& z(m8tkEhxEmj`}gGWY`psock@WUnwIK=_1#UzQ`!H1Nnh6V|qGd0Nfdrz)ODq*4~GR z96Zrfbu!@7H@TS%kjgt~YI<mKETV$mX1WC6adgoRuh#$)u(<r=XKzH(5C9DW1cOR@ zBf#lDAWOt>pcDNawgu+dOAD2Q{`uTp;DR{_?TKM^+RrlZipw&hY{#huXC8z+d3UqV z?9l$kyF1j{w6A2??QcZRse#b`@2pDoF4|03pj*TkL=L^fApwmRoz1iZ=vrnYa72V~ zJKn?8<z}EVwzWt2L0bE4gR5%FxdFy9P$mL=q*YhX{#Mi^F83hf0}Mym;VPZ#roF%_ zcl8<VTMyIP(<#vY`k6Auof93jZ3-q>hhT67`xt?HgQ`GQXC4NRWO<^s-Gg@)87<sv zry_{B76uF*NRw?Vhj`OG>H=1r+ME&c<sBo{EiF(4$8KRTM(J(;Jg8b%0u&dJcS5L) z{`2uyp~Qfk89@1*Ui;4!J#RVM+?B$DD^RCMgQ3GM&&8(io6>0*J^pe)vG&0T#vWj! zW^s$@V`b;oL$er-b(7rTMg|uph~=&X+M9X|=G3r7@LuWt{)cE7w_m=mSI^8J^JchI z&mZ_BU5k2!xgU{@Im~z)xjM~FHRX^KxD^c=N3V^5KDm2TrQ{UT+nFI-07~4|{{I9G zIQo3QDE4(3(b~^Apt%ELI2&YW|Jt_bC<TR&Bwc6zq}ZW4bQ{t3CRHIGrE!%NOSx!7 zhO}jEv$xrKDg?rNGegC7Cgab16s#~R*V5wSm!VDi@|=T+N5ig7dS(v}K#!I-=VN$m z{pHs`@1-m0$b$%KpGI^3_ygb@7Ccl(gD=$G0qw6;DO_g8iaxfXYf$QxmAs&D4m5(d zgS5v8R>%XI(FCkP44xJyeK?sQjkB?)H_!vEyv=D}WL&F-CYUmVWafFSfjLSi_{yfJ zR`JZ*^G{1F3?fmh5j+j(PUT*J^;0j1!l^T9K&Emgh~8r)G=U~TYOlEkm+z&ERb?AG z1f7*b2eXh_5A3HOOQQK#kFgr{fIL8)Q!p5tG0HI1L1&Lk>(oPAAr`^Ic8Ok0abN+& zI0jUGbnu`bdC6{&D!!lH$aN%<tardo&B12u4ub=|TOz@Eo&hv^>QOG2mdXbK>h{31 znHftdVB3aM&p`l<F|2>1e|zsKx+md~v3369fgk)F32ROruh`aprZ|{BnU4emlxdiN zEEd5aR$75$2_z#wMJ+H}AL5?t|Mu<;5H$Tfh#u0O`MEY*!%DNvLIVV9zkvvalWRZa zlzQwvzm#&?c$G185c!jN+?b`_m*>v}(4JDrnAl<vGnv{z`zQ0-?w}*8w1keKF`~T4 z9i)Q<H0Rb%S+TV0RN#bmG0^DEub*<Npm!?km?<ey3^;BFIQ}dcPsjtQfZ=-VumAr# zddAfBcsK=G_(WpXk1wP@^a>P{09C$)Zbv_aqBaK22b6a1t@F<tLvaID%~gRnn1bo3 zU}*&yO*wk+rQ4v|?D&D3C4w34$WW>X;S4p;YY*vN{$D+!>l^~Hm=^KU3?QIPgi$L4 zxMOm(z*RZL0qr@^PG!e*bUf`XNc+zxe?3o!2^e(FY7%95#x!UD>J>2V&v7t?_HXL| zYXJ$k*pd-263})SEGk19$DS7{+`)pY>jgEEd4mc&Di|e49|dFT3TRi}XSrOO3WyNF z30hL8)Dm6l(2QN6F}Q)O!<=II%7fs56L(O{WpTA%-T~&^-luZV=$o6+2Gp{l@#M9w z3h6$`&pd(F=dXgz=-o@A#cJP}G0N5Zp&W|R{*uagq1o2;u^#8aEi|H}BMd^_Bre>- zenCx;*)}v9d4>LAh4Z%z7+Z4X%1K#_EbZ?NCQvrUwL`sQp$mA6WL|1N2?gmT-Qd2u zrYkIu0__XCqjM}E-LsD146hx~2Jb-MdlL0HI=}zrMRWqC9MiH8k5v6p--(cyGxEtJ z{V)1-Tb=w!7&KN;faRjgtfWx|emR<rpF9@iGgSl4Dk91Pq8kJ(()3dxCV{{eA~B41 zi%=zgVYOTPswyMvAn1f21YMAw2Uc3ZOMdcuuryE+@0`k<K5_PF<fPGrQMSq80D~tN z^v73j-m<f%U-vzO2BVnMUU&&CYZ(kMDXu?xtEk{7o)pyuq6PFVW3s7Zydky_%Ai-r z>drX5FPPIcuJgqI(w<jcG{>}CKYkal-6}_DUv#sDzV^}WpFMT#iRP(ntEo0_r}gXC zr@wx4@3)xb=!*Y-_?CNVM<$>4+#}Zll?~`%tN=NGefPn{<rrv3IFFzmA{aCQ`uZN} z`;XUewzNxx-m<o~%e6B`&%ER`$^*R?8D+yDK}jQIUO~0AvLQ~rKEJ~YSkt&nfut)p zCxsT-_3$;xA-={a%1fhD?2>sAySM@HLC}#a&(Rm{D@CRd0P6tjw3k=5%1Y_CgW&d< zivl&wR~!eyK-1oVf@A^!%=AG&FixQCz*tl&*XwKl*{gJCodb8k8?27m674s-5^L*e zxYedaR$q6Xn;y-B1uQWZlh$39kj1Pizz%3^A#l1LlGjUe=eAV>^+Ba|0PO|UdaCv_ z>2}9{Qz5-|VNKfKF6kzLLmcF_$7upyMn@nt?Kj9>4%52c@s=k)9MVTcNq~stx)|^P zQw8AU>ph}tKh9Ma7!iS{vK+-c!`3oM*?B6&o0$jHiV$A5_frrimmWz7U=rv0%SZ~u zG{{f;|6mEUV4vA9ZieioO)5s3zy%p&%%<6Lu+TAAm##wE$fOKx+sy~up9`%^1?%S; zJ+FW1F<!`;1fb-tqu~Ajc=zjn{HP_@!w*|RjIDn2vr$_X^q4N?x2BQkAhZFe3Rm!m z)|$g~UIwVPv*){!`T4KWf57dhUOa*hR;5d?M0r36v^uZ1w42ZN7TV6BkhW#;VVWet z(|*GqGKXsf{(A4t8xZu$+1I4&lY3~eUMAQ;12qfj2k*8kPXFdjy$OY}C0L3|<$1I? zz#YefvZQIbzpHGAnXg}#UhoX2(W%$LRP5MsmD;=dkhGH(s10-wpMJoy!hK{|Z!tV~ z^ifq1dYR{6KAx`ki^4Pq7*D`FXv~tgdVt<qK6-~VI45IY5CY-kx4v7UcB6ftsl~uE zw5Qc9<jHZlG<aKR+}gNJD;G!G|L1GZ$e{4P0g<+P=WJ##j{_LkN0@;&Gtv<aq4M5W z`&)+g&B8&BE`n-USvEF~-2fp7kDFTm^0iC994<AZ$?W4Y!He}_XIFz08h?KJCygUs z+OvelI%Lq60n$;v?@cuKYXK`!_yPyL14_QWc^1kDNc**nH7Ee9GJ{n6C=Mhm1kDx~ z3MMc*QqCQ61(nicBf{6;XqIMCSO4Ue0xp?0ZB>Sq;|}s^X{cyJqggt<S&jjNh-jC? zP#6=QAQKQ51<dg7rosT4vGfMjb2z;QEdMX>{@jHn(xqNSW^V0p(dqZ)Kzb}5#QPj` zI2;71kl`c@1)z>)uNLIaEZS7w<Xs%-<Y`42>D>@!^y)4MV3hKr%+aE*qrY5$WF+S? z-Fvl<kaJ6dotjf0K(pNY7>+)`s}4)6T<x#6VqG6*aOt?dCJxl@wwlRHKzs^4<;VO- z?1%mfMwiTiv_F{EMZ4K9>DSA4ch2<kJ*WLIBEm)cy!n_u2qod<Ys!{rtg<9T_HWAp zyoVWqqCj*35L74<oOgjA1pQB=&5Sh4c(FP;1I_iJLGU6Opyw(RHyNX8(qjhU3+e$K z{`!~F3C<*N90F4tQ%PMwHwn@vx%R#aF4i+<xwXK>nE?STx3Y_u6|5#UXx|5wmdYwL z_&RAI#hLk@tNo6A3+pxOGLXm}g}VFiNb?Ybp9@U|RjOje5D1KB3g?1cxk=l^AQgdK zXxV`Pp38~`M2G-yXI%g$Q}nI{I;yicSnq(soMvd}Rf93GNWNS;z`jZ5HWv<*&us7V zbr0YOQU!4-otIMikvWz$W2kke9cg<Yh6&&8(Z#fw-nSZCd6z$g@UsU421~L!R2oS~ z8m|wGi<sEY0Ca>{fPL{{8w(S_weZe04+;gT5P_z{-!!9ODW@`=rb>)pAnK@6UWu7@ zMV~{vvN0X4Vi%eZsEY*#(EN4reQ4?0he4p!)oe3TfygWGw_LcL-UDJmRo7)K8}+s_ z%G$sKxuzy%LJGCjg-#w&0ICJ)m=P^Qd%u)f5O1F-UEleiA+6Ct^P(h7;d}B0Kc*nG z&QAUNPkhrXO?cRffw5i*N;+i4IEt#|9UpL1u9sE}Zx%(J(g<r_SWYRfWt?)!iK<pG z`E9vRz_;Hvb5_*Ej#Y*~BflY-hceQ>c^mBieDK^HCpiMzu^iwf(m%Ne{N&AG8C_t& z=dX(d=Q^A8mJhUaV`)}?eJhkhAO?;-H)U!<2BLApRT!3aYG0CJNf*Q_C!*Co#uY0! z_jY6`4>6+!)*`yyD&n}!#F4Llq5bOl-`{<<S3d}faT_B!NxGUvL{^Mk{eA6RAzBsw zqtkVeYJZFlKpmGg3Y~jYr!PWf_LtT5bxlF0Zv-mG@Prc3ks)Ps=mN$WjSS=!+J5#E zQNc?;en0W}9o%J83Nsquu>f~{@jkH4*rN|f*CM@k`em@nB`{ht*B)#JlpHa&T~c@H z*HD4_={8a5NWKgKw8sgE%Jo)eH1mSypnCd+Tgh?HoP$VJg()-}jqP%O1H|Z3b2$?+ z2Lzma0*w3B{>UbM$q?O*C)E<r2&ToDgQ_Y7L7gcb0S7WXs|K|CJ!qG)WoF`!t_B$a zU##tNmqz*~BsZxeXoqVCs=XP(mSoBS(9*)eoTKvc8{9A7Kj9g1?N`p|XrRLYEBca> z#cvffdxpLUBefi2QHsegbcFyo5zx-wXl}d3`sCfI(kZ-uf#Ki3kQyxQPv3>4oAbu$ zy$f&V@Y=v!K3Jc@ew`~H4q{T!<bq-mY7Sng%d|g8EmY+<vm-D+tFu;)t$-*6l}U4r z6CTR$36UmeT6F?bGt+_q-6L52?-yTrM%BWI(?3Ngo$nU5<9z(iF*$^DIIf5;yk+Td zFSL2a1SwX!)vR1LUqPl(rUj1qmRdqnd!j)DK!CT1gv4aEGqmlb5BxiyTH_uJmL4uf zM$>pUbHtCRvih5Cos$DSpWch})r~b%d!;#g=?%jGqn@d=Z;$4DBkyX~B!MGD2aQ%1 zpw%#EsM?n*A*pj&1Fm%707!-2h%IzLdB{at6er#oy!2B86#L+5BkAV-`09S1D5Es2 z)vvX#wC-D->F&P;#w*fZEdjLiVNg43)P>hQz$ZX}Ln4C=VCVr$AnhS{(&Su#eg1_f zAZ-0Nz?(pW{-NN&wx5zBXdS-`H@US-Gn}^)FVR1FY8Z-&pJu3B3*gR>1bRh;_e1g& zZf}gCI_k!~smMS7bORd8+aLXgp&l`;w#`^!$p98WJU1%>jHFEcmq%Yh1E^A)+RjUq z4sagFshA?vf!Jn7r6A28Qsq`xc5NeCC!a0>AKEOeTG2jy;1hl3=^pfGKZeQD3fOFx zGP)T|+!c_J+DZ%a?g`i_6MX&%s|DaALU@lFJ=mv?qcP%Iz&t0xI?7YcAzbJRZeZQ) zi<ib|0)WnnYhI1N@OrDN?VY>X-E^a0FBtcv7Q>aMHPDb$KwYAO=ZVG%Xq?7CX@m3p zfjr)bxPrE|@FIwc<`700uy0_Sqc@^GQ3Ix2cKk+qD&HlOk<<{f3=Y(WMTw$w&zh_P zGz?4%Zi=@Pv*Cr*^Y>Xr)G%*o&?V*5!Xz}fD3ij*;wV);(A0_$B=;1*GGm=O1_el; zR4ZlM2K1-fo&~4>rph^2m2vfnx0oy1M^3e0aWY=XMLRi_;jHo&nhu`T4Pq*2Z)5j= z`;I<1C|WvgaQ@{E@VzGy+VydRK%EG1&LC)opydJOMQDwU-Ity*RMIA=pZ5jt1p!ms z2NO@=72l)lqIf%$U4C)K7>)K)ZbC3Hb@8QHYtj87c%cw!3NMAo&hc_6U(0~DdT>ak z7#GY4-B_Rt(%k*`chJBXil07x8w5i|`>z~>wVM%27si1ERYyc#)LxBy)0kE~M-Z=T z13YDy&HzgGcg!VxAJynG8wZ>AnVw_Xs70sOI)tNT2LiGahQKRhuiGAaXbCQ)jIIE< zYDet@$kYH9b)c-y*G;rk#x*b#P-B1yk`@!Ifgv0o1~x67;Jzv=>|?CylA1xcW$kM( ziy^ZXXnV+kE3L(%OkRBF%Ns<k;<%u<sE2m4vf+&x;7U5u!B{g7g9N-A0H)gKFy~F8 z`aHeqiAkD483o#`wJHEpzO%|W-rxQL0|2X8{(hjMW#j4K;ta|2BT@^&Q&Yx0>@1tO zVPHgr9p}s{2;jyyxNw!XGHN^%$vHl{b?lIIF!9da8NPJ%QJP(uh|y;SN;RMS;$@pp z?}w^GWjuE>pP8w5m()P*WAc?sU-pTI+n5&ry6N`Pc6%uEprF-`EQn|jfcG56qL|+* zXLqDqRm*ACq%u$(sO}Kg1laMCYoJtVgMaiK7_VwZNAQe)-FdUuyloY`_G5VrO?RVN zCX7i_A2>iiEt@gw1lr%aJ4HYHkh19hm6|?&TR*hc|Erq{eK~y_Xmtkc>py^5nk7Uv zLvj{Y?JhsC#(w4yy8+8?x@dj-@*@!1eT9j`b!*GYhBD?rYtbX)42-1)&gQoFEuch3 z`VI)7`G5}FDU}RpSX6>FE!thVz1!}}4ZikQUgG3}5)oXtHAtm)1lt1U?G~uMA&<fB zAidx;T<zs|!I$;Eo)h<6xNAy9O)kwpThXz)_rTEL-o<2R1`5D!@Pe$}!0CIymThCC z#i@Z7-`=8&FN?0O!FB!fzITG9^Rs(ssgz<yNUW8=nwm@e=!F#KZE!nhoby=(@2On} z2hP1gd(TLNHcf38UHAfo1tS%hE{$Uy@aFk@?@urhx_KHE`kL|3%_D*{qgWE7+P&D? z{)T%34j0q!0xriJ<R7lKYVqkCYBOuvcmMSxp?Ic%t@MIvAIpL~b4#a(eO@Fq)|-YC zzX1or*Vsi9so0!eF+rm<n@M=-ZtW@5Jc0q-<OycJ<(85f#wFN;fFs(|>w5U=A(-Co zqxIOD;8uW4kR|BKW1l{1GF2SVAl=OVfX{Eu@ikTx^-Lf8Df*mbc-H^a-P%(Q&}5Y# zkZxZ1=)1$<5nJxy`E6#C;p!BF*O>JsUU7{l0Hc#UurF_TbGvLIs?U#+0}M>nFT_G# zz7>oP)xi~qN{i851R4l)sdcm5dvp^+x)8)HNR7{^&2xsr;8_E?__H@=yoGL}^MSuS zcXJ-s%oAy0hej}9uqqCm(-=UE&595&@P<>bfUC_y)BZ*u@1F;iGx9~qccA>1vVRT^ zSSSXIEsX%5?%O_i#z*&UefsR#=NJF+z#C0G2%vv~U>Zv$f(oqde02FXeR3O%+{d?Z zlO%O1-udn5S>6{ki{!=mLmdg6%^zpUHFxK|XJhY44%e*%1H6_E&j&U^++2PLSltNI zm<cil>U7FvG|y`f(lDAxUfMxRkYRwVV%q8W^!HFzhGgr#B`ciVjJYTH?0qg!u;Vo< zilc}?5#12(4(D$it&5V51^ShXF5+c#q_b?PT@>Nmhbw3o6d%13+hx0I#;g#`)9Ew= zLsy3{wEbfSvd}CA<ypIcJ2EEwRT<FUz@yiO>5#4NE4Q6{5(+QsvI=GcN^{Ks7vy#K zLSe!$XEfJI-yDP=D3=@HQW;k|&i)jtiVJ89+5^a;&=`ylU_a2dzf~tjal4yb0ni3= z$?Q=!WvTNzLa%a_I`Tzhl>xjP7${t)U>?FVBNW^rRvj{dMzT+30IyE#q^Z@g()2PV zCzXvnF20Kv;GG9Hv3B8Rh|A9<86eL6%EWz~2~&4Cl1n-ix&hufl|S3&>2SmxdXiz; z2V#@?3RG}i2eHVrU2MY(c2}S<b9y}WaWiPj2t`m$LH1ml9SF!2F}K4T2=@cfZ~#l- zXHWS1L+pps5?a=d#^6A|50g0@bSRFCJ_zkyki4rmpwF&W2Do?HlOe0a_591wlV;1C zy3RcctuW8Lo0-;_8#Liv4JG2E=e#GAQ@2^|xmw!3H!L#@q6(ygo0>@f^AitVdU(?S zog3Hjx8HMaWw-?CUWj3|G15F$wUK@XA}a?F!R692z%*!1dkpk-Gds&D^95J~O*t=S zLoi2-*TDoc`9@IaDO&1JfB30%2SAvr9A`4nEdiW`kwdfZI7Wl(aG&YxM59o-3aa)6 z(9W9JI67rIq#T^l0&s5N`0FBdo|(6w>X{Qm`54$=CmL!w&{V_)_s?_jyuki-(Xin@ z8$rNM6qqf@Roa6P%nO0CCmJ6;*fqyA{N@fB`RnTp5rHR!idEJ-waT4EHW;{BlbLlP zJehH^#V7%IlEBTShbFA_C~SpbbpSX#wVg4l{lp??q{B@>It<Wi#=+EX`NE@AMj0S( z%C&pXq>vFq6mvDL39N9pK>DKUwxGl@G6A}ci>7&xJpl$pcjk|mSLaIO*ej56RVUOK z8iC<%EnOYw?^rDDxq1idX1yF~DFXb;T_4?0Fqy#p)gIP+xmCsr(9;GMBzg=))2gy! z$O<C^aAEwctDsg($&W){f{g3j@yspIs~O<u?*(H5tWA%NCep~joH7#BNEHNmH3Kd+ zrHlZF*adDJuo|Kj0A+OV_MuR;23&_{QW>EhEDH=A;NtB}QCgNB7TAk07ZDT6pi<!) z&1f82uF&2lui^Swk49ZrD<UCJ|BO2_VF1*EfIbmi?5+j3&iDn6ztbX0CPZ;h^bv@3 zkhk>Gy_-DLcZo?2(6WJ`{cLcYFZkyF>+DM0;<~Oo5+DQ;i^PrqfdBy`R!Qs{(6Fy! z6(A&#hG7^+teOFY#OAb>o!E68+jUwu%IDPm+SHEyMTu;EYMmzECwWtA%aXU)_4cKX zoAgV%{RjR1-nsJ_W(G_$`kiynz3;ty?mhRM^WHoS@4ZqGuR<r$h>e{eUZvY>FAGNr z%qCnEfeRWzKeH6B)S@`1)^Y$cGwd-N2h>LwN_8xO3+x~NP=qon2e_2Ln?C~M&e~6+ zUw;hJ1ujAwO$!uoUOKWlHNXPm7=RTiz*UcytY3ad+RiKct5`04?Ya#cXp+6MgF7E= zkeWG%kwfdKotRUB+b_}41i`x09i}!{hv;p)m8Gfd-ivB^v|oZI9zoL~(18)zyMmeL zMC_iv!eVJy^UHBGeDZ>{`i*klCB5`H9m<h-M36L6R7QX_qI?}<rEC|@j&+=b#B`^_ z_17-51!$^I?XJt0O=|U}(l14~3X4osm79*7y?wJ3)!+Q=8^8Ja<FtT)o4Ff6Z`9GU z8)BAGdl`IuP%ce;gv$@)<f;i6r5-<rvKzz>IzV=iJJbp=+LBaIhg%qsVIa0<fPk5b zTh~O|@02q9T=E5x7L?mb%`c{yIZ5p##mbr+TsGv=Ec6rQ1&|mw4NG7^dB!MRyFa3t z925lts(T~$9zESWl=9Bws4=t?C%~dXJ&WrWS$XgbGyg`|AscKAtg=t97*Np1^3%R} z0!0u5v-!lr_DkC!s37M)f}L}>U+B_)LAPW`;MACgba3``k>2Hq(4wK&9~!oEqVGO6 ztlaG0Lq+RG#u)&Yq!4~aigcB5$`g*F;ec8^%7EH7191|xF6JB25Dya2xdc7h>%Sp) zNqr%hF542XR(Zeja}yfrhyVHVlktucF8B%vNR?tb{;UYXX(Zr{tMsySWIE19v~X8C zy*f|QUNrS?P;<pfHuLhQ4}t+4hEmZ+dn~L)P+ImPJLVpAy9SWpaL`3H8PsE?ExaH! z-%$j4QR?7S%N7Aw<O0{enwA2T!KDJuxEL9tZCj+R<L;B}Tzf*xsR(HU=S+ZM(5H`- z^p|tgf&~<(e)IBA>%aQmi+6s^7zA<)r4(MOV!d6ei<i5tkV4}wad;=@rPVA2^Rbz3 z$$nK12@F*;;`#$SWA@h2Sw|SaovqTSy=mY=x%P9`kVGo5WaJ!KGb|bgm*bo&%2100 zak$GM!HTsCLj2)<`;JM2TK$=?p8sj(1mhGa`0P3G^HKpf4F!VJWkcp-r#q#+P6~HE z<9GY{D0-;tvTB;jFYZ)1G#8cjSFdxt%36Crzri(8+aYo2CqW4y`UTg3`GFIt2DyW7 zFrY@9qppTzd&Qk+SKapvprN_0z-SpQ?jRFz09=^Epys779$9rlFur=7Loe+C>$ou1 zIfYW-{Fgt4aEeCYK#xl+mwjboGEZtv#%TzqfbetsP#zA<=gi%aX*O^V!7_@P_a1Mf zUf|+ukBVSt_5m1@2?oxVLoGk(Qp<|~ppg?>?4|pRE0?V^qN0M27i<R^9vvVfHw2G^ zwcme`j^F?df~x4um0Xoo6PV!AV(DB6wa`2UE`tt+ngOK3mAceu)yn2_C@QVdDjdcr z=tLzLK(||rs_Q*^gt=s05)DTKcO`|L0Ha6Ue*sK~TI~sG;Kc+N0NCZ^0l=;AOF2ky z<M=%gsS@z^fDr8`$JorAVB62IXg8ndAu0360=X!sK>+<RgL82`-wNUZ(9X_X;|+V- zc|<?RrhS8-VQ=o>yw%*LId5%L?9`a-zPHG4T-V#8A(=q5BW>r6iVLA=w5}$B_eN$9 z>3ewmM1r9Oa4h&Cnjd~D;p1l#+HX-u+}{1A|4gFKesP~IdZk|P{?$hyW-!C`v{{s? z;!yJgtz~mmxQq-cL3VDdE;Guqq!uYfUdPzSe>1@~D)A2nXI?nxpm_z#0bYMbZxLbH zmfrH=%|b4fJC@xmc}GxtL%R-+hqMjE1>g+m(tAM6(5WDRO*=t%pVeN>2WdE94xHYZ z%+Yf2f}FfV+`A7{9ne;gM)%K@O$Vp}=rO8wSzCOxvj63Bu$U#<b$rh(_->Gnf+6}- ziCz~WAH|oC+++lu-RpOj5y)$R1QT~=P0&VVp%?VJE}RZYc>8Cl6*|Gv4$&^aoxhV( zICc2f(cVe!%^|3aGG$K1=GN#N=$&j7_=ic!Wen0@bqpcFf0wlC{A7W0lXss$TT9!h z14Xt<Wps;upw0re0*0Rbl@^rRe?;&k%6SEVfDF!~QDnNg_KXmer=)2w3a*KcD0N&L zT9~41IQ}!BWad}~WI?H!+E?<%)p8iPRzP;mf(XpX+?EY$HF4q2+`A4g*fZWo<-GV{ z-=?>prr~r1*PE8~3jO9Y?d+JG|GNh?B}#|v(p%K>{*84l<?lbWM7;n9OAQy>ndfOB zfNnssDU0cY4w1wY`4DXz0|GeFV$K1eeRK@pe@Wys=cQB=m&%bIPU&PrmQ<rqa3WOE zDNT)qDBI$}QcAi@rHym%y8H0bqEu;_v`=nG1$;_-E{s%*hQ=YZOoPQR-1fFt7*)=h z%t5^i1ndEENiWcMi((iF!xuT_)^<7okNEWINpK*9^9u*9&7@VffKM@#a~e9zcvwRT zeS;b<8*I%NQ93|=^S^!WFKQutaJ|k#cjin0E9g=Z7!AtPtM=!vC{^`?s}}|s=D_H7 zE`s3AKj-mW5KFwYOcqHgJb`f(!Zery8tNYbr*(8_FD^{@{4xK8uwOm!Cqc!sK@IAF zn(nqGddBI6)8L$lF;sR7Uz@d-2aJ_Ru_2<07FK@5Tt`RYl-of^0)xPTQXXqa=WhA? z8|c6Q&1?X5gH+n%bZ$MFu!4g9Oo4#dkR|N}bn1MT7;EI36@bi)C=Mf}?<C`qZGhGR zO8Q=(_CEW@fp@-(O8I44bB0Wy=EPwDT(hJW+BSY!d2_Uy8rpt$^Lg+cAOWrY;S)4d zqBP8_SsY$=dvfxAY_pVg_oCpGXj@X#-S68Shad?2%cNv@vR@rGNHh=-qBlZN(K7%s zSxx7Yhh&F@_V8**ZR1Uuum7L{Ql+$~FhfNd!Adw$L7(x~4VoK>ed{W?jf)2)7w*)a zq&=GD-@Z#ZW3kfIVf^2l&s=Y2v^In2&dQLG1cw<FPCqrw4z)0hDj;`gh-Lxq{k`@V zIZ}y0q5W;02|^9%a9C9j*P+q%WzioMfPGINI9}LTI2#Eu4%FXJ=%BnzhmUH__~kWr z5DfzE{Q!)?DL9DYsP>S{X?5}rirO7mAsYu<8{fTV&60{y`|+^I3A8n!{oj^|;1wl| zG65qQ7|&D=4w-q$9rRbuF7l%*@xOoYQR6~1O+vQ^%A4rd9CtX+#M?l_QK<t-C@swA zS&_Ar_s|7rm^L&0ve`fp;4$m~;L6Y%Kq}~jhz1mfgFR9KH_n2Mt<_g$%UK3y2hCvw zWlCee6yV!I`5@*Yr2|rMJ(%F`(^7Id<D#^uNUa`+JQti+&4e-!no%Lcpj{pYqyOK2 z1q@iIS`I?7W>{(V;2igIqwDDrsJIsMzyIk9YEIc*3yz(PK6k9POO3V$nn0XVtT~;7 zj=cazYev)Rrtm_yB)}FRyX$Q8@x(<)dk&`1Ss2R8pehrm2OLp*G5~?yqf&wgFwvHk zaCrqaJ#`Qmv%mo<zz4ZJ0GCBsmkCBK2&B)i{`QqCA2Dcw*<)b0Up@@J$Iko@&@t>H z3O{=UrR&a*H2D{!46QJI^rY0m<3Kb4z>V8Xxl-vp+GP`op%6I%#@VHCe;v~zIp}lg zARa-ZjxcxBm4h+Itz|w`PL!vsocGpKr~<ED2U}pi+y%;{m#7%2&UoXM;t=ZRRQ3%f z5B=)ucOU_be4vu4g=1rC3Z)y5GXW-nn5Z%t1;v-afG8S1tby(7`p5*4mK@BfIE@16 z_OGCRfKC$wa>N=ZN-Iw(BY*J#nj*QTLm;5+<A=d{8U{|ZGFpLo3w6Hz;=$u_-Jd=L zaUba2zqSRj^F~nbe4j;GayQo*C@TS@ll6mQUi&NXFR%S2ZLX}GqCNBf&BxJ_18OSe zFq|Nu6V%wWyMX2Z(oGCAwT;mRu<LVY=^=)p&XaVv)zDz>uTJ@pJitMhWq=*a1k?VM zl_sp_)LTFR&n@%LuqvsYlY(X)sx#H~cLaBKgrG9==0AdOTmQ$9bdf*~1AqNghd&U{ z@%~-D*B4HCAcp?66R+OE@yDZ#+9MxmDlTqEfH|5XZ6eslI2&v1b^Buh^TjT;R@lTG z2+)thMGR;{X<L=biPPs!(YxP!8jNN%O1p5*ebo=_){{rUv!t~#4drl1lGMPzdXSF7 zZjLH-5OZ5IE}TaBKmTx31qlrb{QJ)z4hq@JO%pSHv?p-qhLk>e7QG5E7fLx3n8rZ1 zNew)wCZ9vsQD)#2Ls}M`Tp_{9K$KkKW>AvrwLj$-x!`jkm97TOkPY-M29J(ZNbGZ@ z0&J=j>^x^P%>JXDXNCq*ju(xd%s@#6ksvDLI`o440zbQgA_@c;d+8uLl0^zRkFvsG zk1<|8xFAitQS`<pf_HxT-5*NZOmPd74^JxDAg*J}R6$A4aR>l&4Wo{pf9siG@Ocos z*xOVSemR<62@Gl{uH0<qnp&nfu5A?c%?=i~X%8=DAnM>mfvhxoL*Jy-xC#Jc*tH<@ zpZ|iofcw{^Oc*T?p{kXk1~BOXwNlUnRK#%#@7yp*dmM@c?F)|7_o3i~1#LsAbZ5qh z;L!Yb2zI^RnNxCBueb{XJEB+I>w~C#@XwQHP^@OPRK<n1LZZjzmDk;SluHdb2J$;b zwBMd>lZHwuQe98US*iQ|^=FpR$knD|!*CCHLxr*t9Yf%cB9SSqU+T1;fM*w<h(#+; zEcDU+pcznBqVf1alxvebj2bUXl&T?RM}{SB+(GIF6QmdmYw1To>aV}`oJdWhD0%$n zKaqz0iBlqga~X^Jvgl4g5U0>pOTVB7fR;Hx$2|{<JIv*MNBQi6gC~IT%2041Rf^s` zPGk^7hXop>cuy&>WfXB;fKtx=QgD~lgnPUT?F>g&y@ZE>?ZTtL%6+6<$MkutWwygH zJ!5su+O1Bv+kG|DQ}bxFI`jmL&RXbR$5qe<2GlN9b=-bdbO)e_W8O$(DrSO9r^D7T zKNL=a?bdGNHTNCl+-Mptz_=Ae+o<p=g9vc!^n`p6Lku{5JZ9geiU0V?Qw_@P6X$oL zIdV_Pa(!dpIG4J0Z9P%jOS>lT7zCd>1xA|>w3NT~3rjN<>WGWrhOTuv$f<9o19KJ( zfkVoB*W!-uFix#$7ROwxa$(!p5?X+2DZuFif_f=9ARq~(26Oi@$aFRaoD#X>%$a-t z@7q_tok$N}^Y1FuKKy36_G6Y~kpJz^hF6<Ecob4_EV~6hdYI{rPCR5#IR$c3$QLi8 z2<>NX1QIw!bp#}PL2}_L%5mkLt6`|jl!5^lwf|0qP});qLs69w&p<MR?tTx9ORdAG zOEn>ZG*YB9X%~tZ5M6*ROTplU%BvwV8D7|tyUZ(i&b4_v7*O}G-vU4HsvY8CfcA4^ zl;P_yI2eYdM*2PkTy&Iqdw=&O=d5*d>&}mknn5o2|L8|+Q|02;fr_dlJ6^pK3n?bH zE1z~@W=($Y@$|@p5a<ofePFxxg8_Rp?Q}g8i0*I%BzXI(lw1aYw%RrUmJ$wjV1f~- z{Ac?_G%9r|-18Wf1do6Tc=`~~cL5vEtn{uupv7{Yv6(=epz<0+|Irh#z5r1NBYD>+ zF9jx5j17bx2{NbL*UsY&sqtD&Ve39-D28fD_W|(8?M3^n!y(hlcW$cGg+{?_eH(<! zpfYK=Bn9|N|6*3QbEfrNiIuq_pru!Pc34mU!kuUJogj?X2J#f*S4SUU|A`<Pxld)J zZOvSgv9+_={-b5I?Rh3);QqBx5jf#75kqb7KMiRrLiu-*G!LT4s|SmE{|Rs&5Tpi9 zt8fH&Ik*InArg#x<kR3MZNbfqQwu1}8hwZxfJ01k^vVEG`V5#miuFqVY;GVbIUpvT zF|9_k4DjH}aY`VM_sO9Jr~*a9(IY|oK{khZWWt(jnXrS*PUnnyb}Vm3&-SjzbvL)= zseESOz?r)NE*G%fZ+&2)TR+5;_Q?Qu(=mgWWlmag%E+BU>2%ZNk50C2kMa-k^V_)- z2br|PUEKt0HL?gstG2PNuE&(ybfP}r^FXd}rSUj+<`Wd6K(3FB7k~8YrytyAI?+^L z*WHuXR`1ylk8%wF&u38|831}hecEC3($3vnN8x4P>f?Eo*ksd#xkU2W;NXi6^9;_) zUY%fU8QQCpklNyLTF-a&gHkMzge@Gq8ilK)>gnlO=PY_{Gux-|QVyQm(+lP7?r9wR zHu~Rwd{IlslI41-NQ2@ns_?B~j6t*vl2L=Fc`3nG_=*oTwRj2Q#I$*2qtRbJheLrf ztSbuqAE)@6Xpn6)aJtR9uC<Pu=O$)ds&JODIjl}+s~zWzDc41jr`dXUoa~5$d$dCF zQLp*z4BK2KbSzvl&CQNkr)KSzwb#yiYWelw@;U)Pe+$WeeyLuX91)vp^1UR?$2>Iv z=umi}SJ!AqX4%AYTeDPZ*%B|^@J<=<-SUJ?moBsjQhX|^Td+*bIq{O-di#XcWU*jX z+RRgC+eV8bedS!jx<JIrc)K&&Gkxl6&=TlLr`6FoJ!x&7o*ti@@ohbHVJYVICHyKh z#?Q~-nhi>{0%K_MVK-6HC(+K(+^~Q25eJeE!4G(;=!4VwP|@V_V&7etX_phdh&A+% z9|L&zYbx^H@04@aJTb9R7^1h`p!6kJJ{~LW)9%Jid&Vo7si9`fY8m%Ecqo|P&a)}b z1bNVq;$;+UJHDBc4f`#}k<%FaQKUimy#7HmuzJ#Gr>)br4Lz~B8OLRUkf6cQH6PFH z`k)0k)bF#~4xG77PN#Kpcmi3wb=qQ{s6{Gr*oWt4?bDn3%<Mu5G9bD}y5R3TTp!UF zHt_ZOHnfnsIz>+it0j1Tfva<r(m%M_rv}ff??&?!u2s~xP0y5vUW_1K{K9Hgn2%3q z8uh73#TLHMj@oT=c%S!%22<Cp;nA2%A{;8q*L3WgDXCkqTITc@hWnU?6;s$nZ%P9B zJm)#|Ybtf-_Id5**)>NB(`cV;RkDCOpxx=!>Bbjpn{^$ocdcKxpli3BgKJG+mn;|q zFHVnPh}{S$pXU|tj!eV6V6n_@d|SeEtlEo6p{QR@{kV9k&`0btM%TR8h+T?s^7`64 zA)YFip$@pzfT(W4{JiJpzv!jVZAN%S+T0{g`8cmxXEydt(IPw^s%%i@z0lacw3#xG zyE>k8=^o{mjO|F)HlNu78<#ih-u;%nXWuyXzaIWExOgSFcX-i9HtS#eKY|UfTGOLP z7h7;;icS!~-V4t!H(Ti4G>R+Zdb`6p+dVg|7HY#37_aW#U^NaREgkXlw!7cls!B1Q zb3;`aeH*`NVuo}0?!lMwxjtysu?2P2*3oGPuAjCxMVf7(4HHC(u&Q?{MJY;ozhetp zYs^k7PUzMtr+pTeZ@wS=>*+O1=v&?6gjc#=l<pdW=zsHxEok5D)#;u}eZTo|z0$4C zd6SnRdMfqx2C+XzrMQvF=S#&rbz%~{-{|q?9WSk0o2w{B!0^<v**VbXTPoHo4f;b= zN>*@t&!mrOqCbH5=){q667r5!-kRBhE6GH~e|<-*ujgT}pCCi$4^;Jami2z%?0S`3 z)A+T<<i)n<gDlr8;+@+q%x&|BTY9cx1Ug;+T(|W~c^dwDrM{PoH}L@e7Z!53>j%;6 z`<Gq3G-&4X{+YDr==tT^^Z&p9xc<fYe9y!CKYZ5f;8$+%8EpMOfjno$iv`b{?CUjd zU^UN+f49q_uem~z4n1#l`c^78z&5=7={XyAg5;omGE~VzRPq+Qei6+(s?2h}?{;>y V1maxf=U0q>I0|2>c_W!E{}29qCFuYF literal 58702 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 D613UA diff --git a/samples/client/petstore/kotlin-multiplatform/gradle/wrapper/gradle-wrapper.properties b/samples/client/petstore/kotlin-multiplatform/gradle/wrapper/gradle-wrapper.properties index 6ce793f21e8..8f38dbc2bfd 100644 --- a/samples/client/petstore/kotlin-multiplatform/gradle/wrapper/gradle-wrapper.properties +++ b/samples/client/petstore/kotlin-multiplatform/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Tue May 17 23:08:05 CST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip diff --git a/samples/client/petstore/kotlin-multiplatform/gradlew b/samples/client/petstore/kotlin-multiplatform/gradlew old mode 100755 new mode 100644 index 2fe81a7d95e..9d82f789151 --- a/samples/client/petstore/kotlin-multiplatform/gradlew +++ b/samples/client/petstore/kotlin-multiplatform/gradlew @@ -1,20 +1,4 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# +#!/usr/bin/env bash ############################################################################## ## @@ -22,38 +6,20 @@ ## ############################################################################## -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` -# 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"' - # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn () { +warn ( ) { echo "$*" } -die () { +die ( ) { echo echo "$*" echo @@ -64,7 +30,6 @@ die () { cygwin=false msys=false darwin=false -nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -75,11 +40,26 @@ case "`uname`" in MINGW* ) msys=true ;; - NONSTOP* ) - nonstop=true - ;; esac +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -105,7 +85,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -125,8 +105,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` @@ -154,30 +134,27 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then else eval `echo args$i`="\"$arg\"" fi - i=`expr $i + 1` + i=$((i+1)) done case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") } -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" -exec "$JAVACMD" "$@" +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/samples/client/petstore/kotlin-multiplatform/gradlew.bat b/samples/client/petstore/kotlin-multiplatform/gradlew.bat index 24467a141f7..5f192121eb4 100644 --- a/samples/client/petstore/kotlin-multiplatform/gradlew.bat +++ b/samples/client/petstore/kotlin-multiplatform/gradlew.bat @@ -1,100 +1,90 @@ -@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=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@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%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -: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 %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="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! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@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 + +@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= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +: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 %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/client/petstore/kotlin-multiplatform/pom.xml b/samples/client/petstore/kotlin-multiplatform/pom.xml deleted file mode 100644 index bf62ae66e66..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ -<project> - <modelVersion>4.0.0</modelVersion> - <groupId>io.swagger</groupId> - <artifactId>KotlinMultiPlatformClientTests</artifactId> - <packaging>pom</packaging> - <version>1.0-SNAPSHOT</version> - <name>Kotlin MultiPlatform Petstore Client</name> - <build> - <plugins> - <plugin> - <artifactId>maven-dependency-plugin</artifactId> - <executions> - <execution> - <phase>package</phase> - <goals> - <goal>copy-dependencies</goal> - </goals> - <configuration> - <outputDirectory>${project.build.directory}</outputDirectory> - </configuration> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <version>1.2.1</version> - <executions> - <execution> - <id>bundle-test</id> - <phase>integration-test</phase> - <goals> - <goal>exec</goal> - </goals> - <configuration> - <executable>/bin/bash</executable> - <arguments> - <argument>gradlew</argument> - <argument>build</argument> - </arguments> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - </build> -</project> diff --git a/samples/client/petstore/kotlin-multiplatform/settings.gradle b/samples/client/petstore/kotlin-multiplatform/settings.gradle deleted file mode 100644 index b000833f485..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -enableFeaturePreview('GRADLE_METADATA') -rootProject.name = 'kotlin-client-petstore-multiplatform' \ No newline at end of file diff --git a/samples/client/petstore/kotlin-multiplatform/settings.gradle.kts b/samples/client/petstore/kotlin-multiplatform/settings.gradle.kts new file mode 100644 index 00000000000..bbbfee48d65 --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "kotlin-client-petstore-multiplatform" diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt similarity index 65% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt index e164a6cf4d0..2a68d42db11 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse @@ -16,26 +16,26 @@ import org.openapitools.client.models.Pet import org.openapitools.client.infrastructure.* import io.ktor.client.request.forms.formData -import kotlinx.serialization.UnstableDefault import io.ktor.client.engine.HttpClientEngine import io.ktor.client.features.json.serializer.KotlinxSerializer +import io.ktor.client.request.forms.FormPart import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonConfiguration import io.ktor.http.ParametersBuilder import kotlinx.serialization.* -import kotlinx.serialization.internal.StringDescriptor +import kotlinx.serialization.builtins.list +import kotlinx.serialization.builtins.serializer -class PetApi @UseExperimental(UnstableDefault::class) constructor( +class PetApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, serializer: KotlinxSerializer ) : ApiClient(baseUrl, httpClientEngine, serializer) { - @UseExperimental(UnstableDefault::class) constructor( - baseUrl: kotlin.String = "http://petstore.swagger.io/v2", + baseUrl: String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Default + jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) /** @@ -44,15 +44,18 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( * @param body Pet object that needs to be added to the store * @return void */ - suspend fun addPet(body: Pet): HttpResponse<Unit> { - + suspend fun addPet( + body: Pet + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>("petstore_auth") val localVariableBody = body - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.POST, @@ -69,7 +72,6 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( } - /** * Deletes a pet * @@ -77,21 +79,25 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( * @param apiKey (optional) * @return void */ - suspend fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): HttpResponse<Unit> { - + suspend fun deletePet( + petId: kotlin.Long, + apiKey: kotlin.String? = null + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>("petstore_auth") val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() - apiKey?.apply { localVariableHeaders["api_key"] = this.toString() } + val localVariableHeaders = mutableMapOf<String, String?>( + "api_key" to this?.toString() + ) val localVariableConfig = RequestConfig( RequestMethod.DELETE, - "/pet/{petId}".replace("{" + "petId" + "}", "$petId"), + "/pet/{petId}".replace("petId", "$petId"), query = localVariableQuery, headers = localVariableHeaders ) @@ -102,8 +108,6 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * Finds Pets by status * Multiple status values can be provided with comma separated strings @@ -111,17 +115,20 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( * @return kotlin.collections.List<Pet> */ @Suppress("UNCHECKED_CAST") - suspend fun findPetsByStatus(status: kotlin.collections.List<kotlin.String>): HttpResponse<kotlin.collections.List<Pet>> { - + suspend fun findPetsByStatus( + status: kotlin.collections.List<kotlin.String> + ): HttpResponse<kotlin.collections.List<Pet>> { val localVariableAuthNames = listOf<String>("petstore_auth") val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() - status?.apply { localVariableQuery["status"] = toMultiValue(this, "csv") } + val localVariableQuery = mutableMapOf<String, List<String>?>( + "status" to status?.let { toMultiValue(it, "csv") } + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.GET, @@ -136,18 +143,19 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap<FindPetsByStatusResponse>().map { value } } - @Serializable private class FindPetsByStatusResponse(val value: List<Pet>) { @Serializer(FindPetsByStatusResponse::class) companion object : KSerializer<FindPetsByStatusResponse> { - private val serializer: KSerializer<List<Pet>> = Pet.serializer().list - override val descriptor = StringDescriptor.withName("FindPetsByStatusResponse") - override fun serialize(encoder: Encoder, obj: FindPetsByStatusResponse) = serializer.serialize(encoder, obj.value) - override fun deserialize(decoder: Decoder) = FindPetsByStatusResponse(serializer.deserialize(decoder)) + private val serializer = Pet.serializer().list + override val descriptor = PrimitiveDescriptor("FindPetsByStatusResponse", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: FindPetsByStatusResponse) = + serializer.serialize(encoder, value.value) + + override fun deserialize(decoder: Decoder) = FindPetsByStatusResponse(serializer.deserialize(decoder)) } } - /** * Finds Pets by tags * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. @@ -155,17 +163,20 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( * @return kotlin.collections.List<Pet> */ @Suppress("UNCHECKED_CAST") - suspend fun findPetsByTags(tags: kotlin.collections.List<kotlin.String>): HttpResponse<kotlin.collections.List<Pet>> { - + suspend fun findPetsByTags( + tags: kotlin.collections.List<kotlin.String> + ): HttpResponse<kotlin.collections.List<Pet>> { val localVariableAuthNames = listOf<String>("petstore_auth") val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() - tags?.apply { localVariableQuery["tags"] = toMultiValue(this, "csv") } + val localVariableQuery = mutableMapOf<String, List<String>?>( + "tags" to tags?.let { toMultiValue(it, "csv") } + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.GET, @@ -180,18 +191,19 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap<FindPetsByTagsResponse>().map { value } } - @Serializable private class FindPetsByTagsResponse(val value: List<Pet>) { @Serializer(FindPetsByTagsResponse::class) companion object : KSerializer<FindPetsByTagsResponse> { - private val serializer: KSerializer<List<Pet>> = Pet.serializer().list - override val descriptor = StringDescriptor.withName("FindPetsByTagsResponse") - override fun serialize(encoder: Encoder, obj: FindPetsByTagsResponse) = serializer.serialize(encoder, obj.value) - override fun deserialize(decoder: Decoder) = FindPetsByTagsResponse(serializer.deserialize(decoder)) + private val serializer = Pet.serializer().list + override val descriptor = PrimitiveDescriptor("FindPetsByTagsResponse", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: FindPetsByTagsResponse) = + serializer.serialize(encoder, value.value) + + override fun deserialize(decoder: Decoder) = FindPetsByTagsResponse(serializer.deserialize(decoder)) } } - /** * Find pet by ID * Returns a single pet @@ -199,20 +211,23 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( * @return Pet */ @Suppress("UNCHECKED_CAST") - suspend fun getPetById(petId: kotlin.Long): HttpResponse<Pet> { - + suspend fun getPetById( + petId: kotlin.Long + ): HttpResponse<Pet> { val localVariableAuthNames = listOf<String>("api_key") val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.GET, - "/pet/{petId}".replace("{" + "petId" + "}", "$petId"), + "/pet/{petId}".replace("petId", "$petId"), query = localVariableQuery, headers = localVariableHeaders ) @@ -223,23 +238,24 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * Update an existing pet * * @param body Pet object that needs to be added to the store * @return void */ - suspend fun updatePet(body: Pet): HttpResponse<Unit> { - + suspend fun updatePet( + body: Pet + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>("petstore_auth") val localVariableBody = body - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.PUT, @@ -256,7 +272,6 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( } - /** * Updates a pet in the store with form data * @@ -265,8 +280,11 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( * @param status Updated status of the pet (optional) * @return void */ - suspend fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): HttpResponse<Unit> { - + suspend fun updatePetWithForm( + petId: kotlin.Long, + name: kotlin.String? = null, + status: kotlin.String? = null + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>("petstore_auth") val localVariableBody = @@ -275,13 +293,15 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( status?.apply { it.append("status", status.toString()) } }.build() - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.POST, - "/pet/{petId}".replace("{" + "petId" + "}", "$petId"), + "/pet/{petId}".replace("petId", "$petId"), query = localVariableQuery, headers = localVariableHeaders ) @@ -292,8 +312,6 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * uploads an image * @@ -303,23 +321,28 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( * @return ApiResponse */ @Suppress("UNCHECKED_CAST") - suspend fun uploadFile(petId: kotlin.Long, additionalMetadata: kotlin.String?, file: io.ktor.client.request.forms.InputProvider?): HttpResponse<ApiResponse> { - + suspend fun uploadFile( + petId: kotlin.Long, + additionalMetadata: kotlin.String? = null, + file: io.ktor.client.request.forms.InputProvider? = null + ): HttpResponse<ApiResponse> { val localVariableAuthNames = listOf<String>("petstore_auth") val localVariableBody = formData { - additionalMetadata?.apply { append("additionalMetadata", additionalMetadata) } - file?.apply { append("file", file) } + additionalMetadata?.let { append(FormPart("additionalMetadata", it)) } + file?.let { append(FormPart("file", it)) } } - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.POST, - "/pet/{petId}/uploadImage".replace("{" + "petId" + "}", "$petId"), + "/pet/{petId}/uploadImage".replace("petId", "$petId"), query = localVariableQuery, headers = localVariableHeaders ) @@ -330,15 +353,4 @@ class PetApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - - - companion object { - internal fun setMappers(serializer: KotlinxSerializer) { - - serializer.setMapper(FindPetsByStatusResponse::class, FindPetsByStatusResponse.serializer()) - serializer.setMapper(FindPetsByTagsResponse::class, FindPetsByTagsResponse.serializer()) - - } - } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt similarity index 70% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/StoreApi.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt index 8ca30e8ca3a..34319c6d10f 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt @@ -1,40 +1,40 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order import org.openapitools.client.infrastructure.* import io.ktor.client.request.forms.formData -import kotlinx.serialization.UnstableDefault import io.ktor.client.engine.HttpClientEngine import io.ktor.client.features.json.serializer.KotlinxSerializer +import io.ktor.client.request.forms.FormPart import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonConfiguration import io.ktor.http.ParametersBuilder import kotlinx.serialization.* -import kotlinx.serialization.internal.StringDescriptor +import kotlinx.serialization.builtins.list +import kotlinx.serialization.builtins.serializer -class StoreApi @UseExperimental(UnstableDefault::class) constructor( +class StoreApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, serializer: KotlinxSerializer ) : ApiClient(baseUrl, httpClientEngine, serializer) { - @UseExperimental(UnstableDefault::class) constructor( - baseUrl: kotlin.String = "http://petstore.swagger.io/v2", + baseUrl: String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Default + jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) /** @@ -43,20 +43,23 @@ class StoreApi @UseExperimental(UnstableDefault::class) constructor( * @param orderId ID of the order that needs to be deleted * @return void */ - suspend fun deleteOrder(orderId: kotlin.String): HttpResponse<Unit> { - + suspend fun deleteOrder( + orderId: kotlin.String + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>() val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.DELETE, - "/store/order/{orderId}".replace("{" + "orderId" + "}", "$orderId"), + "/store/order/{orderId}".replace("orderId", "$orderId"), query = localVariableQuery, headers = localVariableHeaders ) @@ -67,24 +70,24 @@ class StoreApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * Returns pet inventories by status * Returns a map of status codes to quantities * @return kotlin.collections.Map<kotlin.String, kotlin.Int> */ @Suppress("UNCHECKED_CAST") - suspend fun getInventory(): HttpResponse<kotlin.collections.Map<kotlin.String, kotlin.Int>> { - + suspend fun getInventory( + ): HttpResponse<kotlin.collections.Map<kotlin.String, kotlin.Int>> { val localVariableAuthNames = listOf<String>("api_key") val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.GET, @@ -99,18 +102,16 @@ class StoreApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap<GetInventoryResponse>().map { value } } - @Serializable private class GetInventoryResponse(val value: Map<kotlin.String, kotlin.Int>) { @Serializer(GetInventoryResponse::class) companion object : KSerializer<GetInventoryResponse> { private val serializer: KSerializer<Map<kotlin.String, kotlin.Int>> = (kotlin.String.serializer() to kotlin.Int.serializer()).map - override val descriptor = StringDescriptor.withName("GetInventoryResponse") - override fun serialize(encoder: Encoder, obj: GetInventoryResponse) = serializer.serialize(encoder, obj.value) + override val descriptor = PrimitiveDescriptor("GetInventoryResponse", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: GetInventoryResponse) = serializer.serialize(encoder, value.value) override fun deserialize(decoder: Decoder) = GetInventoryResponse(serializer.deserialize(decoder)) } } - /** * Find purchase order by ID * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions @@ -118,20 +119,23 @@ class StoreApi @UseExperimental(UnstableDefault::class) constructor( * @return Order */ @Suppress("UNCHECKED_CAST") - suspend fun getOrderById(orderId: kotlin.Long): HttpResponse<Order> { - + suspend fun getOrderById( + orderId: kotlin.Long + ): HttpResponse<Order> { val localVariableAuthNames = listOf<String>() val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.GET, - "/store/order/{orderId}".replace("{" + "orderId" + "}", "$orderId"), + "/store/order/{orderId}".replace("orderId", "$orderId"), query = localVariableQuery, headers = localVariableHeaders ) @@ -142,8 +146,6 @@ class StoreApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * Place an order for a pet * @@ -151,15 +153,18 @@ class StoreApi @UseExperimental(UnstableDefault::class) constructor( * @return Order */ @Suppress("UNCHECKED_CAST") - suspend fun placeOrder(body: Order): HttpResponse<Order> { - + suspend fun placeOrder( + body: Order + ): HttpResponse<Order> { val localVariableAuthNames = listOf<String>() val localVariableBody = body - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.POST, @@ -176,12 +181,4 @@ class StoreApi @UseExperimental(UnstableDefault::class) constructor( } - - - companion object { - internal fun setMappers(serializer: KotlinxSerializer) { - serializer.setMapper(GetInventoryResponse::class, GetInventoryResponse.serializer()) - - } - } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt similarity index 64% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/UserApi.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt index 88474dc9ef8..677d7a85e25 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt @@ -1,40 +1,40 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User import org.openapitools.client.infrastructure.* import io.ktor.client.request.forms.formData -import kotlinx.serialization.UnstableDefault import io.ktor.client.engine.HttpClientEngine import io.ktor.client.features.json.serializer.KotlinxSerializer +import io.ktor.client.request.forms.FormPart import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonConfiguration import io.ktor.http.ParametersBuilder import kotlinx.serialization.* -import kotlinx.serialization.internal.StringDescriptor +import kotlinx.serialization.builtins.list +import kotlinx.serialization.builtins.serializer -class UserApi @UseExperimental(UnstableDefault::class) constructor( +class UserApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, serializer: KotlinxSerializer ) : ApiClient(baseUrl, httpClientEngine, serializer) { - @UseExperimental(UnstableDefault::class) constructor( - baseUrl: kotlin.String = "http://petstore.swagger.io/v2", + baseUrl: String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Default + jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) /** @@ -43,15 +43,18 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( * @param body Created user object * @return void */ - suspend fun createUser(body: User): HttpResponse<Unit> { - + suspend fun createUser( + body: User + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>() val localVariableBody = body - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.POST, @@ -68,22 +71,24 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( } - /** * Creates list of users with given input array * * @param body List of user object * @return void */ - suspend fun createUsersWithArrayInput(body: kotlin.collections.List<User>): HttpResponse<Unit> { - + suspend fun createUsersWithArrayInput( + body: kotlin.collections.List<User> + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>() - val localVariableBody = CreateUsersWithArrayInputRequest(body) + val localVariableBody = body?.let { CreateUsersWithArrayInputRequest(it) } - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.POST, @@ -103,28 +108,33 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( private class CreateUsersWithArrayInputRequest(val value: List<User>) { @Serializer(CreateUsersWithArrayInputRequest::class) companion object : KSerializer<CreateUsersWithArrayInputRequest> { - private val serializer: KSerializer<List<User>> = User.serializer().list - override val descriptor = StringDescriptor.withName("CreateUsersWithArrayInputRequest") - override fun serialize(encoder: Encoder, obj: CreateUsersWithArrayInputRequest) = serializer.serialize(encoder, obj.value) - override fun deserialize(decoder: Decoder) = CreateUsersWithArrayInputRequest(serializer.deserialize(decoder)) + private val serializer = User.serializer().list + override val descriptor = PrimitiveDescriptor("CreateUsersWithArrayInputRequest", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: CreateUsersWithArrayInputRequest) = + serializer.serialize(encoder, value.value) + + override fun deserialize(decoder: Decoder) = CreateUsersWithArrayInputRequest(serializer.deserialize(decoder)) } } - /** * Creates list of users with given input array * * @param body List of user object * @return void */ - suspend fun createUsersWithListInput(body: kotlin.collections.List<User>): HttpResponse<Unit> { - + suspend fun createUsersWithListInput( + body: kotlin.collections.List<User> + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>() - val localVariableBody = CreateUsersWithListInputRequest(body) + val localVariableBody = body?.let { CreateUsersWithListInputRequest(it) } - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.POST, @@ -144,33 +154,38 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( private class CreateUsersWithListInputRequest(val value: List<User>) { @Serializer(CreateUsersWithListInputRequest::class) companion object : KSerializer<CreateUsersWithListInputRequest> { - private val serializer: KSerializer<List<User>> = User.serializer().list - override val descriptor = StringDescriptor.withName("CreateUsersWithListInputRequest") - override fun serialize(encoder: Encoder, obj: CreateUsersWithListInputRequest) = serializer.serialize(encoder, obj.value) - override fun deserialize(decoder: Decoder) = CreateUsersWithListInputRequest(serializer.deserialize(decoder)) + private val serializer = User.serializer().list + override val descriptor = PrimitiveDescriptor("CreateUsersWithListInputRequest", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: CreateUsersWithListInputRequest) = + serializer.serialize(encoder, value.value) + + override fun deserialize(decoder: Decoder) = CreateUsersWithListInputRequest(serializer.deserialize(decoder)) } } - /** * Delete user * This can only be done by the logged in user. * @param username The name that needs to be deleted * @return void */ - suspend fun deleteUser(username: kotlin.String): HttpResponse<Unit> { - + suspend fun deleteUser( + username: kotlin.String + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>() val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.DELETE, - "/user/{username}".replace("{" + "username" + "}", "$username"), + "/user/{username}".replace("username", "$username"), query = localVariableQuery, headers = localVariableHeaders ) @@ -181,8 +196,6 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * Get user by user name * @@ -190,20 +203,23 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( * @return User */ @Suppress("UNCHECKED_CAST") - suspend fun getUserByName(username: kotlin.String): HttpResponse<User> { - + suspend fun getUserByName( + username: kotlin.String + ): HttpResponse<User> { val localVariableAuthNames = listOf<String>() val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.GET, - "/user/{username}".replace("{" + "username" + "}", "$username"), + "/user/{username}".replace("username", "$username"), query = localVariableQuery, headers = localVariableHeaders ) @@ -214,8 +230,6 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * Logs user into the system * @@ -224,18 +238,22 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( * @return kotlin.String */ @Suppress("UNCHECKED_CAST") - suspend fun loginUser(username: kotlin.String, password: kotlin.String): HttpResponse<kotlin.String> { - + suspend fun loginUser( + username: kotlin.String, + password: kotlin.String + ): HttpResponse<kotlin.String> { val localVariableAuthNames = listOf<String>() val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() - username?.apply { localVariableQuery["username"] = listOf("$username") } - password?.apply { localVariableQuery["password"] = listOf("$password") } + val localVariableQuery = mutableMapOf<String, List<String>?>( + "username" to listOf("$username"), + "password" to listOf("$password") + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.GET, @@ -250,23 +268,23 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * Logs out current logged in user session * * @return void */ - suspend fun logoutUser(): HttpResponse<Unit> { - + suspend fun logoutUser( + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>() val localVariableBody = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.GET, @@ -281,8 +299,6 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( localVariableAuthNames ).wrap() } - - /** * Updated user * This can only be done by the logged in user. @@ -290,19 +306,23 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( * @param body Updated user object * @return void */ - suspend fun updateUser(username: kotlin.String, body: User): HttpResponse<Unit> { - + suspend fun updateUser( + username: kotlin.String, + body: User + ): HttpResponse<Unit> { val localVariableAuthNames = listOf<String>() val localVariableBody = body - val localVariableQuery = mutableMapOf<String, List<String>>() + val localVariableQuery = mutableMapOf<String, List<String>?>( + ) - val localVariableHeaders = mutableMapOf<String, String>() + val localVariableHeaders = mutableMapOf<String, String?>( + ) val localVariableConfig = RequestConfig( RequestMethod.PUT, - "/user/{username}".replace("{" + "username" + "}", "$username"), + "/user/{username}".replace("username", "$username"), query = localVariableQuery, headers = localVariableHeaders ) @@ -315,14 +335,4 @@ class UserApi @UseExperimental(UnstableDefault::class) constructor( } - - - companion object { - internal fun setMappers(serializer: KotlinxSerializer) { - - serializer.setMapper(CreateUsersWithArrayInputRequest::class, CreateUsersWithArrayInputRequest.serializer()) - serializer.setMapper(CreateUsersWithListInputRequest::class, CreateUsersWithListInputRequest.serializer()) - - } - } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/ApiKeyAuth.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/ApiKeyAuth.kt similarity index 82% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/ApiKeyAuth.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/ApiKeyAuth.kt index 8bd8b59a8f8..5393e5bb286 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/ApiKeyAuth.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/ApiKeyAuth.kt @@ -4,7 +4,7 @@ class ApiKeyAuth(private val location: String, val paramName: String) : Authenti var apiKey: String? = null var apiKeyPrefix: String? = null - override fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) { + override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { val key: String = apiKey ?: return val prefix: String? = apiKeyPrefix val value: String = if (prefix != null) "$prefix $key" else key diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/Authentication.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/Authentication.kt similarity index 71% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/Authentication.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/Authentication.kt index 2c5dfb4acc5..6abcf7c0a04 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/Authentication.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/Authentication.kt @@ -1,13 +1,11 @@ package org.openapitools.client.auth interface Authentication { - /** * Apply authentication settings to header and query params. * * @param query Query parameters. * @param headers Header parameters. */ - fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) - + fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/HttpBasicAuth.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt similarity index 80% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/HttpBasicAuth.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt index 5f0a52c1951..c1ab3b59353 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/HttpBasicAuth.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt @@ -8,7 +8,7 @@ class HttpBasicAuth : Authentication { var password: String? = null @InternalAPI - override fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) { + override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { if (username == null && password == null) return val str = (username ?: "") + ":" + (password ?: "") val auth = str.encodeBase64() diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/HttpBearerAuth.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt similarity index 81% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/HttpBearerAuth.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt index a6fb285af5c..2a0df092dbf 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/HttpBearerAuth.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt @@ -3,7 +3,7 @@ package org.openapitools.client.auth class HttpBearerAuth(private val scheme: String?) : Authentication { var bearerToken: String? = null - override fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) { + override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { val token: String = bearerToken ?: return headers["Authorization"] = (if (scheme != null) upperCaseBearer(scheme)!! + " " else "") + token } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/OAuth.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/OAuth.kt similarity index 66% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/OAuth.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/OAuth.kt index 08b289c2944..1c156c538ce 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/auth/OAuth.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/OAuth.kt @@ -3,7 +3,7 @@ package org.openapitools.client.auth class OAuth : Authentication { var accessToken: String? = null - override fun apply(query: MutableMap<String, List<String>>, headers: MutableMap<String, String>) { + override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { val token: String = accessToken ?: return headers["Authorization"] = "Bearer $token" } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/ApiAbstractions.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt similarity index 100% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/ApiAbstractions.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/ApiClient.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClient.kt similarity index 60% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/ApiClient.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClient.kt index fe8434be210..ef2d89ea9d5 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/ApiClient.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClient.kt @@ -2,74 +2,49 @@ package org.openapitools.client.infrastructure import io.ktor.client.HttpClient import io.ktor.client.HttpClientConfig -import io.ktor.client.call.call import io.ktor.client.engine.HttpClientEngine import io.ktor.client.features.json.JsonFeature -import io.ktor.client.features.json.JsonSerializer import io.ktor.client.features.json.serializer.KotlinxSerializer -import io.ktor.client.request.accept import io.ktor.client.request.forms.FormDataContent import io.ktor.client.request.forms.MultiPartFormDataContent import io.ktor.client.request.header import io.ktor.client.request.parameter -import io.ktor.client.response.HttpResponse +import io.ktor.client.request.request +import io.ktor.client.statement.HttpResponse import io.ktor.client.utils.EmptyContent import io.ktor.http.* import io.ktor.http.content.OutgoingContent import io.ktor.http.content.PartData -import kotlinx.serialization.UnstableDefault import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonConfiguration -import org.openapitools.client.apis.* -import org.openapitools.client.models.* import org.openapitools.client.auth.* open class ApiClient( private val baseUrl: String, httpClientEngine: HttpClientEngine?, - serializer: KotlinxSerializer) { + private val serializer: KotlinxSerializer +) { - @UseExperimental(UnstableDefault::class) constructor( baseUrl: String, httpClientEngine: HttpClientEngine?, - jsonConfiguration: JsonConfiguration) : - this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) - - private val serializer: JsonSerializer by lazy { - serializer.apply { setMappers(this) }.ignoreOutgoingContent() - } + jsonConfiguration: JsonConfiguration + ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) private val client: HttpClient by lazy { val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClient.serializer } val clientConfig: (HttpClientConfig<*>) -> Unit = { it.install(JsonFeature, jsonConfig) } httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig) } - private val authentications: kotlin.collections.Map<String, Authentication> by lazy { - mapOf( + private val authentications: Map<String, Authentication> = mapOf( "api_key" to ApiKeyAuth("header", "api_key"), - "petstore_auth" to OAuth()) - } + "petstore_auth" to OAuth() + ) + companion object { protected val UNSAFE_HEADERS = listOf(HttpHeaders.ContentType) - - private fun setMappers(serializer: KotlinxSerializer) { - - PetApi.setMappers(serializer) - - StoreApi.setMappers(serializer) - - UserApi.setMappers(serializer) - - serializer.setMapper(org.openapitools.client.models.ApiResponse::class, org.openapitools.client.models.ApiResponse.serializer()) - serializer.setMapper(org.openapitools.client.models.Category::class, org.openapitools.client.models.Category.serializer()) - serializer.setMapper(org.openapitools.client.models.Order::class, org.openapitools.client.models.Order.serializer()) - serializer.setMapper(org.openapitools.client.models.Pet::class, org.openapitools.client.models.Pet.serializer()) - serializer.setMapper(org.openapitools.client.models.Tag::class, org.openapitools.client.models.Tag.serializer()) - serializer.setMapper(org.openapitools.client.models.User::class, org.openapitools.client.models.User.serializer()) - } } /** @@ -78,7 +53,7 @@ open class ApiClient( * @param username Username */ fun setUsername(username: String) { - val auth = authentications?.values?.firstOrNull { it is HttpBasicAuth } as HttpBasicAuth? + val auth = authentications.values.firstOrNull { it is HttpBasicAuth } as HttpBasicAuth? ?: throw Exception("No HTTP basic authentication configured") auth.username = username } @@ -89,7 +64,7 @@ open class ApiClient( * @param password Password */ fun setPassword(password: String) { - val auth = authentications?.values?.firstOrNull { it is HttpBasicAuth } as HttpBasicAuth? + val auth = authentications.values.firstOrNull { it is HttpBasicAuth } as HttpBasicAuth? ?: throw Exception("No HTTP basic authentication configured") auth.password = password } @@ -101,7 +76,7 @@ open class ApiClient( * @param paramName The name of the API key parameter, or null or set the first key. */ fun setApiKey(apiKey: String, paramName: String? = null) { - val auth = authentications?.values?.firstOrNull { it is ApiKeyAuth && (paramName == null || paramName == it.paramName)} as ApiKeyAuth? + val auth = authentications.values.firstOrNull { it is ApiKeyAuth && (paramName == null || paramName == it.paramName)} as ApiKeyAuth? ?: throw Exception("No API key authentication configured") auth.apiKey = apiKey } @@ -113,7 +88,7 @@ open class ApiClient( * @param paramName The name of the API key parameter, or null or set the first key. */ fun setApiKeyPrefix(apiKeyPrefix: String, paramName: String? = null) { - val auth = authentications?.values?.firstOrNull { it is ApiKeyAuth && (paramName == null || paramName == it.paramName) } as ApiKeyAuth? + val auth = authentications.values.firstOrNull { it is ApiKeyAuth && (paramName == null || paramName == it.paramName) } as ApiKeyAuth? ?: throw Exception("No API key authentication configured") auth.apiKeyPrefix = apiKeyPrefix } @@ -124,7 +99,7 @@ open class ApiClient( * @param accessToken Access token */ fun setAccessToken(accessToken: String) { - val auth = authentications?.values?.firstOrNull { it is OAuth } as OAuth? + val auth = authentications.values.firstOrNull { it is OAuth } as OAuth? ?: throw Exception("No OAuth2 authentication configured") auth.accessToken = accessToken } @@ -135,36 +110,36 @@ open class ApiClient( * @param bearerToken The bearer token. */ fun setBearerToken(bearerToken: String) { - val auth = authentications?.values?.firstOrNull { it is HttpBearerAuth } as HttpBearerAuth? + val auth = authentications.values.firstOrNull { it is HttpBearerAuth } as HttpBearerAuth? ?: throw Exception("No Bearer authentication configured") auth.bearerToken = bearerToken } - protected suspend fun multipartFormRequest(requestConfig: RequestConfig, body: kotlin.collections.List<PartData>?, authNames: kotlin.collections.List<String>): HttpResponse { + protected suspend fun multipartFormRequest(requestConfig: RequestConfig, body: List<PartData>?, authNames: List<String>): HttpResponse { return request(requestConfig, MultiPartFormDataContent(body ?: listOf()), authNames) } - protected suspend fun urlEncodedFormRequest(requestConfig: RequestConfig, body: Parameters?, authNames: kotlin.collections.List<String>): HttpResponse { + protected suspend fun urlEncodedFormRequest(requestConfig: RequestConfig, body: Parameters?, authNames: List<String>): HttpResponse { return request(requestConfig, FormDataContent(body ?: Parameters.Empty), authNames) } - protected suspend fun jsonRequest(requestConfig: RequestConfig, body: Any? = null, authNames: kotlin.collections.List<String>): HttpResponse { + protected suspend fun jsonRequest(requestConfig: RequestConfig, body: Any? = null, authNames: List<String>): HttpResponse { val contentType = (requestConfig.headers[HttpHeaders.ContentType]?.let { ContentType.parse(it) } ?: ContentType.Application.Json) return if (body != null) request(requestConfig, serializer.write(body, contentType), authNames) else request(requestConfig, authNames = authNames) } - protected suspend fun request(requestConfig: RequestConfig, body: OutgoingContent = EmptyContent, authNames: kotlin.collections.List<String>): HttpResponse { + protected suspend fun request(requestConfig: RequestConfig, body: OutgoingContent = EmptyContent, authNames: List<String>): HttpResponse { requestConfig.updateForAuth(authNames) val headers = requestConfig.headers - return client.call { + return client.request { this.url { this.takeFrom(URLBuilder(baseUrl)) appendPath(requestConfig.path.trimStart('/').split('/')) requestConfig.query.forEach { query -> - query.value.forEach { value -> + query.value?.forEach { value -> parameter(query.key, value) } } @@ -174,17 +149,17 @@ open class ApiClient( if (requestConfig.method in listOf(RequestMethod.PUT, RequestMethod.POST, RequestMethod.PATCH)) this.body = body - }.response + } } - private fun RequestConfig.updateForAuth(authNames: kotlin.collections.List<String>) { + private fun RequestConfig.updateForAuth(authNames: List<String>) { for (authName in authNames) { - val auth = authentications?.get(authName) ?: throw Exception("Authentication undefined: $authName") + val auth = authentications[authName] ?: throw Exception("Authentication undefined: $authName") auth.apply(query, headers) } } - private fun URLBuilder.appendPath(components: kotlin.collections.List<String>): URLBuilder = apply { + private fun URLBuilder.appendPath(components: List<String>): URLBuilder = apply { encodedPath = encodedPath.trimEnd('/') + components.joinToString("/", prefix = "/") { it.encodeURLQueryComponent() } } @@ -199,13 +174,3 @@ open class ApiClient( RequestMethod.OPTIONS -> HttpMethod.Options } } - -// https://github.com/ktorio/ktor/issues/851 -private fun JsonSerializer.ignoreOutgoingContent() = IgnoreOutgoingContentJsonSerializer(this) - -private class IgnoreOutgoingContentJsonSerializer(private val delegate: JsonSerializer) : JsonSerializer by delegate { - override fun write(data: Any): OutgoingContent { - if (data is OutgoingContent) return data - return delegate.write(data) - } -} diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/Base64ByteArray.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt similarity index 75% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/Base64ByteArray.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt index 4bc1197cf00..6906d5a323a 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/Base64ByteArray.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt @@ -1,14 +1,13 @@ package org.openapitools.client.infrastructure import kotlinx.serialization.* -import kotlinx.serialization.internal.StringDescriptor @Serializable class Base64ByteArray(val value: ByteArray) { @Serializer(Base64ByteArray::class) companion object : KSerializer<Base64ByteArray> { - override val descriptor = StringDescriptor.withName("Base64ByteArray") - override fun serialize(encoder: Encoder, obj: Base64ByteArray) = encoder.encodeString(obj.value.encodeBase64()) + override val descriptor = PrimitiveDescriptor("Base64ByteArray", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: Base64ByteArray) = encoder.encodeString(value.value.encodeBase64()) override fun deserialize(decoder: Decoder) = Base64ByteArray(decoder.decodeString().decodeBase64Bytes()) } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/Bytes.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Bytes.kt similarity index 96% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/Bytes.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Bytes.kt index 8a222416cf2..43295604da7 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/Bytes.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Bytes.kt @@ -1,6 +1,6 @@ package org.openapitools.client.infrastructure -import kotlinx.io.core.* +import io.ktor.utils.io.core.* import kotlin.experimental.and private val digits = "0123456789abcdef".toCharArray() @@ -14,7 +14,7 @@ private fun ByteArray.clearFrom(from: Int) = (from until size).forEach { this[it private fun Int.toBase64(): Char = BASE64_ALPHABET[this] private fun Byte.fromBase64(): Byte = BASE64_INVERSE_ALPHABET[toInt() and 0xff].toByte() and BASE64_MASK internal fun ByteArray.encodeBase64(): String = buildPacket { writeFully(this@encodeBase64) }.encodeBase64() -internal fun String.decodeBase64Bytes(): ByteArray = buildPacket { writeStringUtf8(dropLastWhile { it == BASE64_PAD }) }.decodeBase64Bytes().readBytes() +internal fun String.decodeBase64Bytes(): ByteArray = buildPacket { writeText(dropLastWhile { it == BASE64_PAD }) }.decodeBase64Bytes().readBytes() /** * Encode [bytes] as a HEX string with no spaces, newlines and `0x` prefixes. diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/HttpResponse.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/HttpResponse.kt similarity index 54% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/HttpResponse.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/HttpResponse.kt index c457eb4bce0..2be6e02070f 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/HttpResponse.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/HttpResponse.kt @@ -4,8 +4,9 @@ import io.ktor.client.call.TypeInfo import io.ktor.client.call.typeInfo import io.ktor.http.Headers import io.ktor.http.isSuccess +import io.ktor.client.statement.HttpResponse as KtorHttpResponse -open class HttpResponse<T : Any>(val response: io.ktor.client.response.HttpResponse, val provider: BodyProvider<T>) { +open class HttpResponse<T : Any>(val response: KtorHttpResponse, val provider: BodyProvider<T>) { val status: Int = response.status.value val success: Boolean = response.status.isSuccess() val headers: Map<String, List<String>> = response.headers.mapEntries() @@ -22,29 +23,30 @@ open class HttpResponse<T : Any>(val response: io.ktor.client.response.HttpRespo } interface BodyProvider<T : Any> { - suspend fun body(response: io.ktor.client.response.HttpResponse): T - suspend fun <V : Any> typedBody(response: io.ktor.client.response.HttpResponse, type: TypeInfo): V + suspend fun body(response: KtorHttpResponse): T + suspend fun <V : Any> typedBody(response: KtorHttpResponse, type: TypeInfo): V } class TypedBodyProvider<T : Any>(private val type: TypeInfo) : BodyProvider<T> { @Suppress("UNCHECKED_CAST") - override suspend fun body(response: io.ktor.client.response.HttpResponse): T = - response.call.receive(type) as T + override suspend fun body(response: KtorHttpResponse): T = + response.call.receive(type) as T @Suppress("UNCHECKED_CAST") - override suspend fun <V : Any> typedBody(response: io.ktor.client.response.HttpResponse, type: TypeInfo): V = - response.call.receive(type) as V + override suspend fun <V : Any> typedBody(response: KtorHttpResponse, type: TypeInfo): V = + response.call.receive(type) as V } -class MappedBodyProvider<S : Any, T : Any>(private val provider: BodyProvider<S>, private val block: S.() -> T) : BodyProvider<T> { - override suspend fun body(response: io.ktor.client.response.HttpResponse): T = - block(provider.body(response)) +class MappedBodyProvider<S : Any, T : Any>(private val provider: BodyProvider<S>, private val block: S.() -> T) : + BodyProvider<T> { + override suspend fun body(response: KtorHttpResponse): T = + block(provider.body(response)) - override suspend fun <V : Any> typedBody(response: io.ktor.client.response.HttpResponse, type: TypeInfo): V = - provider.typedBody(response, type) + override suspend fun <V : Any> typedBody(response: KtorHttpResponse, type: TypeInfo): V = + provider.typedBody(response, type) } -inline fun <reified T : Any> io.ktor.client.response.HttpResponse.wrap(): HttpResponse<T> = +inline fun <reified T : Any> KtorHttpResponse.wrap(): HttpResponse<T> = HttpResponse(this, TypedBodyProvider(typeInfo<T>())) fun <T : Any, V : Any> HttpResponse<T>.map(block: T.() -> V): HttpResponse<V> = diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/OctetByteArray.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt similarity index 75% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/OctetByteArray.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt index 735e4e6e3f6..2ef5640587a 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/OctetByteArray.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt @@ -1,14 +1,13 @@ package org.openapitools.client.infrastructure import kotlinx.serialization.* -import kotlinx.serialization.internal.StringDescriptor @Serializable class OctetByteArray(val value: ByteArray) { @Serializer(OctetByteArray::class) companion object : KSerializer<OctetByteArray> { - override val descriptor = StringDescriptor.withName("OctetByteArray") - override fun serialize(encoder: Encoder, obj: OctetByteArray) = encoder.encodeString(hex(obj.value)) + override val descriptor = PrimitiveDescriptor("OctetByteArray", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OctetByteArray) = encoder.encodeString(hex(value.value)) override fun deserialize(decoder: Decoder) = OctetByteArray(hex(decoder.decodeString())) } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/RequestConfig.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt similarity index 77% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/RequestConfig.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt index 9c22257e223..7f1ca724fa9 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/RequestConfig.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt @@ -11,6 +11,6 @@ package org.openapitools.client.infrastructure data class RequestConfig( val method: RequestMethod, val path: String, - val headers: MutableMap<String, String> = mutableMapOf(), - val query: MutableMap<String, List<String>> = mutableMapOf() -) \ No newline at end of file + val headers: MutableMap<String, String?> = mutableMapOf(), + val query: MutableMap<String, List<String>?> = mutableMapOf() +) diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/RequestMethod.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestMethod.kt similarity index 100% rename from samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/infrastructure/RequestMethod.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestMethod.kt diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/ApiResponse.kt new file mode 100644 index 00000000000..b3003f6e160 --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/ApiResponse.kt @@ -0,0 +1,34 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.client.models + + +import kotlinx.serialization.* +import kotlin.collections.* + +/** + * Describes the result of uploading an image resource + * + * @param code + * @param type + * @param message + */ +@Serializable +data class ApiResponse( + @SerialName(value = "code") + val code: kotlin.Int? = null, + @SerialName(value = "type") + val type: kotlin.String? = null, + @SerialName(value = "message") + val message: kotlin.String? = null +) + diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Category.kt new file mode 100644 index 00000000000..429dd6646ee --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Category.kt @@ -0,0 +1,31 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.client.models + + +import kotlinx.serialization.* +import kotlin.collections.* + +/** + * A category for a pet + * + * @param id + * @param name + */ +@Serializable +data class Category( + @SerialName(value = "id") + val id: kotlin.Long? = null, + @SerialName(value = "name") + val name: kotlin.String? = null +) + diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Order.kt new file mode 100644 index 00000000000..13eaf0db4ae --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Order.kt @@ -0,0 +1,61 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.client.models + + +import kotlinx.serialization.* +import kotlin.collections.* + +/** + * An order for a pets from the pet store + * + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +@Serializable +data class Order( + @SerialName(value = "id") + val id: kotlin.Long? = null, + @SerialName(value = "petId") + val petId: kotlin.Long? = null, + @SerialName(value = "quantity") + val quantity: kotlin.Int? = null, + @SerialName(value = "shipDate") + val shipDate: kotlin.String? = null, + /** + * Order Status + */ + @SerialName(value = "status") + val status: Order.Status? = null, + @SerialName(value = "complete") + val complete: kotlin.Boolean? = null +) { + + /** + * Order Status + * + * Values: placed,approved,delivered + */ + enum class Status(val value: kotlin.String){ + @Json(name = "placed") placed("placed"), + @SerialName(value = "placed") placed("placed"), + @Json(name = "approved") approved("approved"), + @SerialName(value = "approved") approved("approved"), + @Json(name = "delivered") delivered("delivered"); + @SerialName(value = "delivered") delivered("delivered"); + } +} + diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Pet.kt new file mode 100644 index 00000000000..aa88e80b6ac --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Pet.kt @@ -0,0 +1,65 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.client.models + +import org.openapitools.client.models.Category +import org.openapitools.client.models.Tag + +import kotlinx.serialization.* +import kotlin.collections.* + +/** + * 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 + */ +@Serializable +data class Pet( + @SerialName(value = "name") + @Required + val name: kotlin.String, + @SerialName(value = "photoUrls") + @Required + val photoUrls: kotlin.collections.List<kotlin.String>, + @SerialName(value = "id") + val id: kotlin.Long? = null, + @SerialName(value = "category") + val category: Category? = null, + @SerialName(value = "tags") + val tags: kotlin.collections.List<Tag>? = null, + /** + * pet status in the store + */ + @SerialName(value = "status") + val status: Pet.Status? = null +) { + + /** + * pet status in the store + * + * Values: available,pending,sold + */ + enum class Status(val value: kotlin.String){ + @Json(name = "available") available("available"), + @SerialName(value = "available") available("available"), + @Json(name = "pending") pending("pending"), + @SerialName(value = "pending") pending("pending"), + @Json(name = "sold") sold("sold"); + @SerialName(value = "sold") sold("sold"); + } +} + diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Tag.kt new file mode 100644 index 00000000000..07f3f375167 --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Tag.kt @@ -0,0 +1,31 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.client.models + + +import kotlinx.serialization.* +import kotlin.collections.* + +/** + * A tag for a pet + * + * @param id + * @param name + */ +@Serializable +data class Tag( + @SerialName(value = "id") + val id: kotlin.Long? = null, + @SerialName(value = "name") + val name: kotlin.String? = null +) + diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/User.kt new file mode 100644 index 00000000000..fe47feb98a4 --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/User.kt @@ -0,0 +1,52 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.client.models + + +import kotlinx.serialization.* +import kotlin.collections.* + +/** + * 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 + */ +@Serializable +data class User( + @SerialName(value = "id") + val id: kotlin.Long? = null, + @SerialName(value = "username") + val username: kotlin.String? = null, + @SerialName(value = "firstName") + val firstName: kotlin.String? = null, + @SerialName(value = "lastName") + val lastName: kotlin.String? = null, + @SerialName(value = "email") + val email: kotlin.String? = null, + @SerialName(value = "password") + val password: kotlin.String? = null, + @SerialName(value = "phone") + val phone: kotlin.String? = null, + /** + * User Status + */ + @SerialName(value = "userStatus") + val userStatus: kotlin.Int? = null +) + diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/test/util/Coroutine.kt b/samples/client/petstore/kotlin-multiplatform/src/common/test/util/Coroutine.kt new file mode 100644 index 00000000000..841397635c1 --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/test/util/Coroutine.kt @@ -0,0 +1,23 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +package util + +import kotlinx.coroutines.CoroutineScope + +/** +* Block the current thread until execution of the given coroutine is complete. +* +* @param block The coroutine code. +* @return The result of the coroutine. +*/ +internal expect fun <T> runTest(block: suspend CoroutineScope.() -> T): T diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/ApiResponse.kt deleted file mode 100644 index a035628a8f9..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/ApiResponse.kt +++ /dev/null @@ -1,30 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ -package org.openapitools.client.models - - -import kotlinx.serialization.* -import kotlinx.serialization.internal.CommonEnumSerializer - -/** - * Describes the result of uploading an image resource - * @param code - * @param type - * @param message - */ -@Serializable -data class ApiResponse ( - @SerialName(value = "code") val code: kotlin.Int? = null, - @SerialName(value = "type") val type: kotlin.String? = null, - @SerialName(value = "message") val message: kotlin.String? = null -) - diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Category.kt deleted file mode 100644 index d5f9a45fd4d..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Category.kt +++ /dev/null @@ -1,28 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ -package org.openapitools.client.models - - -import kotlinx.serialization.* -import kotlinx.serialization.internal.CommonEnumSerializer - -/** - * A category for a pet - * @param id - * @param name - */ -@Serializable -data class Category ( - @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "name") val name: kotlin.String? = null -) - diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Order.kt deleted file mode 100644 index f1bd6ce4d0b..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Order.kt +++ /dev/null @@ -1,51 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ -package org.openapitools.client.models - - -import kotlinx.serialization.* -import kotlinx.serialization.internal.CommonEnumSerializer - -/** - * An order for a pets from the pet store - * @param id - * @param petId - * @param quantity - * @param shipDate - * @param status Order Status - * @param complete - */ -@Serializable -data class Order ( - @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "petId") val petId: kotlin.Long? = null, - @SerialName(value = "quantity") val quantity: kotlin.Int? = null, - @SerialName(value = "shipDate") val shipDate: kotlin.String? = null, - /* Order Status */ - @SerialName(value = "status") val status: Order.Status? = null, - @SerialName(value = "complete") val complete: kotlin.Boolean? = null -) { - - /** - * Order Status - * Values: placed,approved,delivered - */ - @Serializable(with = Status.Serializer::class) - enum class Status(val value: kotlin.String){ - placed("placed"), - approved("approved"), - delivered("delivered"); - - object Serializer : CommonEnumSerializer<Status>("Status", values(), values().map { it.value.toString() }.toTypedArray()) - } -} - diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt deleted file mode 100644 index 473cbaa959a..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt +++ /dev/null @@ -1,53 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ -package org.openapitools.client.models - -import org.openapitools.client.models.Category -import org.openapitools.client.models.Tag - -import kotlinx.serialization.* -import kotlinx.serialization.internal.CommonEnumSerializer - -/** - * 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 - */ -@Serializable -data class Pet ( - @SerialName(value = "name") @Required val name: kotlin.String, - @SerialName(value = "photoUrls") @Required val photoUrls: kotlin.collections.List<kotlin.String>, - @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "category") val category: Category? = null, - @SerialName(value = "tags") val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ - @SerialName(value = "status") val status: Pet.Status? = null -) { - - /** - * pet status in the store - * Values: available,pending,sold - */ - @Serializable(with = Status.Serializer::class) - enum class Status(val value: kotlin.String){ - available("available"), - pending("pending"), - sold("sold"); - - object Serializer : CommonEnumSerializer<Status>("Status", values(), values().map { it.value.toString() }.toTypedArray()) - } -} - diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Tag.kt deleted file mode 100644 index 6116e50d3f9..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Tag.kt +++ /dev/null @@ -1,28 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ -package org.openapitools.client.models - - -import kotlinx.serialization.* -import kotlinx.serialization.internal.CommonEnumSerializer - -/** - * A tag for a pet - * @param id - * @param name - */ -@Serializable -data class Tag ( - @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "name") val name: kotlin.String? = null -) - diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/User.kt deleted file mode 100644 index 97b53a049c1..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/User.kt +++ /dev/null @@ -1,41 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ -package org.openapitools.client.models - - -import kotlinx.serialization.* -import kotlinx.serialization.internal.CommonEnumSerializer - -/** - * 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 - */ -@Serializable -data class User ( - @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "username") val username: kotlin.String? = null, - @SerialName(value = "firstName") val firstName: kotlin.String? = null, - @SerialName(value = "lastName") val lastName: kotlin.String? = null, - @SerialName(value = "email") val email: kotlin.String? = null, - @SerialName(value = "password") val password: kotlin.String? = null, - @SerialName(value = "phone") val phone: kotlin.String? = null, - /* User Status */ - @SerialName(value = "userStatus") val userStatus: kotlin.Int? = null -) - diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonTest/kotlin/util/Coroutine.kt b/samples/client/petstore/kotlin-multiplatform/src/commonTest/kotlin/util/Coroutine.kt deleted file mode 100644 index fcff288bfef..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/commonTest/kotlin/util/Coroutine.kt +++ /dev/null @@ -1,23 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ - -package util - -import kotlinx.coroutines.CoroutineScope - -/** -* Block the current thread until execution of the given coroutine is complete. -* -* @param block The coroutine code. -* @return The result of the coroutine. -*/ -internal expect fun <T> runTest(block: suspend CoroutineScope.() -> T): T diff --git a/samples/client/petstore/kotlin-multiplatform/src/ios/test/util/Coroutine.kt b/samples/client/petstore/kotlin-multiplatform/src/ios/test/util/Coroutine.kt new file mode 100644 index 00000000000..d13344446fb --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/ios/test/util/Coroutine.kt @@ -0,0 +1,18 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +package util + +import kotlinx.coroutines.CoroutineScope +import kotlin.coroutines.EmptyCoroutineContext + +internal actual fun <T> runTest(block: suspend CoroutineScope.() -> T): T = kotlinx.coroutines.runBlocking(EmptyCoroutineContext, block) diff --git a/samples/client/petstore/kotlin-multiplatform/src/iosTest/kotlin/util/Coroutine.kt b/samples/client/petstore/kotlin-multiplatform/src/iosTest/kotlin/util/Coroutine.kt deleted file mode 100644 index b8b36f3f759..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/iosTest/kotlin/util/Coroutine.kt +++ /dev/null @@ -1,18 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ - -package util - -import kotlinx.coroutines.CoroutineScope -import kotlin.coroutines.EmptyCoroutineContext - -internal actual fun <T> runTest(block: suspend CoroutineScope.() -> T): T = kotlinx.coroutines.runBlocking(EmptyCoroutineContext, block) diff --git a/samples/client/petstore/kotlin-multiplatform/src/jsTest/kotlin/util/Coroutine.kt b/samples/client/petstore/kotlin-multiplatform/src/js/test/util/Coroutine.kt similarity index 100% rename from samples/client/petstore/kotlin-multiplatform/src/jsTest/kotlin/util/Coroutine.kt rename to samples/client/petstore/kotlin-multiplatform/src/js/test/util/Coroutine.kt diff --git a/samples/client/petstore/kotlin-multiplatform/src/jvm/test/util/Coroutine.kt b/samples/client/petstore/kotlin-multiplatform/src/jvm/test/util/Coroutine.kt new file mode 100644 index 00000000000..0976adca3ca --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/jvm/test/util/Coroutine.kt @@ -0,0 +1,19 @@ +/** + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +package util + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.runBlocking +import kotlin.coroutines.EmptyCoroutineContext + +internal actual fun <T> runTest(block: suspend CoroutineScope.() -> T): T = runBlocking(EmptyCoroutineContext, block) diff --git a/samples/client/petstore/kotlin-multiplatform/src/jvmTest/kotlin/util/Coroutine.kt b/samples/client/petstore/kotlin-multiplatform/src/jvmTest/kotlin/util/Coroutine.kt deleted file mode 100644 index b8b36f3f759..00000000000 --- a/samples/client/petstore/kotlin-multiplatform/src/jvmTest/kotlin/util/Coroutine.kt +++ /dev/null @@ -1,18 +0,0 @@ -/** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ - -package util - -import kotlinx.coroutines.CoroutineScope -import kotlin.coroutines.EmptyCoroutineContext - -internal actual fun <T> runTest(block: suspend CoroutineScope.() -> T): T = kotlinx.coroutines.runBlocking(EmptyCoroutineContext, block) diff --git a/samples/client/petstore/kotlin-nonpublic/README.md b/samples/client/petstore/kotlin-nonpublic/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-nonpublic/README.md +++ b/samples/client/petstore/kotlin-nonpublic/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-nonpublic/docs/Order.md b/samples/client/petstore/kotlin-nonpublic/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-nonpublic/docs/Order.md +++ b/samples/client/petstore/kotlin-nonpublic/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-nonpublic/docs/Pet.md b/samples/client/petstore/kotlin-nonpublic/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-nonpublic/docs/Pet.md +++ b/samples/client/petstore/kotlin-nonpublic/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-nonpublic/settings.gradle b/samples/client/petstore/kotlin-nonpublic/settings.gradle index b6d700d5a98..b12e60cec24 100644 --- a/samples/client/petstore/kotlin-nonpublic/settings.gradle +++ b/samples/client/petstore/kotlin-nonpublic/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-nonpublic' \ No newline at end of file +rootProject.name = 'kotlin-petstore-nonpublic' diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 5e930e96395..626ea070711 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 4f8898adf9b..56e7b38aa6f 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 725b36b0106..c7db5a7be87 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index a695278dfa3..87707bde443 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,32 +1,37 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -internal data class ApiResponse ( +internal data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Category.kt index 376994a9b25..2a9f9706f42 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -internal data class Category ( +internal data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Order.kt index a943b97c1ea..53124070fe6 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -24,27 +26,35 @@ import com.squareup.moshi.Json * @param complete */ -internal data class Order ( +internal data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ internal enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Pet.kt index 544fab20f5a..e93a4f71be5 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,23 +1,25 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category import org.openapitools.client.models.Tag import com.squareup.moshi.Json +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -26,27 +28,33 @@ import com.squareup.moshi.Json * @param status pet status in the store */ -internal data class Pet ( +internal data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ internal enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Tag.kt index d9b84e93eaf..e0bc38646b7 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -internal data class Tag ( +internal data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/User.kt index e0e821cd7e3..3d19f0f6cef 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -26,23 +28,33 @@ import com.squareup.moshi.Json * @param userStatus User Status */ -internal data class User ( +internal data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-nullable/README.md b/samples/client/petstore/kotlin-nullable/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-nullable/README.md +++ b/samples/client/petstore/kotlin-nullable/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-nullable/docs/Order.md b/samples/client/petstore/kotlin-nullable/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-nullable/docs/Order.md +++ b/samples/client/petstore/kotlin-nullable/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-nullable/docs/Pet.md b/samples/client/petstore/kotlin-nullable/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-nullable/docs/Pet.md +++ b/samples/client/petstore/kotlin-nullable/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-nullable/settings.gradle b/samples/client/petstore/kotlin-nullable/settings.gradle index 1022b496fed..229267927ec 100644 --- a/samples/client/petstore/kotlin-nullable/settings.gradle +++ b/samples/client/petstore/kotlin-nullable/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-nullable' \ No newline at end of file +rootProject.name = 'kotlin-petstore-nullable' diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 4b9faa2a2c4..900a6aff8e7 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index b9dd7b38f59..bc3501e7574 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 2ae5998489d..78829641794 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 7d40c8efbc2..6c517e812a3 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,33 +1,38 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Category.kt index ceb0fbc8fe6..9e3a630aff2 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Order.kt index ed8f8b13a43..cc54ab1c2a6 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -25,19 +27,27 @@ import java.io.Serializable * @param complete */ -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) : Serializable { companion object { @@ -45,10 +55,10 @@ data class Order ( } /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Pet.kt index 105f485f021..2268e104bd1 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category @@ -16,9 +16,11 @@ import org.openapitools.client.models.Tag import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -27,19 +29,25 @@ import java.io.Serializable * @param status pet status in the store */ -data class Pet ( +data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) : Serializable { companion object { @@ -47,10 +55,10 @@ data class Pet ( } /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Tag.kt index 944b1cd0a14..7b25720b83b 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/User.kt index 9697f07d5bf..e4732851b0c 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -27,23 +29,33 @@ import java.io.Serializable * @param userStatus User Status */ -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-okhttp3/README.md b/samples/client/petstore/kotlin-okhttp3/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-okhttp3/README.md +++ b/samples/client/petstore/kotlin-okhttp3/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-okhttp3/docs/Order.md b/samples/client/petstore/kotlin-okhttp3/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-okhttp3/docs/Order.md +++ b/samples/client/petstore/kotlin-okhttp3/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-okhttp3/docs/Pet.md b/samples/client/petstore/kotlin-okhttp3/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-okhttp3/docs/Pet.md +++ b/samples/client/petstore/kotlin-okhttp3/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-okhttp3/settings.gradle b/samples/client/petstore/kotlin-okhttp3/settings.gradle index a18186278ec..92b4e702619 100644 --- a/samples/client/petstore/kotlin-okhttp3/settings.gradle +++ b/samples/client/petstore/kotlin-okhttp3/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-okhttp3' \ No newline at end of file +rootProject.name = 'kotlin-petstore-okhttp3' diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 60f72b51af9..621943f0f01 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 08822c67e32..c42220e5f4c 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 258a2540e9e..df7073fbc88 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index fafca8738f6..36db4bcb996 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,32 +1,37 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Category.kt index a4c17c3b49d..653069f5198 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Order.kt index a66c335904e..bf6fb8a4d2c 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -24,27 +26,35 @@ import com.squareup.moshi.Json * @param complete */ -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Pet.kt index a3df06cb6eb..e800cb5f94f 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,23 +1,25 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category import org.openapitools.client.models.Tag import com.squareup.moshi.Json +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -26,27 +28,33 @@ import com.squareup.moshi.Json * @param status pet status in the store */ -data class Pet ( +data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Tag.kt index 6e619023a5c..f8b04268ae3 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/User.kt index af1e270325d..a8efdaeb5fe 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -26,23 +28,33 @@ import com.squareup.moshi.Json * @param userStatus User Status */ -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/README.md b/samples/client/petstore/kotlin-retrofit2-rx3/README.md index f374ed0b99f..a56262d04c2 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/README.md +++ b/samples/client/petstore/kotlin-retrofit2-rx3/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/docs/Order.md b/samples/client/petstore/kotlin-retrofit2-rx3/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/docs/Order.md +++ b/samples/client/petstore/kotlin-retrofit2-rx3/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/docs/Pet.md b/samples/client/petstore/kotlin-retrofit2-rx3/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/docs/Pet.md +++ b/samples/client/petstore/kotlin-retrofit2-rx3/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/settings.gradle b/samples/client/petstore/kotlin-retrofit2-rx3/settings.gradle index df63a0a713c..b24c7c5b8e4 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/settings.gradle +++ b/samples/client/petstore/kotlin-retrofit2-rx3/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-retrofit2-rx3' \ No newline at end of file +rootProject.name = 'kotlin-petstore-retrofit2-rx3' diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index fafca8738f6..36db4bcb996 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,32 +1,37 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Category.kt index a4c17c3b49d..653069f5198 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Order.kt index a66c335904e..bf6fb8a4d2c 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -24,27 +26,35 @@ import com.squareup.moshi.Json * @param complete */ -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Pet.kt index a3df06cb6eb..e800cb5f94f 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,23 +1,25 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category import org.openapitools.client.models.Tag import com.squareup.moshi.Json +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -26,27 +28,33 @@ import com.squareup.moshi.Json * @param status pet status in the store */ -data class Pet ( +data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Tag.kt index 6e619023a5c..f8b04268ae3 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/User.kt index af1e270325d..a8efdaeb5fe 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -26,23 +28,33 @@ import com.squareup.moshi.Json * @param userStatus User Status */ -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2/README.md b/samples/client/petstore/kotlin-retrofit2/README.md index f374ed0b99f..a56262d04c2 100644 --- a/samples/client/petstore/kotlin-retrofit2/README.md +++ b/samples/client/petstore/kotlin-retrofit2/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-retrofit2/docs/Order.md b/samples/client/petstore/kotlin-retrofit2/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin-retrofit2/docs/Order.md +++ b/samples/client/petstore/kotlin-retrofit2/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-retrofit2/docs/Pet.md b/samples/client/petstore/kotlin-retrofit2/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-retrofit2/docs/Pet.md +++ b/samples/client/petstore/kotlin-retrofit2/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-retrofit2/settings.gradle b/samples/client/petstore/kotlin-retrofit2/settings.gradle index 24c556e079c..01c60542d30 100644 --- a/samples/client/petstore/kotlin-retrofit2/settings.gradle +++ b/samples/client/petstore/kotlin-retrofit2/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-retrofit2' \ No newline at end of file +rootProject.name = 'kotlin-petstore-retrofit2' diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index fafca8738f6..36db4bcb996 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,32 +1,37 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Category.kt index a4c17c3b49d..653069f5198 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Order.kt index a66c335904e..bf6fb8a4d2c 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -24,27 +26,35 @@ import com.squareup.moshi.Json * @param complete */ -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Pet.kt index a3df06cb6eb..e800cb5f94f 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,23 +1,25 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category import org.openapitools.client.models.Tag import com.squareup.moshi.Json +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -26,27 +28,33 @@ import com.squareup.moshi.Json * @param status pet status in the store */ -data class Pet ( +data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Tag.kt index 6e619023a5c..f8b04268ae3 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/User.kt index af1e270325d..a8efdaeb5fe 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -26,23 +28,33 @@ import com.squareup.moshi.Json * @param userStatus User Status */ -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-string/README.md b/samples/client/petstore/kotlin-string/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-string/README.md +++ b/samples/client/petstore/kotlin-string/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-string/docs/Order.md b/samples/client/petstore/kotlin-string/docs/Order.md index 4683c14c1cb..25e712e4728 100644 --- a/samples/client/petstore/kotlin-string/docs/Order.md +++ b/samples/client/petstore/kotlin-string/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-string/docs/Pet.md b/samples/client/petstore/kotlin-string/docs/Pet.md index 73963abeb04..9d2211c363f 100644 --- a/samples/client/petstore/kotlin-string/docs/Pet.md +++ b/samples/client/petstore/kotlin-string/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-string/settings.gradle b/samples/client/petstore/kotlin-string/settings.gradle index 9699edc8713..9742263a6a2 100644 --- a/samples/client/petstore/kotlin-string/settings.gradle +++ b/samples/client/petstore/kotlin-string/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-string' \ No newline at end of file +rootProject.name = 'kotlin-petstore-string' diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index c95dd04f915..bdd47b48d45 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 08822c67e32..c42220e5f4c 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 258a2540e9e..df7073fbc88 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 7d40c8efbc2..6c517e812a3 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,33 +1,38 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Category.kt index ceb0fbc8fe6..9e3a630aff2 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Order.kt index ec768d1acef..76b50c94e98 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -25,19 +27,27 @@ import java.io.Serializable * @param complete */ -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: kotlin.String? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) : Serializable { companion object { @@ -45,10 +55,10 @@ data class Order ( } /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Pet.kt index 66667bf07cd..8e5fb9696c1 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category @@ -16,9 +16,11 @@ import org.openapitools.client.models.Tag import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param id * @param category * @param name @@ -27,19 +29,25 @@ import java.io.Serializable * @param status pet status in the store */ -data class Pet ( +data class Pet( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) : Serializable { companion object { @@ -47,10 +55,10 @@ data class Pet ( } /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Tag.kt index 944b1cd0a14..7b25720b83b 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/User.kt index 9697f07d5bf..e4732851b0c 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -27,23 +29,33 @@ import java.io.Serializable * @param userStatus User Status */ -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-threetenbp/README.md b/samples/client/petstore/kotlin-threetenbp/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin-threetenbp/README.md +++ b/samples/client/petstore/kotlin-threetenbp/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin-threetenbp/docs/Order.md b/samples/client/petstore/kotlin-threetenbp/docs/Order.md index 776e0ddc2f0..a7c1d9ae6bc 100644 --- a/samples/client/petstore/kotlin-threetenbp/docs/Order.md +++ b/samples/client/petstore/kotlin-threetenbp/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-threetenbp/docs/Pet.md b/samples/client/petstore/kotlin-threetenbp/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin-threetenbp/docs/Pet.md +++ b/samples/client/petstore/kotlin-threetenbp/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin-threetenbp/settings.gradle b/samples/client/petstore/kotlin-threetenbp/settings.gradle index 1f071e0d3ca..307a3980c2e 100644 --- a/samples/client/petstore/kotlin-threetenbp/settings.gradle +++ b/samples/client/petstore/kotlin-threetenbp/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-threetenbp' \ No newline at end of file +rootProject.name = 'kotlin-petstore-threetenbp' diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 60f72b51af9..621943f0f01 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 08822c67e32..c42220e5f4c 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 258a2540e9e..df7073fbc88 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index fafca8738f6..36db4bcb996 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,32 +1,37 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Category.kt index a4c17c3b49d..653069f5198 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Order.kt index 300f94d8545..c6dc56633d5 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -24,27 +26,35 @@ import com.squareup.moshi.Json * @param complete */ -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: org.threeten.bp.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) { /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Pet.kt index a3df06cb6eb..e800cb5f94f 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,23 +1,25 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category import org.openapitools.client.models.Tag import com.squareup.moshi.Json +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -26,27 +28,33 @@ import com.squareup.moshi.Json * @param status pet status in the store */ -data class Pet ( +data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) { /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Tag.kt index 6e619023a5c..f8b04268ae3 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,29 +1,33 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/User.kt index af1e270325d..a8efdaeb5fe 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,21 +1,23 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -26,23 +28,33 @@ import com.squareup.moshi.Json * @param userStatus User Status */ -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin/README.md b/samples/client/petstore/kotlin/README.md index 8166d4aadba..492b00fc1d8 100644 --- a/samples/client/petstore/kotlin/README.md +++ b/samples/client/petstore/kotlin/README.md @@ -28,7 +28,7 @@ This runs all tests and packages the library. * Some Kotlin and Java types are fully qualified to avoid conflicts with types defined in OpenAPI definitions. * Implementation of ApiClient is intended to reduce method counts, specifically to benefit Android targets. -<a name="documentation-for-api-endpoints"></a> +<a id="documentation-for-api-endpoints"></a> ## Documentation for API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* @@ -57,7 +57,7 @@ Class | Method | HTTP request | Description *UserApi* | [**updateUser**](docs/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user -<a name="documentation-for-models"></a> +<a id="documentation-for-models"></a> ## Documentation for Models - [org.openapitools.client.models.ApiResponse](docs/ApiResponse.md) @@ -68,17 +68,17 @@ Class | Method | HTTP request | Description - [org.openapitools.client.models.User](docs/User.md) -<a name="documentation-for-authorization"></a> +<a id="documentation-for-authorization"></a> ## Documentation for Authorization -<a name="api_key"></a> +<a id="api_key"></a> ### api_key - **Type**: API key - **API key parameter name**: api_key - **Location**: HTTP header -<a name="petstore_auth"></a> +<a id="petstore_auth"></a> ### petstore_auth - **Type**: OAuth diff --git a/samples/client/petstore/kotlin/docs/Order.md b/samples/client/petstore/kotlin/docs/Order.md index 5112f08958d..5044b96bb06 100644 --- a/samples/client/petstore/kotlin/docs/Order.md +++ b/samples/client/petstore/kotlin/docs/Order.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **complete** | **kotlin.Boolean** | | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin/docs/Pet.md b/samples/client/petstore/kotlin/docs/Pet.md index c82844b5ee8..665ecfa69c6 100644 --- a/samples/client/petstore/kotlin/docs/Pet.md +++ b/samples/client/petstore/kotlin/docs/Pet.md @@ -12,7 +12,7 @@ Name | Type | Description | Notes **status** | [**inline**](#StatusEnum) | pet status in the store | [optional] -<a name="StatusEnum"></a> +<a id="StatusEnum"></a> ## Enum: status Name | Value ---- | ----- diff --git a/samples/client/petstore/kotlin/settings.gradle b/samples/client/petstore/kotlin/settings.gradle index 7540d01de36..5a53369817d 100644 --- a/samples/client/petstore/kotlin/settings.gradle +++ b/samples/client/petstore/kotlin/settings.gradle @@ -1,2 +1 @@ - -rootProject.name = 'kotlin-petstore-client' \ No newline at end of file +rootProject.name = 'kotlin-petstore-client' diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/PetApi.kt index 60f72b51af9..621943f0f01 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/PetApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.ApiResponse diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt index 08822c67e32..c42220e5f4c 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/StoreApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.Order diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/UserApi.kt index 258a2540e9e..df7073fbc88 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/apis/UserApi.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.apis import org.openapitools.client.models.User diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 7d40c8efbc2..6c517e812a3 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -1,33 +1,38 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * Describes the result of uploading an image resource + * * @param code * @param type * @param message */ -data class ApiResponse ( +data class ApiResponse( @Json(name = "code") + val code: kotlin.Int? = null, @Json(name = "type") + val type: kotlin.String? = null, @Json(name = "message") + val message: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Category.kt index ceb0fbc8fe6..9e3a630aff2 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A category for a pet + * * @param id * @param name */ -data class Category ( +data class Category( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Order.kt index ed8f8b13a43..cc54ab1c2a6 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * An order for a pets from the pet store + * * @param id * @param petId * @param quantity @@ -25,19 +27,27 @@ import java.io.Serializable * @param complete */ -data class Order ( +data class Order( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "petId") + val petId: kotlin.Long? = null, @Json(name = "quantity") + val quantity: kotlin.Int? = null, @Json(name = "shipDate") + val shipDate: java.time.OffsetDateTime? = null, - /* Order Status */ + /** + * Order Status + */ @Json(name = "status") + val status: Order.Status? = null, @Json(name = "complete") + val complete: kotlin.Boolean? = null ) : Serializable { companion object { @@ -45,10 +55,10 @@ data class Order ( } /** - * Order Status - * Values: placed,approved,delivered - */ - + * Order Status + * + * Values: placed,approved,delivered + */ enum class Status(val value: kotlin.String){ @Json(name = "placed") placed("placed"), @Json(name = "approved") approved("approved"), diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Pet.kt index 105f485f021..2268e104bd1 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -1,14 +1,14 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import org.openapitools.client.models.Category @@ -16,9 +16,11 @@ import org.openapitools.client.models.Tag import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A pet for sale in the pet store + * * @param name * @param photoUrls * @param id @@ -27,19 +29,25 @@ import java.io.Serializable * @param status pet status in the store */ -data class Pet ( +data class Pet( @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "category") + val category: Category? = null, @Json(name = "tags") + val tags: kotlin.collections.List<Tag>? = null, - /* pet status in the store */ + /** + * pet status in the store + */ @Json(name = "status") + val status: Pet.Status? = null ) : Serializable { companion object { @@ -47,10 +55,10 @@ data class Pet ( } /** - * pet status in the store - * Values: available,pending,sold - */ - + * pet status in the store + * + * Values: available,pending,sold + */ enum class Status(val value: kotlin.String){ @Json(name = "available") available("available"), @Json(name = "pending") pending("pending"), diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Tag.kt index 944b1cd0a14..7b25720b83b 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -1,30 +1,34 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A tag for a pet + * * @param id * @param name */ -data class Tag ( +data class Tag( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "name") + val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/User.kt index 9697f07d5bf..e4732851b0c 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/User.kt @@ -1,22 +1,24 @@ /** -* OpenAPI Petstore -* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. -* -* The version of the OpenAPI document: 1.0.0 -* -* -* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). -* https://openapi-generator.tech -* Do not edit the class manually. -*/ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.models import com.squareup.moshi.Json import java.io.Serializable +import kotlin.collections.* /** * A User who is purchasing from the pet store + * * @param id * @param username * @param firstName @@ -27,23 +29,33 @@ import java.io.Serializable * @param userStatus User Status */ -data class User ( +data class User( @Json(name = "id") + val id: kotlin.Long? = null, @Json(name = "username") + val username: kotlin.String? = null, @Json(name = "firstName") + val firstName: kotlin.String? = null, @Json(name = "lastName") + val lastName: kotlin.String? = null, @Json(name = "email") + val email: kotlin.String? = null, @Json(name = "password") + val password: kotlin.String? = null, @Json(name = "phone") + val phone: kotlin.String? = null, - /* User Status */ + /** + * User Status + */ @Json(name = "userStatus") + val userStatus: kotlin.Int? = null ) : Serializable { companion object { -- GitLab From 49e6502630ffe10d2933bfcd343d6919d9927e15 Mon Sep 17 00:00:00 2001 From: Cromefire_ <cromefire_@outlook.com> Date: Sat, 8 Aug 2020 17:23:26 +0200 Subject: [PATCH 3/8] Resolved issues with queries, introduced bundled api client and resolved some minor issues --- .../languages/KotlinClientCodegen.java | 11 ++++- .../kotlin-client/data_class_opt_var.mustache | 4 +- .../multiplatform/ApiClient.kt.mustache | 17 +++++++ .../libraries/multiplatform/api.mustache | 44 ++++++++++------- .../multiplatform/auth/ApiKeyAuth.kt.mustache | 20 ++++---- .../auth/Authentication.kt.mustache | 8 ++-- .../auth/HttpBasicAuth.kt.mustache | 11 ++--- .../auth/HttpBearerAuth.kt.mustache | 6 ++- .../multiplatform/auth/OAuth.kt.mustache | 6 ++- .../multiplatform/build.gradle.kts.mustache | 41 +++++++++------- .../ApiAbstractions.kt.mustache | 47 +++++++++++++++++++ ....kt.mustache => ApiClientBase.kt.mustache} | 16 ++++--- .../infrastructure/RequestConfig.kt.mustache | 4 +- .../infrastructure/encoding.kt.mustache | 5 ++ 14 files changed, 170 insertions(+), 70 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/ApiClient.kt.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiAbstractions.kt.mustache rename modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/{ApiClient.kt.mustache => ApiClientBase.kt.mustache} (94%) create mode 100644 modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/encoding.kt.mustache diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java index e19250bcfae..39a6a7ab545 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java @@ -72,6 +72,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { // (mustache does not allow for boolean operators so we need this extra field) protected boolean doNotUseRxAndCoroutines = true; + protected String baseFolder; protected String authFolder; public enum DateLibrary { @@ -329,7 +330,8 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { // infrastructure destination folder final String infrastructureFolder = (sourceFolder + File.separator + packageName + File.separator + "infrastructure").replace(".", "/"); - authFolder = (sourceFolder + File.separator + packageName + File.separator + "auth").replace(".", "/"); + authFolder = (sourceFolder + File.separator + packageName + File.separator + "auth").replace(".", File.separator); + baseFolder = (sourceFolder + File.separator + packageName).replace(".", File.separator); // additional properties if (additionalProperties.containsKey(DATE_LIBRARY)) { @@ -498,6 +500,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { setLibrary(JVM_OKHTTP); // jvm specific supporting files + supportingFiles.add(new SupportingFile("infrastructure/ApiClient.kt.mustache", infrastructureFolder, "ApiClient.kt")); supportingFiles.add(new SupportingFile("infrastructure/ApplicationDelegates.kt.mustache", infrastructureFolder, "ApplicationDelegates.kt")); supportingFiles.add(new SupportingFile("infrastructure/Errors.kt.mustache", infrastructureFolder, "Errors.kt")); supportingFiles.add(new SupportingFile("infrastructure/ResponseExtensions.kt.mustache", infrastructureFolder, "ResponseExtensions.kt")); @@ -535,11 +538,16 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { importMapping.put("Base64ByteArray", packageName + ".infrastructure.Base64ByteArray"); importMapping.put("OctetByteArray", packageName + ".infrastructure.OctetByteArray"); + // bundled client file + supportingFiles.add(new SupportingFile("ApiClient.kt.mustache", baseFolder, "ApiClient.kt")); + // multiplatform specific supporting files + supportingFiles.add(new SupportingFile("infrastructure/ApiClientBase.kt.mustache", infrastructureFolder, "ApiClientBase.kt")); supportingFiles.add(new SupportingFile("infrastructure/Base64ByteArray.kt.mustache", infrastructureFolder, "Base64ByteArray.kt")); supportingFiles.add(new SupportingFile("infrastructure/Bytes.kt.mustache", infrastructureFolder, "Bytes.kt")); supportingFiles.add(new SupportingFile("infrastructure/HttpResponse.kt.mustache", infrastructureFolder, "HttpResponse.kt")); supportingFiles.add(new SupportingFile("infrastructure/OctetByteArray.kt.mustache", infrastructureFolder, "OctetByteArray.kt")); + supportingFiles.add(new SupportingFile("infrastructure/encoding.kt.mustache", infrastructureFolder, "encoding.kt")); // multiplatform specific auth supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.kt.mustache", authFolder, "ApiKeyAuth.kt")); @@ -564,7 +572,6 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { private void commonJvmMultiplatformSupportingFiles(String infrastructureFolder) { - supportingFiles.add(new SupportingFile("infrastructure/ApiClient.kt.mustache", infrastructureFolder, "ApiClient.kt")); supportingFiles.add(new SupportingFile("infrastructure/ApiAbstractions.kt.mustache", infrastructureFolder, "ApiAbstractions.kt")); supportingFiles.add(new SupportingFile("infrastructure/RequestConfig.kt.mustache", infrastructureFolder, "RequestConfig.kt")); supportingFiles.add(new SupportingFile("infrastructure/RequestMethod.kt.mustache", infrastructureFolder, "RequestMethod.kt")); diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache index c2cca54ff4d..1b58be900a6 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_opt_var.mustache @@ -14,8 +14,10 @@ @field:JsonProperty("{{{vendorExtensions.x-base-name-literal}}}") {{/jackson}} {{/multiplatform}} + {{#multiplatform}} + @SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") + {{/multiplatform}} {{#deprecated}} @Deprecated(message = "This property is deprecated.") {{/deprecated}} - {{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}} {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}List{{/isList}}{{^isList}}Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/ApiClient.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/ApiClient.kt.mustache new file mode 100644 index 00000000000..604e73132d8 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/ApiClient.kt.mustache @@ -0,0 +1,17 @@ +package {{packageName}} + +import io.ktor.client.engine.HttpClientEngine +import kotlinx.serialization.json.JsonConfiguration +import {{packageName}}.apis.* + +class ApiClient( + baseUrl: String = "{{{basePath}}}", + httpClientEngine: HttpClientEngine? = null, + jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable +) { + {{#apiInfo}} + {{#apis}} + val {{{classVarName}}} = {{{classFilename}}}(baseUrl, httpClientEngine, jsonConfiguration) + {{/apis}} + {{/apiInfo}} +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache index 9856348d370..a3a6b2aac60 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache @@ -21,8 +21,7 @@ import kotlinx.serialization.builtins.serializer baseUrl: kotlin.String = "{{{basePath}}}", httpClientEngine: HttpClientEngine? = null, serializer: KotlinxSerializer -) : ApiClient(baseUrl, httpClientEngine, serializer) { - +) : ApiClientBase(baseUrl, httpClientEngine, serializer) { constructor( baseUrl: String = "{{{basePath}}}", httpClientEngine: HttpClientEngine? = null, @@ -45,22 +44,22 @@ import kotlinx.serialization.builtins.serializer {{/allParams}} ): HttpResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}}> { {{! TODO: Optimize all the ?.let to only the places where it's needed }} - val localVariableAuthNames = listOf<String>({{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}}) + val authNames_ = listOf<String>({{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}}) - val localVariableBody = {{#hasBodyParam}}{{#bodyParam}}{{#isListContainer}}{{{paramName}}}?.let { {{operationIdCamelCase}}Request(it{{^isList}}.asList(){{/isList}}) }{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}{{{paramName}}}?.let { {{operationIdCamelCase}}Request(it) }{{/isMapContainer}}{{^isMapContainer}}{{{paramName}}}{{/isMapContainer}}{{/isListContainer}}{{/bodyParam}}{{/hasBodyParam}} + val body_ = {{#hasBodyParam}}{{#bodyParam}}{{#isListContainer}}{{^required}}{{{paramName}}}?.let { {{/required}}{{operationIdCamelCase}}Request({{{paramName}}}{{^isList}}.asList(){{/isList}}){{^required}} }{{/required}}{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}{{^required}}{{{paramName}}}?.let { {{/required}}{{operationIdCamelCase}}Request({{{paramName}}}){{^required}} }{{/required}}{{/isMapContainer}}{{^isMapContainer}}{{{paramName}}}{{/isMapContainer}}{{/isListContainer}}{{/bodyParam}}{{/hasBodyParam}} {{^hasBodyParam}} {{#hasFormParams}} {{#isMultipart}} formData { {{#formParams}} - {{{paramName}}}?.let { append(FormPart("{{{baseName}}}", it)) } + {{^required}}{{{paramName}}}?.let { {{/required}}append(FormPart("{{{baseName}}}", {{{paramName}}})){{^required}} }{{/required}} {{/formParams}} } {{/isMultipart}} {{^isMultipart}} ParametersBuilder().also { {{#formParams}} - {{{paramName}}}?.apply { it.append("{{{baseName}}}", {{{paramName}}}.toString()) } + {{^required}}{{{paramName}}}?.apply { {{/required}}it.append("{{{baseName}}}", {{{paramName}}}.toString()){{^required}} }{{/required}} {{/formParams}} }.build() {{/isMultipart}} @@ -71,29 +70,38 @@ import kotlinx.serialization.builtins.serializer {{/hasBodyParam}} {{! TODO: Don't use all the listOf() }} - val localVariableQuery = mutableMapOf<String, List<String>?>( - {{#queryParams}} - "{{baseName}}" to {{#isContainer}}{{{paramName}}}?.let { toMultiValue(it, "{{collectionFormat}}") }{{/isContainer}}{{^isContainer}}listOf("${{{paramName}}}"){{/isContainer}}{{#hasMore}},{{/hasMore}} - {{/queryParams}} - ) + val queries_ = Queries() + {{#queryParams}} + {{#isContainer}} + {{#isMapContainer}} + {{^required}}if ({{{paramName}}} != null) {{/required}}queries_.addMap({{{paramName}}}) + {{/isMapContainer}} + {{^isMapContainer}} + {{^required}}if ({{{paramName}}} != null) {{/required}}queries_.addMulti("{{baseName}}", {{{paramName}}}, "{{collectionFormat}}") + {{/isMapContainer}} + {{/isContainer}} + {{^isContainer}} + queries_.add("{{baseName}}", {{{paramName}}}) + {{/isContainer}} + {{/queryParams}} - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( {{#headerParams}} "{{baseName}}" to {{#isContainer}}{{{paramName}}}?.joinToString(separator = collectionDelimiter("{{collectionFormat}}")){{/isContainer}}{{^isContainer}}this?.toString(){{/isContainer}}{{#hasMore}},{{/hasMore}} {{/headerParams}} ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.{{httpMethod}}, "{{path}}"{{#pathParams}}.replace("{{curly true}}{{baseName}}{{curly}}", "${{{paramName}}}"){{/pathParams}}, - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return {{#hasBodyParam}}jsonRequest{{/hasBodyParam}}{{^hasBodyParam}}{{#hasFormParams}}{{#isMultipart}}multipartFormRequest{{/isMultipart}}{{^isMultipart}}urlEncodedFormRequest{{/isMultipart}}{{/hasFormParams}}{{^hasFormParams}}request{{/hasFormParams}}{{/hasBodyParam}}( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).{{#isListContainer}}wrap<{{operationIdCamelCase}}Response>().map { value{{^isList}}.toTypedArray(){{/isList}} }{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}wrap<{{operationIdCamelCase}}Response>().map { value }{{/isMapContainer}}{{^isMapContainer}}wrap(){{/isMapContainer}}{{/isListContainer}} } {{#hasBodyParam}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/ApiKeyAuth.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/ApiKeyAuth.kt.mustache index 05447201fb8..9141647d4a8 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/ApiKeyAuth.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/ApiKeyAuth.kt.mustache @@ -1,16 +1,18 @@ package {{packageName}}.auth -class ApiKeyAuth(private val location: String, val paramName: String) : Authentication { +import {{packageName}}.infrastructure.Queries + +{{#nonPublicApi}}internal {{/nonPublicApi}}class ApiKeyAuth(private val location: String, val paramName: String) : Authentication { var apiKey: String? = null var apiKeyPrefix: String? = null - override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { - val key: String = apiKey ?: return - val prefix: String? = apiKeyPrefix - val value: String = if (prefix != null) "$prefix $key" else key - when (location) { - "query" -> query[paramName] = listOf(value) - "header" -> headers[paramName] = value + override fun apply(queries: Queries, headers: MutableMap<String, String?>) { + val key: String = apiKey ?: return + val prefix: String? = apiKeyPrefix + val value: String = if (prefix != null) "$prefix $key" else key + when (location) { + "query" -> queries.add(paramName, value) + "header" -> headers[paramName] = value + } } - } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/Authentication.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/Authentication.kt.mustache index 4f7101a95f1..1873652b11b 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/Authentication.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/Authentication.kt.mustache @@ -1,11 +1,13 @@ package {{packageName}}.auth -interface Authentication { +import {{packageName}}.infrastructure.Queries + +{{#nonPublicApi}}internal {{/nonPublicApi}}interface Authentication { /** * Apply authentication settings to header and query params. * - * @param query Query parameters. + * @param queries Query parameters. * @param headers Header parameters. */ - fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) + fun apply(queries: Queries, headers: MutableMap<String, String?>) } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBasicAuth.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBasicAuth.kt.mustache index 3a8c5a76cc2..a9d6adabeab 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBasicAuth.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBasicAuth.kt.mustache @@ -1,17 +1,16 @@ package {{packageName}}.auth -import io.ktor.util.InternalAPI -import io.ktor.util.encodeBase64 +import {{packageName}}.infrastructure.Queries +import {{packageName}}.infrastructure.toBase64 -class HttpBasicAuth : Authentication { +{{#nonPublicApi}}internal {{/nonPublicApi}}class HttpBasicAuth : Authentication { var username: String? = null var password: String? = null - @InternalAPI - override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { + override fun apply(queries: Queries, headers: MutableMap<String, String?>) { if (username == null && password == null) return val str = (username ?: "") + ":" + (password ?: "") - val auth = str.encodeBase64() + val auth = str.toBase64() headers["Authorization"] = "Basic $auth" } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBearerAuth.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBearerAuth.kt.mustache index d7ac04766ee..55806037e25 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBearerAuth.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/HttpBearerAuth.kt.mustache @@ -1,9 +1,11 @@ package {{packageName}}.auth -class HttpBearerAuth(private val scheme: String?) : Authentication { +import {{packageName}}.infrastructure.Queries + +{{#nonPublicApi}}internal {{/nonPublicApi}}class HttpBearerAuth(private val scheme: String?) : Authentication { var bearerToken: String? = null - override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { + override fun apply(queries: Queries, headers: MutableMap<String, String?>) { val token: String = bearerToken ?: return headers["Authorization"] = (if (scheme != null) upperCaseBearer(scheme)!! + " " else "") + token } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/OAuth.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/OAuth.kt.mustache index 5d9ccf6bb97..b85b0226728 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/OAuth.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/auth/OAuth.kt.mustache @@ -1,9 +1,11 @@ package {{packageName}}.auth -class OAuth : Authentication { +import {{packageName}}.infrastructure.Queries + +{{#nonPublicApi}}internal {{/nonPublicApi}}class OAuth : Authentication { var accessToken: String? = null - override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { + override fun apply(queries: Queries, headers: MutableMap<String, String?>) { val token: String = accessToken ?: return headers["Authorization"] = "Bearer $token" } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache index dbc070fe6f1..49689446d70 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache @@ -6,8 +6,8 @@ plugins { group = "{{groupId}}" version = "{{artifactVersion}}" -val kotlin_version = "1.3.72" -val ktor_version = "1.3.2" +val ktorVersion = "1.3.2" +val kotlinxIoVersion = "0.1.16" repositories { jcenter() @@ -41,9 +41,10 @@ kotlin { dependencies { implementation(kotlin("stdlib-common")) - api("io.ktor:ktor-client-core:$ktor_version") - api("io.ktor:ktor-client-json:$ktor_version") - api("io.ktor:ktor-client-serialization:$ktor_version") + implementation("org.jetbrains.kotlinx:kotlinx-io:$kotlinxIoVersion") + api("io.ktor:ktor-client-core:$ktorVersion") + api("io.ktor:ktor-client-json:$ktorVersion") + api("io.ktor:ktor-client-serialization:$ktorVersion") } } @@ -53,7 +54,7 @@ kotlin { dependencies { implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common")) - implementation("io.ktor:ktor-client-mock:$ktor_version") + implementation("io.ktor:ktor-client-mock:$ktorVersion") } } @@ -62,9 +63,10 @@ kotlin { dependencies { implementation(kotlin("stdlib-jdk8")) - api("io.ktor:ktor-client-core-jvm:$ktor_version") - api("io.ktor:ktor-client-json-jvm:$ktor_version") - api("io.ktor:ktor-client-serialization-jvm:$ktor_version") + implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:$kotlinxIoVersion") + api("io.ktor:ktor-client-core-jvm:$ktorVersion") + api("io.ktor:ktor-client-json-jvm:$ktorVersion") + api("io.ktor:ktor-client-serialization-jvm:$ktorVersion") } } @@ -75,7 +77,7 @@ kotlin { implementation(kotlin("test")) implementation(kotlin("test-junit5")) implementation("org.junit.jupiter:junit-jupiter:5.6.2") - implementation("io.ktor:ktor-client-mock-jvm:$ktor_version") + implementation("io.ktor:ktor-client-mock-jvm:$ktorVersion") } } @@ -83,9 +85,11 @@ kotlin { kotlin.srcDir("src/ios/main") dependencies { - api("io.ktor:ktor-client-ios:$ktor_version") - api("io.ktor:ktor-client-json-native:$ktor_version") - api("io.ktor:ktor-client-serialization-native:$ktor_version") + implementation(kotlin("stdlib-native")) + implementation("org.jetbrains.kotlinx:kotlinx-io-native:$kotlinxIoVersion") + api("io.ktor:ktor-client-ios:$ktorVersion") + api("io.ktor:ktor-client-json-native:$ktorVersion") + api("io.ktor:ktor-client-serialization-native:$ktorVersion") } } @@ -93,7 +97,7 @@ kotlin { kotlin.srcDir("src/ios/test") dependencies { - implementation("io.ktor:ktor-client-mock-native:$ktor_version") + implementation("io.ktor:ktor-client-mock-native:$ktorVersion") } } @@ -102,9 +106,10 @@ kotlin { dependencies { implementation(kotlin("stdlib-js")) - api("io.ktor:ktor-client-js:$ktor_version") - api("io.ktor:ktor-client-json-js:$ktor_version") - api("io.ktor:ktor-client-serialization-js:$ktor_version") + implementation("org.jetbrains.kotlinx:kotlinx-io-js:$kotlinxIoVersion") + api("io.ktor:ktor-client-js:$ktorVersion") + api("io.ktor:ktor-client-json-js:$ktorVersion") + api("io.ktor:ktor-client-serialization-js:$ktorVersion") } } @@ -112,7 +117,7 @@ kotlin { kotlin.srcDir("src/js/test") dependencies { - implementation("io.ktor:ktor-client-mock-js:$ktor_version") + implementation("io.ktor:ktor-client-mock-js:$ktorVersion") } } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiAbstractions.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiAbstractions.kt.mustache new file mode 100644 index 00000000000..1197ae8c7e2 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiAbstractions.kt.mustache @@ -0,0 +1,47 @@ +package {{packageName}}.infrastructure + +{{#nonPublicApi}}internal {{/nonPublicApi}}fun collectionDelimiter(collectionFormat: String) = when(collectionFormat) { + "csv" -> "," + "tsv" -> "\t" + "pipe" -> "|" + "space" -> " " + else -> "" +} + +{{#nonPublicApi}}internal {{/nonPublicApi}}sealed class QueryParam { + data class Single(val value: String) : QueryParam() + data class Multi(val values: Iterable<String>) : QueryParam() +} + +{{#nonPublicApi}}internal {{/nonPublicApi}}class Queries(val queries: MutableMap<String, QueryParam> = mutableMapOf()) { + // Single + fun add(name: String, value: String?) { + if (value != null) { + queries[name] = QueryParam.Single(value) + } + } + + fun add(name: String, value: Any?) { + if (value != null) { + queries[name] = QueryParam.Single(value.toString()) + } + } + + // For Iterables + fun addMulti(name: String, values: Iterable<Any?>, collectionFormat: String) { + val transformed = values.filterNotNull().map { it.toString() } + queries[name] = when (collectionFormat) { + "multi" -> QueryParam.Multi(transformed) + else -> QueryParam.Single(transformed.joinToString(separator = collectionDelimiter(collectionFormat))) + } + } + + // For Arrays + fun addMulti(name: String, values: Array<Any?>, collectionFormat: String) = + addMulti(name, values.asIterable(), collectionFormat) + + // For Maps + fun addMap(values: Map<String, Any?>) { + queries.putAll(values.filterValues { it != null }.mapValues { QueryParam.Single(it.value.toString()) }) + } +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClientBase.kt.mustache similarity index 94% rename from modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache rename to modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClientBase.kt.mustache index 632b95c575f..8bf5368dff8 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClient.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClientBase.kt.mustache @@ -20,12 +20,11 @@ import kotlinx.serialization.json.JsonConfiguration import {{packageName}}.auth.* -{{#nonPublicApi}}internal {{/nonPublicApi}}open class ApiClient( +{{#nonPublicApi}}internal {{/nonPublicApi}}open class ApiClientBase( private val baseUrl: String, httpClientEngine: HttpClientEngine?, private val serializer: KotlinxSerializer ) { - constructor( baseUrl: String, httpClientEngine: HttpClientEngine?, @@ -33,7 +32,7 @@ import {{packageName}}.auth.* ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) private val client: HttpClient by lazy { - val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClient.serializer } + val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClientBase.serializer } val clientConfig: (HttpClientConfig<*>) -> Unit = { it.install(JsonFeature, jsonConfig) } httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig) } @@ -145,9 +144,12 @@ import {{packageName}}.auth.* this.url { this.takeFrom(URLBuilder(baseUrl)) appendPath(requestConfig.path.trimStart('/').split('/')) - requestConfig.query.forEach { query -> - query.value?.forEach { value -> - parameter(query.key, value) + for ((name, value) in requestConfig.queries.queries) { + when (value) { + is QueryParam.Single -> parameter(name, value.value) + is QueryParam.Multi -> value.values.forEach { + parameter(name, it) + } } } } @@ -162,7 +164,7 @@ import {{packageName}}.auth.* private fun RequestConfig.updateForAuth(authNames: List<String>) { for (authName in authNames) { val auth = authentications[authName] ?: throw Exception("Authentication undefined: $authName") - auth.apply(query, headers) + auth.apply(queries, headers) } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/RequestConfig.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/RequestConfig.kt.mustache index 56ca714971e..37b76a9bac4 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/RequestConfig.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/RequestConfig.kt.mustache @@ -5,12 +5,12 @@ package {{packageName}}.infrastructure * NOTE: This object doesn't include 'body' because it * allows for caching of the constructed object * for many request definitions. - * NOTE: Headers is a Map<String,String> because rfc2616 defines + * NOTE: Headers is a Map<String, String> because rfc2616 defines * multi-valued headers as csv-only. */ {{#nonPublicApi}}internal {{/nonPublicApi}}data class RequestConfig( val method: RequestMethod, val path: String, val headers: MutableMap<String, String?> = mutableMapOf(), - val query: MutableMap<String, List<String>?> = mutableMapOf() + val queries: Queries = Queries() ) diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/encoding.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/encoding.kt.mustache new file mode 100644 index 00000000000..1fddae2868f --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/encoding.kt.mustache @@ -0,0 +1,5 @@ +package {{packageName}}.infrastructure + +import kotlinx.io.core.toByteArray + +fun String.toBase64() = toByteArray().encodeBase64() -- GitLab From 50cf3a167a088e41f06e59a6bb97f0e01387ff21 Mon Sep 17 00:00:00 2001 From: Cromefire_ <cromefire_@outlook.com> Date: Sat, 8 Aug 2020 17:25:37 +0200 Subject: [PATCH 4/8] Updated samples --- .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../.openapi-generator/FILES | 4 +- .../kotlin-multiplatform/build.gradle.kts | 41 ++-- .../main/org/openapitools/client/ApiClient.kt | 15 ++ .../org/openapitools/client/apis/PetApi.kt | 179 +++++++++--------- .../org/openapitools/client/apis/StoreApi.kt | 87 ++++----- .../org/openapitools/client/apis/UserApi.kt | 175 ++++++++--------- .../openapitools/client/auth/ApiKeyAuth.kt | 18 +- .../client/auth/Authentication.kt | 6 +- .../openapitools/client/auth/HttpBasicAuth.kt | 9 +- .../client/auth/HttpBearerAuth.kt | 4 +- .../org/openapitools/client/auth/OAuth.kt | 4 +- .../client/infrastructure/ApiAbstractions.kt | 44 ++++- .../{ApiClient.kt => ApiClientBase.kt} | 16 +- .../client/infrastructure/RequestConfig.kt | 4 +- .../client/infrastructure/encoding.kt | 5 + .../openapitools/client/models/ApiResponse.kt | 6 +- .../openapitools/client/models/Category.kt | 4 +- .../org/openapitools/client/models/Order.kt | 12 +- .../org/openapitools/client/models/Pet.kt | 8 +- .../org/openapitools/client/models/Tag.kt | 4 +- .../org/openapitools/client/models/User.kt | 16 +- .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - .../openapitools/client/models/ApiResponse.kt | 3 - .../openapitools/client/models/Category.kt | 2 - .../org/openapitools/client/models/Order.kt | 6 - .../org/openapitools/client/models/Pet.kt | 4 - .../org/openapitools/client/models/Tag.kt | 2 - .../org/openapitools/client/models/User.kt | 8 - 99 files changed, 349 insertions(+), 637 deletions(-) create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/ApiClient.kt rename samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/{ApiClient.kt => ApiClientBase.kt} (94%) create mode 100644 samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/encoding.kt diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 6409c6cc0f3..a9839645123 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -25,13 +25,10 @@ import kotlin.collections.* data class ApiResponse( @SerializedName("code") - val code: kotlin.Int? = null, @SerializedName("type") - val type: kotlin.String? = null, @SerializedName("message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt index 65412f610b3..5924b79b155 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Category( @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Order.kt index 8375127110e..459785c81f8 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -28,25 +28,19 @@ import kotlin.collections.* data class Order( @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("petId") - val petId: kotlin.Long? = null, @SerializedName("quantity") - val quantity: kotlin.Int? = null, @SerializedName("shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @SerializedName("status") - val status: Order.Status? = null, @SerializedName("complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Pet.kt index e852fd3fa4d..da77e2c7872 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -34,19 +34,15 @@ data class Pet( @SerializedName("photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("category") - val category: Category? = null, @SerializedName("tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @SerializedName("status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Tag.kt index 380648dcd14..c87b45c7c86 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Tag( @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/User.kt index f84ff307825..8542cede784 100644 --- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/models/User.kt @@ -30,31 +30,23 @@ import kotlin.collections.* data class User( @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("username") - val username: kotlin.String? = null, @SerializedName("firstName") - val firstName: kotlin.String? = null, @SerializedName("lastName") - val lastName: kotlin.String? = null, @SerializedName("email") - val email: kotlin.String? = null, @SerializedName("password") - val password: kotlin.String? = null, @SerializedName("phone") - val phone: kotlin.String? = null, /** * User Status */ @SerializedName("userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index d188547f609..ad42c79cb68 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -25,13 +25,10 @@ import kotlin.collections.* data class ApiResponse( @field:JsonProperty("code") - val code: kotlin.Int? = null, @field:JsonProperty("type") - val type: kotlin.String? = null, @field:JsonProperty("message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Category.kt index 282700d3878..5cb50779756 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Category( @field:JsonProperty("id") - val id: kotlin.Long? = null, @field:JsonProperty("name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Order.kt index 9355bd6ac31..6efc679e7b2 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -28,25 +28,19 @@ import kotlin.collections.* data class Order( @field:JsonProperty("id") - val id: kotlin.Long? = null, @field:JsonProperty("petId") - val petId: kotlin.Long? = null, @field:JsonProperty("quantity") - val quantity: kotlin.Int? = null, @field:JsonProperty("shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @field:JsonProperty("status") - val status: Order.Status? = null, @field:JsonProperty("complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Pet.kt index f929547b0f3..5808c80b6cf 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -34,19 +34,15 @@ data class Pet( @field:JsonProperty("photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @field:JsonProperty("id") - val id: kotlin.Long? = null, @field:JsonProperty("category") - val category: Category? = null, @field:JsonProperty("tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @field:JsonProperty("status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Tag.kt index 106b57ab299..ffbb7f0955b 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Tag( @field:JsonProperty("id") - val id: kotlin.Long? = null, @field:JsonProperty("name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/User.kt index 15bdd07bfa2..fe416122d7f 100644 --- a/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-jackson/src/main/kotlin/org/openapitools/client/models/User.kt @@ -30,31 +30,23 @@ import kotlin.collections.* data class User( @field:JsonProperty("id") - val id: kotlin.Long? = null, @field:JsonProperty("username") - val username: kotlin.String? = null, @field:JsonProperty("firstName") - val firstName: kotlin.String? = null, @field:JsonProperty("lastName") - val lastName: kotlin.String? = null, @field:JsonProperty("email") - val email: kotlin.String? = null, @field:JsonProperty("password") - val password: kotlin.String? = null, @field:JsonProperty("phone") - val phone: kotlin.String? = null, /** * User Status */ @field:JsonProperty("userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 36db4bcb996..2f46a69fd3e 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -25,13 +25,10 @@ import kotlin.collections.* data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Category.kt index 653069f5198..e7fe5b52443 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Order.kt index bf6fb8a4d2c..63853cde7b0 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -28,25 +28,19 @@ import kotlin.collections.* data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Pet.kt index e800cb5f94f..fe32421ec09 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -34,19 +34,15 @@ data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Tag.kt index f8b04268ae3..d7b7334c9b2 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/User.kt index a8efdaeb5fe..faa11fc9e71 100644 --- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/models/User.kt @@ -30,31 +30,23 @@ import kotlin.collections.* data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index b477db1469e..195b2c34e45 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -26,13 +26,10 @@ import kotlin.collections.* data class ApiResponse( @SerializedName("code") - val code: kotlin.Int? = null, @SerializedName("type") - val type: kotlin.String? = null, @SerializedName("message") - val message: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Category.kt index b07978b706e..cf9fe898a3d 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -25,10 +25,8 @@ import kotlin.collections.* data class Category( @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("name") - val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Order.kt index 454fbcf9156..1ba287a1731 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -29,25 +29,19 @@ import kotlin.collections.* data class Order( @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("petId") - val petId: kotlin.Long? = null, @SerializedName("quantity") - val quantity: kotlin.Int? = null, @SerializedName("shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @SerializedName("status") - val status: Order.Status? = null, @SerializedName("complete") - val complete: kotlin.Boolean? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Pet.kt index ffcb6f11dcc..6222414ab91 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -35,19 +35,15 @@ data class Pet( @SerializedName("photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("category") - val category: Category? = null, @SerializedName("tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @SerializedName("status") - val status: Pet.Status? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Tag.kt index febd9eae081..708b6d47648 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -25,10 +25,8 @@ import kotlin.collections.* data class Tag( @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("name") - val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/User.kt index 0de0ad65eeb..dbb6b2ca364 100644 --- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/models/User.kt @@ -31,31 +31,23 @@ import kotlin.collections.* data class User( @SerializedName("id") - val id: kotlin.Long? = null, @SerializedName("username") - val username: kotlin.String? = null, @SerializedName("firstName") - val firstName: kotlin.String? = null, @SerializedName("lastName") - val lastName: kotlin.String? = null, @SerializedName("email") - val email: kotlin.String? = null, @SerializedName("password") - val password: kotlin.String? = null, @SerializedName("phone") - val phone: kotlin.String? = null, /** * User Status */ @SerializedName("userStatus") - val userStatus: kotlin.Int? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index e9f96bf1c99..0c4c0963797 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -26,13 +26,10 @@ import kotlin.collections.* @JsonClass(generateAdapter = true) data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Category.kt index 0fa0d400851..eee91ac9906 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -25,10 +25,8 @@ import kotlin.collections.* @JsonClass(generateAdapter = true) data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Order.kt index 5544a8f122c..27f142a13fa 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -29,25 +29,19 @@ import kotlin.collections.* @JsonClass(generateAdapter = true) data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Pet.kt index 1d4b7ebc2f3..f1fb3fbb862 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -35,19 +35,15 @@ data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Tag.kt index 4b382da5e4d..453a6d419be 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -25,10 +25,8 @@ import kotlin.collections.* @JsonClass(generateAdapter = true) data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/User.kt index 0a51a7fb86b..a6a8094f04c 100644 --- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/models/User.kt @@ -31,31 +31,23 @@ import kotlin.collections.* @JsonClass(generateAdapter = true) data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-multiplatform/.openapi-generator/FILES b/samples/client/petstore/kotlin-multiplatform/.openapi-generator/FILES index d14d905efe4..5fe12725ed2 100644 --- a/samples/client/petstore/kotlin-multiplatform/.openapi-generator/FILES +++ b/samples/client/petstore/kotlin-multiplatform/.openapi-generator/FILES @@ -15,6 +15,7 @@ gradle/wrapper/gradle-wrapper.properties gradlew gradlew.bat settings.gradle.kts +src/common/main/org/openapitools/client/ApiClient.kt src/common/main/org/openapitools/client/apis/PetApi.kt src/common/main/org/openapitools/client/apis/StoreApi.kt src/common/main/org/openapitools/client/apis/UserApi.kt @@ -24,13 +25,14 @@ src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt src/common/main/org/openapitools/client/auth/OAuth.kt src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt -src/common/main/org/openapitools/client/infrastructure/ApiClient.kt +src/common/main/org/openapitools/client/infrastructure/ApiClientBase.kt src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt src/common/main/org/openapitools/client/infrastructure/Bytes.kt src/common/main/org/openapitools/client/infrastructure/HttpResponse.kt src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt src/common/main/org/openapitools/client/infrastructure/RequestMethod.kt +src/common/main/org/openapitools/client/infrastructure/encoding.kt src/common/main/org/openapitools/client/models/ApiResponse.kt src/common/main/org/openapitools/client/models/Category.kt src/common/main/org/openapitools/client/models/Order.kt diff --git a/samples/client/petstore/kotlin-multiplatform/build.gradle.kts b/samples/client/petstore/kotlin-multiplatform/build.gradle.kts index 8093161799a..eff454c582b 100644 --- a/samples/client/petstore/kotlin-multiplatform/build.gradle.kts +++ b/samples/client/petstore/kotlin-multiplatform/build.gradle.kts @@ -6,8 +6,8 @@ plugins { group = "org.openapitools" version = "1.0.0" -val kotlin_version = "1.3.72" -val ktor_version = "1.3.2" +val ktorVersion = "1.3.2" +val kotlinxIoVersion = "0.1.16" repositories { jcenter() @@ -41,9 +41,10 @@ kotlin { dependencies { implementation(kotlin("stdlib-common")) - api("io.ktor:ktor-client-core:$ktor_version") - api("io.ktor:ktor-client-json:$ktor_version") - api("io.ktor:ktor-client-serialization:$ktor_version") + implementation("org.jetbrains.kotlinx:kotlinx-io:$kotlinxIoVersion") + api("io.ktor:ktor-client-core:$ktorVersion") + api("io.ktor:ktor-client-json:$ktorVersion") + api("io.ktor:ktor-client-serialization:$ktorVersion") } } @@ -53,7 +54,7 @@ kotlin { dependencies { implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common")) - implementation("io.ktor:ktor-client-mock:$ktor_version") + implementation("io.ktor:ktor-client-mock:$ktorVersion") } } @@ -62,9 +63,10 @@ kotlin { dependencies { implementation(kotlin("stdlib-jdk8")) - api("io.ktor:ktor-client-core-jvm:$ktor_version") - api("io.ktor:ktor-client-json-jvm:$ktor_version") - api("io.ktor:ktor-client-serialization-jvm:$ktor_version") + implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:$kotlinxIoVersion") + api("io.ktor:ktor-client-core-jvm:$ktorVersion") + api("io.ktor:ktor-client-json-jvm:$ktorVersion") + api("io.ktor:ktor-client-serialization-jvm:$ktorVersion") } } @@ -75,7 +77,7 @@ kotlin { implementation(kotlin("test")) implementation(kotlin("test-junit5")) implementation("org.junit.jupiter:junit-jupiter:5.6.2") - implementation("io.ktor:ktor-client-mock-jvm:$ktor_version") + implementation("io.ktor:ktor-client-mock-jvm:$ktorVersion") } } @@ -83,9 +85,11 @@ kotlin { kotlin.srcDir("src/ios/main") dependencies { - api("io.ktor:ktor-client-ios:$ktor_version") - api("io.ktor:ktor-client-json-native:$ktor_version") - api("io.ktor:ktor-client-serialization-native:$ktor_version") + implementation(kotlin("stdlib-native")) + implementation("org.jetbrains.kotlinx:kotlinx-io-native:$kotlinxIoVersion") + api("io.ktor:ktor-client-ios:$ktorVersion") + api("io.ktor:ktor-client-json-native:$ktorVersion") + api("io.ktor:ktor-client-serialization-native:$ktorVersion") } } @@ -93,7 +97,7 @@ kotlin { kotlin.srcDir("src/ios/test") dependencies { - implementation("io.ktor:ktor-client-mock-native:$ktor_version") + implementation("io.ktor:ktor-client-mock-native:$ktorVersion") } } @@ -102,9 +106,10 @@ kotlin { dependencies { implementation(kotlin("stdlib-js")) - api("io.ktor:ktor-client-js:$ktor_version") - api("io.ktor:ktor-client-json-js:$ktor_version") - api("io.ktor:ktor-client-serialization-js:$ktor_version") + implementation("org.jetbrains.kotlinx:kotlinx-io-js:$kotlinxIoVersion") + api("io.ktor:ktor-client-js:$ktorVersion") + api("io.ktor:ktor-client-json-js:$ktorVersion") + api("io.ktor:ktor-client-serialization-js:$ktorVersion") } } @@ -112,7 +117,7 @@ kotlin { kotlin.srcDir("src/js/test") dependencies { - implementation("io.ktor:ktor-client-mock-js:$ktor_version") + implementation("io.ktor:ktor-client-mock-js:$ktorVersion") } } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/ApiClient.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/ApiClient.kt new file mode 100644 index 00000000000..04bb940f5f4 --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/ApiClient.kt @@ -0,0 +1,15 @@ +package org.openapitools.client + +import io.ktor.client.engine.HttpClientEngine +import kotlinx.serialization.json.JsonConfiguration +import org.openapitools.client.apis.* + +class ApiClient( + baseUrl: String = "http://petstore.swagger.io/v2", + httpClientEngine: HttpClientEngine? = null, + jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable +) { + val pet = PetApi(baseUrl, httpClientEngine, jsonConfiguration) + val store = StoreApi(baseUrl, httpClientEngine, jsonConfiguration) + val user = UserApi(baseUrl, httpClientEngine, jsonConfiguration) +} diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt index 2a68d42db11..401b6374c0e 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt @@ -30,8 +30,7 @@ class PetApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, serializer: KotlinxSerializer -) : ApiClient(baseUrl, httpClientEngine, serializer) { - +) : ApiClientBase(baseUrl, httpClientEngine, serializer) { constructor( baseUrl: String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, @@ -47,27 +46,26 @@ class PetApi constructor( suspend fun addPet( body: Pet ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>("petstore_auth") + val authNames_ = listOf<String>("petstore_auth") - val localVariableBody = body + val body_ = body - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.POST, "/pet", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return jsonRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } @@ -83,29 +81,28 @@ class PetApi constructor( petId: kotlin.Long, apiKey: kotlin.String? = null ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>("petstore_auth") + val authNames_ = listOf<String>("petstore_auth") - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( "api_key" to this?.toString() ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.DELETE, "/pet/{petId}".replace("petId", "$petId"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -118,29 +115,28 @@ class PetApi constructor( suspend fun findPetsByStatus( status: kotlin.collections.List<kotlin.String> ): HttpResponse<kotlin.collections.List<Pet>> { - val localVariableAuthNames = listOf<String>("petstore_auth") + val authNames_ = listOf<String>("petstore_auth") - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - "status" to status?.let { toMultiValue(it, "csv") } - ) + val queries_ = Queries() + queries_.addMulti("status", status, "csv") - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.GET, "/pet/findByStatus", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap<FindPetsByStatusResponse>().map { value } } @Serializable @@ -166,29 +162,28 @@ class PetApi constructor( suspend fun findPetsByTags( tags: kotlin.collections.List<kotlin.String> ): HttpResponse<kotlin.collections.List<Pet>> { - val localVariableAuthNames = listOf<String>("petstore_auth") + val authNames_ = listOf<String>("petstore_auth") - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - "tags" to tags?.let { toMultiValue(it, "csv") } - ) + val queries_ = Queries() + queries_.addMulti("tags", tags, "csv") - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.GET, "/pet/findByTags", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap<FindPetsByTagsResponse>().map { value } } @Serializable @@ -214,28 +209,27 @@ class PetApi constructor( suspend fun getPetById( petId: kotlin.Long ): HttpResponse<Pet> { - val localVariableAuthNames = listOf<String>("api_key") + val authNames_ = listOf<String>("api_key") - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.GET, "/pet/{petId}".replace("petId", "$petId"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -247,27 +241,26 @@ class PetApi constructor( suspend fun updatePet( body: Pet ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>("petstore_auth") + val authNames_ = listOf<String>("petstore_auth") - val localVariableBody = body + val body_ = body - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.PUT, "/pet", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return jsonRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } @@ -285,31 +278,30 @@ class PetApi constructor( name: kotlin.String? = null, status: kotlin.String? = null ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>("petstore_auth") + val authNames_ = listOf<String>("petstore_auth") - val localVariableBody = + val body_ = ParametersBuilder().also { name?.apply { it.append("name", name.toString()) } status?.apply { it.append("status", status.toString()) } }.build() - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.POST, "/pet/{petId}".replace("petId", "$petId"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return urlEncodedFormRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -326,31 +318,30 @@ class PetApi constructor( additionalMetadata: kotlin.String? = null, file: io.ktor.client.request.forms.InputProvider? = null ): HttpResponse<ApiResponse> { - val localVariableAuthNames = listOf<String>("petstore_auth") + val authNames_ = listOf<String>("petstore_auth") - val localVariableBody = + val body_ = formData { - additionalMetadata?.let { append(FormPart("additionalMetadata", it)) } - file?.let { append(FormPart("file", it)) } + additionalMetadata?.let { append(FormPart("additionalMetadata", additionalMetadata)) } + file?.let { append(FormPart("file", file)) } } - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.POST, "/pet/{petId}/uploadImage".replace("petId", "$petId"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return multipartFormRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt index 34319c6d10f..865b44a5012 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt @@ -29,8 +29,7 @@ class StoreApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, serializer: KotlinxSerializer -) : ApiClient(baseUrl, httpClientEngine, serializer) { - +) : ApiClientBase(baseUrl, httpClientEngine, serializer) { constructor( baseUrl: String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, @@ -46,28 +45,27 @@ class StoreApi constructor( suspend fun deleteOrder( orderId: kotlin.String ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.DELETE, "/store/order/{orderId}".replace("orderId", "$orderId"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -78,28 +76,27 @@ class StoreApi constructor( @Suppress("UNCHECKED_CAST") suspend fun getInventory( ): HttpResponse<kotlin.collections.Map<kotlin.String, kotlin.Int>> { - val localVariableAuthNames = listOf<String>("api_key") + val authNames_ = listOf<String>("api_key") - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.GET, "/store/inventory", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap<GetInventoryResponse>().map { value } } @Serializable @@ -122,28 +119,27 @@ class StoreApi constructor( suspend fun getOrderById( orderId: kotlin.Long ): HttpResponse<Order> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.GET, "/store/order/{orderId}".replace("orderId", "$orderId"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -156,27 +152,26 @@ class StoreApi constructor( suspend fun placeOrder( body: Order ): HttpResponse<Order> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = body + val body_ = body - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.POST, "/store/order", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return jsonRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt index 677d7a85e25..5ea1dd47c93 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt @@ -29,8 +29,7 @@ class UserApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, serializer: KotlinxSerializer -) : ApiClient(baseUrl, httpClientEngine, serializer) { - +) : ApiClientBase(baseUrl, httpClientEngine, serializer) { constructor( baseUrl: String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, @@ -46,27 +45,26 @@ class UserApi constructor( suspend fun createUser( body: User ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = body + val body_ = body - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.POST, "/user", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return jsonRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } @@ -80,27 +78,26 @@ class UserApi constructor( suspend fun createUsersWithArrayInput( body: kotlin.collections.List<User> ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = body?.let { CreateUsersWithArrayInputRequest(it) } + val body_ = CreateUsersWithArrayInputRequest(body) - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.POST, "/user/createWithArray", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return jsonRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } @@ -126,27 +123,26 @@ class UserApi constructor( suspend fun createUsersWithListInput( body: kotlin.collections.List<User> ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = body?.let { CreateUsersWithListInputRequest(it) } + val body_ = CreateUsersWithListInputRequest(body) - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.POST, "/user/createWithList", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return jsonRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } @@ -172,28 +168,27 @@ class UserApi constructor( suspend fun deleteUser( username: kotlin.String ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.DELETE, "/user/{username}".replace("username", "$username"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -206,28 +201,27 @@ class UserApi constructor( suspend fun getUserByName( username: kotlin.String ): HttpResponse<User> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.GET, "/user/{username}".replace("username", "$username"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -242,30 +236,29 @@ class UserApi constructor( username: kotlin.String, password: kotlin.String ): HttpResponse<kotlin.String> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - "username" to listOf("$username"), - "password" to listOf("$password") - ) + val queries_ = Queries() + queries_.add("username", username) + queries_.add("password", password) - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.GET, "/user/login", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -275,28 +268,27 @@ class UserApi constructor( */ suspend fun logoutUser( ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = + val body_ = io.ktor.client.utils.EmptyContent - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.GET, "/user/logout", - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return request( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } /** @@ -310,27 +302,26 @@ class UserApi constructor( username: kotlin.String, body: User ): HttpResponse<Unit> { - val localVariableAuthNames = listOf<String>() + val authNames_ = listOf<String>() - val localVariableBody = body + val body_ = body - val localVariableQuery = mutableMapOf<String, List<String>?>( - ) + val queries_ = Queries() - val localVariableHeaders = mutableMapOf<String, String?>( + val headers_ = mutableMapOf<String, String?>( ) - val localVariableConfig = RequestConfig( + val config_ = RequestConfig( RequestMethod.PUT, "/user/{username}".replace("username", "$username"), - query = localVariableQuery, - headers = localVariableHeaders + queries = queries_, + headers = headers_ ) return jsonRequest( - localVariableConfig, - localVariableBody, - localVariableAuthNames + config_, + body_, + authNames_ ).wrap() } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/ApiKeyAuth.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/ApiKeyAuth.kt index 5393e5bb286..2eda3b4c837 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/ApiKeyAuth.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/ApiKeyAuth.kt @@ -1,16 +1,18 @@ package org.openapitools.client.auth +import org.openapitools.client.infrastructure.Queries + class ApiKeyAuth(private val location: String, val paramName: String) : Authentication { var apiKey: String? = null var apiKeyPrefix: String? = null - override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { - val key: String = apiKey ?: return - val prefix: String? = apiKeyPrefix - val value: String = if (prefix != null) "$prefix $key" else key - when (location) { - "query" -> query[paramName] = listOf(value) - "header" -> headers[paramName] = value + override fun apply(queries: Queries, headers: MutableMap<String, String?>) { + val key: String = apiKey ?: return + val prefix: String? = apiKeyPrefix + val value: String = if (prefix != null) "$prefix $key" else key + when (location) { + "query" -> queries.add(paramName, value) + "header" -> headers[paramName] = value + } } - } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/Authentication.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/Authentication.kt index 6abcf7c0a04..b96b9d7d5c7 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/Authentication.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/Authentication.kt @@ -1,11 +1,13 @@ package org.openapitools.client.auth +import org.openapitools.client.infrastructure.Queries + interface Authentication { /** * Apply authentication settings to header and query params. * - * @param query Query parameters. + * @param queries Query parameters. * @param headers Header parameters. */ - fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) + fun apply(queries: Queries, headers: MutableMap<String, String?>) } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt index c1ab3b59353..8df0175fe7a 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBasicAuth.kt @@ -1,17 +1,16 @@ package org.openapitools.client.auth -import io.ktor.util.InternalAPI -import io.ktor.util.encodeBase64 +import org.openapitools.client.infrastructure.Queries +import org.openapitools.client.infrastructure.toBase64 class HttpBasicAuth : Authentication { var username: String? = null var password: String? = null - @InternalAPI - override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { + override fun apply(queries: Queries, headers: MutableMap<String, String?>) { if (username == null && password == null) return val str = (username ?: "") + ":" + (password ?: "") - val auth = str.encodeBase64() + val auth = str.toBase64() headers["Authorization"] = "Basic $auth" } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt index 2a0df092dbf..b5de1bc19a5 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/HttpBearerAuth.kt @@ -1,9 +1,11 @@ package org.openapitools.client.auth +import org.openapitools.client.infrastructure.Queries + class HttpBearerAuth(private val scheme: String?) : Authentication { var bearerToken: String? = null - override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { + override fun apply(queries: Queries, headers: MutableMap<String, String?>) { val token: String = bearerToken ?: return headers["Authorization"] = (if (scheme != null) upperCaseBearer(scheme)!! + " " else "") + token } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/OAuth.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/OAuth.kt index 1c156c538ce..1fcb9c77229 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/OAuth.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/auth/OAuth.kt @@ -1,9 +1,11 @@ package org.openapitools.client.auth +import org.openapitools.client.infrastructure.Queries + class OAuth : Authentication { var accessToken: String? = null - override fun apply(query: MutableMap<String, List<String>?>, headers: MutableMap<String, String?>) { + override fun apply(queries: Queries, headers: MutableMap<String, String?>) { val token: String = accessToken ?: return headers["Authorization"] = "Bearer $token" } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt index ef7a8f1e1a6..f79709dfd56 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt @@ -1,7 +1,5 @@ package org.openapitools.client.infrastructure -typealias MultiValueMap = MutableMap<String,List<String>> - fun collectionDelimiter(collectionFormat: String) = when(collectionFormat) { "csv" -> "," "tsv" -> "\t" @@ -10,14 +8,40 @@ fun collectionDelimiter(collectionFormat: String) = when(collectionFormat) { else -> "" } -val defaultMultiValueConverter: (item: Any?) -> String = { item -> "$item" } +sealed class QueryParam { + data class Single(val value: String) : QueryParam() + data class Multi(val values: Iterable<String>) : QueryParam() +} -fun <T : Any?> toMultiValue(items: Array<T>, collectionFormat: String, map: (item: T) -> String = defaultMultiValueConverter) - = toMultiValue(items.asIterable(), collectionFormat, map) +class Queries(val queries: MutableMap<String, QueryParam> = mutableMapOf()) { + // Single + fun add(name: String, value: String?) { + if (value != null) { + queries[name] = QueryParam.Single(value) + } + } + + fun add(name: String, value: Any?) { + if (value != null) { + queries[name] = QueryParam.Single(value.toString()) + } + } -fun <T : Any?> toMultiValue(items: Iterable<T>, collectionFormat: String, map: (item: T) -> String = defaultMultiValueConverter): List<String> { - return when(collectionFormat) { - "multi" -> items.map(map) - else -> listOf(items.joinToString(separator = collectionDelimiter(collectionFormat), transform = map)) + // For Iterables + fun addMulti(name: String, values: Iterable<Any?>, collectionFormat: String) { + val transformed = values.filterNotNull().map { it.toString() } + queries[name] = when (collectionFormat) { + "multi" -> QueryParam.Multi(transformed) + else -> QueryParam.Single(transformed.joinToString(separator = collectionDelimiter(collectionFormat))) + } } -} \ No newline at end of file + + // For Arrays + fun addMulti(name: String, values: Array<Any?>, collectionFormat: String) = + addMulti(name, values.asIterable(), collectionFormat) + + // For Maps + fun addMap(values: Map<String, Any?>) { + queries.putAll(values.filterValues { it != null }.mapValues { QueryParam.Single(it.value.toString()) }) + } +} diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClient.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClientBase.kt similarity index 94% rename from samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClient.kt rename to samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClientBase.kt index ef2d89ea9d5..d538747a02c 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClient.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClientBase.kt @@ -20,12 +20,11 @@ import kotlinx.serialization.json.JsonConfiguration import org.openapitools.client.auth.* -open class ApiClient( +open class ApiClientBase( private val baseUrl: String, httpClientEngine: HttpClientEngine?, private val serializer: KotlinxSerializer ) { - constructor( baseUrl: String, httpClientEngine: HttpClientEngine?, @@ -33,7 +32,7 @@ open class ApiClient( ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) private val client: HttpClient by lazy { - val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClient.serializer } + val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClientBase.serializer } val clientConfig: (HttpClientConfig<*>) -> Unit = { it.install(JsonFeature, jsonConfig) } httpClientEngine?.let { HttpClient(it, clientConfig) } ?: HttpClient(clientConfig) } @@ -138,9 +137,12 @@ open class ApiClient( this.url { this.takeFrom(URLBuilder(baseUrl)) appendPath(requestConfig.path.trimStart('/').split('/')) - requestConfig.query.forEach { query -> - query.value?.forEach { value -> - parameter(query.key, value) + for ((name, value) in requestConfig.queries.queries) { + when (value) { + is QueryParam.Single -> parameter(name, value.value) + is QueryParam.Multi -> value.values.forEach { + parameter(name, it) + } } } } @@ -155,7 +157,7 @@ open class ApiClient( private fun RequestConfig.updateForAuth(authNames: List<String>) { for (authName in authNames) { val auth = authentications[authName] ?: throw Exception("Authentication undefined: $authName") - auth.apply(query, headers) + auth.apply(queries, headers) } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt index 7f1ca724fa9..e3583b9edfe 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/RequestConfig.kt @@ -5,12 +5,12 @@ package org.openapitools.client.infrastructure * NOTE: This object doesn't include 'body' because it * allows for caching of the constructed object * for many request definitions. - * NOTE: Headers is a Map<String,String> because rfc2616 defines + * NOTE: Headers is a Map<String, String> because rfc2616 defines * multi-valued headers as csv-only. */ data class RequestConfig( val method: RequestMethod, val path: String, val headers: MutableMap<String, String?> = mutableMapOf(), - val query: MutableMap<String, List<String>?> = mutableMapOf() + val queries: Queries = Queries() ) diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/encoding.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/encoding.kt new file mode 100644 index 00000000000..34af19afba5 --- /dev/null +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/encoding.kt @@ -0,0 +1,5 @@ +package org.openapitools.client.infrastructure + +import kotlinx.io.core.toByteArray + +fun String.toBase64() = toByteArray().encodeBase64() diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/ApiResponse.kt index b3003f6e160..559137b6157 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/ApiResponse.kt @@ -24,11 +24,11 @@ import kotlin.collections.* */ @Serializable data class ApiResponse( - @SerialName(value = "code") + @SerialName(value = "code") val code: kotlin.Int? = null, - @SerialName(value = "type") + @SerialName(value = "type") val type: kotlin.String? = null, - @SerialName(value = "message") + @SerialName(value = "message") val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Category.kt index 429dd6646ee..34d23d1bbe6 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Category.kt @@ -23,9 +23,9 @@ import kotlin.collections.* */ @Serializable data class Category( - @SerialName(value = "id") + @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "name") + @SerialName(value = "name") val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Order.kt index 13eaf0db4ae..a82a581e7e8 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Order.kt @@ -27,20 +27,20 @@ import kotlin.collections.* */ @Serializable data class Order( - @SerialName(value = "id") + @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "petId") + @SerialName(value = "petId") val petId: kotlin.Long? = null, - @SerialName(value = "quantity") + @SerialName(value = "quantity") val quantity: kotlin.Int? = null, - @SerialName(value = "shipDate") + @SerialName(value = "shipDate") val shipDate: kotlin.String? = null, /** * Order Status */ - @SerialName(value = "status") + @SerialName(value = "status") val status: Order.Status? = null, - @SerialName(value = "complete") + @SerialName(value = "complete") val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Pet.kt index aa88e80b6ac..53d66b54cae 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Pet.kt @@ -35,16 +35,16 @@ data class Pet( @SerialName(value = "photoUrls") @Required val photoUrls: kotlin.collections.List<kotlin.String>, - @SerialName(value = "id") + @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "category") + @SerialName(value = "category") val category: Category? = null, - @SerialName(value = "tags") + @SerialName(value = "tags") val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ - @SerialName(value = "status") + @SerialName(value = "status") val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Tag.kt index 07f3f375167..2aca7b098db 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/Tag.kt @@ -23,9 +23,9 @@ import kotlin.collections.* */ @Serializable data class Tag( - @SerialName(value = "id") + @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "name") + @SerialName(value = "name") val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/User.kt index fe47feb98a4..09cfe50c7f5 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/models/User.kt @@ -29,24 +29,24 @@ import kotlin.collections.* */ @Serializable data class User( - @SerialName(value = "id") + @SerialName(value = "id") val id: kotlin.Long? = null, - @SerialName(value = "username") + @SerialName(value = "username") val username: kotlin.String? = null, - @SerialName(value = "firstName") + @SerialName(value = "firstName") val firstName: kotlin.String? = null, - @SerialName(value = "lastName") + @SerialName(value = "lastName") val lastName: kotlin.String? = null, - @SerialName(value = "email") + @SerialName(value = "email") val email: kotlin.String? = null, - @SerialName(value = "password") + @SerialName(value = "password") val password: kotlin.String? = null, - @SerialName(value = "phone") + @SerialName(value = "phone") val phone: kotlin.String? = null, /** * User Status */ - @SerialName(value = "userStatus") + @SerialName(value = "userStatus") val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 87707bde443..aad4f0e01f0 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -25,13 +25,10 @@ import kotlin.collections.* internal data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Category.kt index 2a9f9706f42..cb45a5cc7c3 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -24,10 +24,8 @@ import kotlin.collections.* internal data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Order.kt index 53124070fe6..86305c78284 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -28,25 +28,19 @@ import kotlin.collections.* internal data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Pet.kt index e93a4f71be5..dd545eece84 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -34,19 +34,15 @@ internal data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Tag.kt index e0bc38646b7..295aeee7109 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -24,10 +24,8 @@ import kotlin.collections.* internal data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/User.kt index 3d19f0f6cef..f0339f39c43 100644 --- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/models/User.kt @@ -30,31 +30,23 @@ import kotlin.collections.* internal data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 6c517e812a3..4449603d2bc 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -26,13 +26,10 @@ import kotlin.collections.* data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Category.kt index 9e3a630aff2..9cd04452a72 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -25,10 +25,8 @@ import kotlin.collections.* data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Order.kt index cc54ab1c2a6..ccd49c6145b 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -29,25 +29,19 @@ import kotlin.collections.* data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Pet.kt index 2268e104bd1..28cb9742ec2 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -35,19 +35,15 @@ data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Tag.kt index 7b25720b83b..2670c541fbb 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -25,10 +25,8 @@ import kotlin.collections.* data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/User.kt index e4732851b0c..4f2256930bf 100644 --- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/models/User.kt @@ -31,31 +31,23 @@ import kotlin.collections.* data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 36db4bcb996..2f46a69fd3e 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -25,13 +25,10 @@ import kotlin.collections.* data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Category.kt index 653069f5198..e7fe5b52443 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Order.kt index bf6fb8a4d2c..63853cde7b0 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -28,25 +28,19 @@ import kotlin.collections.* data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Pet.kt index e800cb5f94f..fe32421ec09 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -34,19 +34,15 @@ data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Tag.kt index f8b04268ae3..d7b7334c9b2 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/User.kt index a8efdaeb5fe..faa11fc9e71 100644 --- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/models/User.kt @@ -30,31 +30,23 @@ import kotlin.collections.* data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 36db4bcb996..2f46a69fd3e 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -25,13 +25,10 @@ import kotlin.collections.* data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Category.kt index 653069f5198..e7fe5b52443 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Order.kt index bf6fb8a4d2c..63853cde7b0 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -28,25 +28,19 @@ import kotlin.collections.* data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Pet.kt index e800cb5f94f..fe32421ec09 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -34,19 +34,15 @@ data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Tag.kt index f8b04268ae3..d7b7334c9b2 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/User.kt index a8efdaeb5fe..faa11fc9e71 100644 --- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/models/User.kt @@ -30,31 +30,23 @@ import kotlin.collections.* data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 36db4bcb996..2f46a69fd3e 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -25,13 +25,10 @@ import kotlin.collections.* data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Category.kt index 653069f5198..e7fe5b52443 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Order.kt index bf6fb8a4d2c..63853cde7b0 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -28,25 +28,19 @@ import kotlin.collections.* data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Pet.kt index e800cb5f94f..fe32421ec09 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -34,19 +34,15 @@ data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Tag.kt index f8b04268ae3..d7b7334c9b2 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/User.kt index a8efdaeb5fe..faa11fc9e71 100644 --- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/models/User.kt @@ -30,31 +30,23 @@ import kotlin.collections.* data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 6c517e812a3..4449603d2bc 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -26,13 +26,10 @@ import kotlin.collections.* data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Category.kt index 9e3a630aff2..9cd04452a72 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -25,10 +25,8 @@ import kotlin.collections.* data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Order.kt index 76b50c94e98..bdb011f6c78 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -29,25 +29,19 @@ import kotlin.collections.* data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: kotlin.String? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Pet.kt index 8e5fb9696c1..388b62b6290 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -31,23 +31,19 @@ import kotlin.collections.* data class Pet( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "name") val name: kotlin.String, @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Tag.kt index 7b25720b83b..2670c541fbb 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -25,10 +25,8 @@ import kotlin.collections.* data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/User.kt index e4732851b0c..4f2256930bf 100644 --- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/models/User.kt @@ -31,31 +31,23 @@ import kotlin.collections.* data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 36db4bcb996..2f46a69fd3e 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -25,13 +25,10 @@ import kotlin.collections.* data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Category.kt index 653069f5198..e7fe5b52443 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Order.kt index c6dc56633d5..a4ad6377b69 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -28,25 +28,19 @@ import kotlin.collections.* data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: org.threeten.bp.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) { diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Pet.kt index e800cb5f94f..fe32421ec09 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -34,19 +34,15 @@ data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) { diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Tag.kt index f8b04268ae3..d7b7334c9b2 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -24,10 +24,8 @@ import kotlin.collections.* data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/User.kt index a8efdaeb5fe..faa11fc9e71 100644 --- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/models/User.kt @@ -30,31 +30,23 @@ import kotlin.collections.* data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt index 6c517e812a3..4449603d2bc 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/ApiResponse.kt @@ -26,13 +26,10 @@ import kotlin.collections.* data class ApiResponse( @Json(name = "code") - val code: kotlin.Int? = null, @Json(name = "type") - val type: kotlin.String? = null, @Json(name = "message") - val message: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Category.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Category.kt index 9e3a630aff2..9cd04452a72 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Category.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Category.kt @@ -25,10 +25,8 @@ import kotlin.collections.* data class Category( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Order.kt index cc54ab1c2a6..ccd49c6145b 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Order.kt @@ -29,25 +29,19 @@ import kotlin.collections.* data class Order( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "petId") - val petId: kotlin.Long? = null, @Json(name = "quantity") - val quantity: kotlin.Int? = null, @Json(name = "shipDate") - val shipDate: java.time.OffsetDateTime? = null, /** * Order Status */ @Json(name = "status") - val status: Order.Status? = null, @Json(name = "complete") - val complete: kotlin.Boolean? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Pet.kt index 2268e104bd1..28cb9742ec2 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Pet.kt @@ -35,19 +35,15 @@ data class Pet( @Json(name = "photoUrls") val photoUrls: kotlin.collections.List<kotlin.String>, @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "category") - val category: Category? = null, @Json(name = "tags") - val tags: kotlin.collections.List<Tag>? = null, /** * pet status in the store */ @Json(name = "status") - val status: Pet.Status? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Tag.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Tag.kt index 7b25720b83b..2670c541fbb 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Tag.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/Tag.kt @@ -25,10 +25,8 @@ import kotlin.collections.* data class Tag( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "name") - val name: kotlin.String? = null ) : Serializable { companion object { diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/User.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/User.kt index e4732851b0c..4f2256930bf 100644 --- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/User.kt +++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/models/User.kt @@ -31,31 +31,23 @@ import kotlin.collections.* data class User( @Json(name = "id") - val id: kotlin.Long? = null, @Json(name = "username") - val username: kotlin.String? = null, @Json(name = "firstName") - val firstName: kotlin.String? = null, @Json(name = "lastName") - val lastName: kotlin.String? = null, @Json(name = "email") - val email: kotlin.String? = null, @Json(name = "password") - val password: kotlin.String? = null, @Json(name = "phone") - val phone: kotlin.String? = null, /** * User Status */ @Json(name = "userStatus") - val userStatus: kotlin.Int? = null ) : Serializable { companion object { -- GitLab From 041924a8f4488668b6538eb53a0d41be8f739f0f Mon Sep 17 00:00:00 2001 From: Cromefire_ <cromefire_@outlook.com> Date: Thu, 13 Aug 2020 09:57:02 +0200 Subject: [PATCH 5/8] Revert changes on request parameterization --- .../kotlin-client/libraries/multiplatform/api.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache index a3a6b2aac60..dacc75e9b17 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache @@ -93,7 +93,7 @@ import kotlinx.serialization.builtins.serializer val config_ = RequestConfig( RequestMethod.{{httpMethod}}, - "{{path}}"{{#pathParams}}.replace("{{curly true}}{{baseName}}{{curly}}", "${{{paramName}}}"){{/pathParams}}, + "{{path}}"{{#pathParams}}.replace("{" + "{{baseName}}" + "}", "${{{paramName}}}"){{/pathParams}}, queries = queries_, headers = headers_ ) -- GitLab From b2c1548857ab6a28c2635b1ae3b10260f845d649 Mon Sep 17 00:00:00 2001 From: Cromefire_ <cromefire_@outlook.com> Date: Sun, 30 Aug 2020 00:09:15 +0200 Subject: [PATCH 6/8] Upgraded to Kotlin 1.4 and fixed minor issues --- .../languages/KotlinClientCodegen.java | 2 +- .../multiplatform/ApiClient.kt.mustache | 86 ++++++++++++++++++- .../libraries/multiplatform/api.mustache | 73 ++++++++-------- .../multiplatform/build.gradle.kts.mustache | 29 +++---- .../ApiAbstractions.kt.mustache | 4 + .../infrastructure/ApiClientBase.kt.mustache | 9 +- .../Base64ByteArray.kt.mustache | 23 +++-- .../infrastructure/Bytes.kt.mustache | 2 +- .../infrastructure/OctetByteArray.kt.mustache | 16 ++-- .../infrastructure/encoding.kt.mustache | 4 +- .../serial_wrapper_request_list.mustache | 14 +-- .../serial_wrapper_response_list.mustache | 14 +-- 12 files changed, 180 insertions(+), 96 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java index 39a6a7ab545..f376392238a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java @@ -526,7 +526,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen { typeMapping.put("object", "kotlin.String"); // kotlin.Any not serializable // multiplatform import mapping - importMapping.put("BigDecimal", "Double"); + importMapping.put("BigDecimal", "kotlin.Double"); importMapping.put("UUID", "kotlin.String"); importMapping.put("URI", "kotlin.String"); importMapping.put("InputProvider", "io.ktor.client.request.forms.InputProvider"); diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/ApiClient.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/ApiClient.kt.mustache index 604e73132d8..a2d30378070 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/ApiClient.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/ApiClient.kt.mustache @@ -1,17 +1,95 @@ package {{packageName}} import io.ktor.client.engine.HttpClientEngine -import kotlinx.serialization.json.JsonConfiguration +import kotlinx.serialization.json.Json import {{packageName}}.apis.* +import {{packageName}}.infrastructure.ApiClientBase -class ApiClient( +{{#nonPublicApi}}internal {{/nonPublicApi}}class ApiClient( baseUrl: String = "{{{basePath}}}", httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable + json: Json = Json {} ) { + {{! TODO: Remove backticks when conflicts are resolved }} {{#apiInfo}} {{#apis}} - val {{{classVarName}}} = {{{classFilename}}}(baseUrl, httpClientEngine, jsonConfiguration) + val `{{{classVarName}}}` = {{{classFilename}}}(baseUrl, httpClientEngine, json) {{/apis}} {{/apiInfo}} + + val allClients: Set<ApiClientBase> = setOf( + {{#apiInfo}} + {{#apis}} + `{{{classVarName}}}`, + {{/apis}} + {{/apiInfo}} + ) + + /** + * Set the username for the first HTTP basic authentication for all apis. + * + * @param username Username + */ + fun setUsername(username: String) { + for (client in allClients) { + client.setUsername(username) + } + } + + /** + * Set the password for the first HTTP basic authentication for all apis. + * + * @param password Password + */ + fun setPassword(password: String) { + for (client in allClients) { + client.setPassword(password) + } + } + + /** + * Set the API key value for the first API key authentication for all apis. + * + * @param apiKey API key + * @param paramName The name of the API key parameter, or null or set the first key. + */ + fun setApiKey(apiKey: String, paramName: String? = null) { + for (client in allClients) { + client.setApiKey(apiKey, paramName) + } + } + + /** + * Set the API key prefix for the first API key authentication for all apis. + * + * @param apiKeyPrefix API key prefix + * @param paramName The name of the API key parameter, or null or set the first key. + */ + fun setApiKeyPrefix(apiKeyPrefix: String, paramName: String? = null) { + for (client in allClients) { + client.setApiKeyPrefix(apiKeyPrefix, paramName) + } + } + + /** + * Set the access token for the first OAuth2 authentication for all apis. + * + * @param accessToken Access token + */ + fun setAccessToken(accessToken: String) { + for (client in allClients) { + client.setAccessToken(accessToken) + } + } + + /** + * Set the access token for the first Bearer authentication for all apis. + * + * @param bearerToken The bearer token. + */ + fun setBearerToken(bearerToken: String) { + for (client in allClients) { + client.setBearerToken(bearerToken) + } + } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache index dacc75e9b17..45f81b639a2 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache @@ -7,27 +7,26 @@ package {{apiPackage}} import {{packageName}}.infrastructure.* import io.ktor.client.request.forms.formData import io.ktor.client.engine.HttpClientEngine -import io.ktor.client.features.json.serializer.KotlinxSerializer import io.ktor.client.request.forms.FormPart +import io.ktor.client.utils.EmptyContent import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonConfiguration import io.ktor.http.ParametersBuilder -import kotlinx.serialization.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.list import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder {{#operations}} {{#nonPublicApi}}internal {{/nonPublicApi}}class {{classname}} constructor( baseUrl: kotlin.String = "{{{basePath}}}", httpClientEngine: HttpClientEngine? = null, - serializer: KotlinxSerializer -) : ApiClientBase(baseUrl, httpClientEngine, serializer) { - constructor( - baseUrl: String = "{{{basePath}}}", - httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable - ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) - + json: Json = Json {}, +) : ApiClientBase(baseUrl, httpClientEngine, json) { {{#operation}} /** * {{summary}} @@ -44,9 +43,9 @@ import kotlinx.serialization.builtins.serializer {{/allParams}} ): HttpResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}}> { {{! TODO: Optimize all the ?.let to only the places where it's needed }} - val authNames_ = listOf<String>({{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}}) + val authNamesOag = listOf<String>({{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}}) - val body_ = {{#hasBodyParam}}{{#bodyParam}}{{#isListContainer}}{{^required}}{{{paramName}}}?.let { {{/required}}{{operationIdCamelCase}}Request({{{paramName}}}{{^isList}}.asList(){{/isList}}){{^required}} }{{/required}}{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}{{^required}}{{{paramName}}}?.let { {{/required}}{{operationIdCamelCase}}Request({{{paramName}}}){{^required}} }{{/required}}{{/isMapContainer}}{{^isMapContainer}}{{{paramName}}}{{/isMapContainer}}{{/isListContainer}}{{/bodyParam}}{{/hasBodyParam}} + val bodyOag = {{#hasBodyParam}}{{#bodyParam}}{{#isListContainer}}{{^required}}{{{paramName}}}?.let { {{/required}}{{operationIdCamelCase}}Request({{{paramName}}}{{^isList}}.asList(){{/isList}}){{^required}} }{{/required}}{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}{{^required}}{{{paramName}}}?.let { {{/required}}{{operationIdCamelCase}}Request({{{paramName}}}){{^required}} }{{/required}}{{/isMapContainer}}{{^isMapContainer}}{{{paramName}}}{{/isMapContainer}}{{/isListContainer}}{{/bodyParam}}{{/hasBodyParam}} {{^hasBodyParam}} {{#hasFormParams}} {{#isMultipart}} @@ -65,43 +64,43 @@ import kotlinx.serialization.builtins.serializer {{/isMultipart}} {{/hasFormParams}} {{^hasFormParams}} - io.ktor.client.utils.EmptyContent + EmptyContent {{/hasFormParams}} {{/hasBodyParam}} - {{! TODO: Don't use all the listOf() }} - val queries_ = Queries() - {{#queryParams}} - {{#isContainer}} - {{#isMapContainer}} - {{^required}}if ({{{paramName}}} != null) {{/required}}queries_.addMap({{{paramName}}}) - {{/isMapContainer}} - {{^isMapContainer}} - {{^required}}if ({{{paramName}}} != null) {{/required}}queries_.addMulti("{{baseName}}", {{{paramName}}}, "{{collectionFormat}}") - {{/isMapContainer}} - {{/isContainer}} - {{^isContainer}} - queries_.add("{{baseName}}", {{{paramName}}}) - {{/isContainer}} - {{/queryParams}} + val queriesOag = Queries { + {{#queryParams}} + {{#isContainer}} + {{#isMapContainer}} + {{^required}}if ({{{paramName}}} != null) {{/required}}addMap({{{paramName}}}) + {{/isMapContainer}} + {{^isMapContainer}} + {{^required}}if ({{{paramName}}} != null) {{/required}}addMulti("{{baseName}}", {{{paramName}}}, "{{collectionFormat}}") + {{/isMapContainer}} + {{/isContainer}} + {{^isContainer}} + add("{{baseName}}", {{{paramName}}}) + {{/isContainer}} + {{/queryParams}} + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( {{#headerParams}} "{{baseName}}" to {{#isContainer}}{{{paramName}}}?.joinToString(separator = collectionDelimiter("{{collectionFormat}}")){{/isContainer}}{{^isContainer}}this?.toString(){{/isContainer}}{{#hasMore}},{{/hasMore}} {{/headerParams}} ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.{{httpMethod}}, - "{{path}}"{{#pathParams}}.replace("{" + "{{baseName}}" + "}", "${{{paramName}}}"){{/pathParams}}, - queries = queries_, - headers = headers_ + "{{path}}"{{#pathParams}}.replace("{" + "{{baseName}}" + "}", {{{paramName}}}.toString()){{/pathParams}}, + queries = queriesOag, + headers = headersOag ) return {{#hasBodyParam}}jsonRequest{{/hasBodyParam}}{{^hasBodyParam}}{{#hasFormParams}}{{#isMultipart}}multipartFormRequest{{/isMultipart}}{{^isMultipart}}urlEncodedFormRequest{{/isMultipart}}{{/hasFormParams}}{{^hasFormParams}}request{{/hasFormParams}}{{/hasBodyParam}}( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).{{#isListContainer}}wrap<{{operationIdCamelCase}}Response>().map { value{{^isList}}.toTypedArray(){{/isList}} }{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}wrap<{{operationIdCamelCase}}Response>().map { value }{{/isMapContainer}}{{^isMapContainer}}wrap(){{/isMapContainer}}{{/isListContainer}} } {{#hasBodyParam}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache index 49689446d70..863decf6562 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/build.gradle.kts.mustache @@ -1,13 +1,12 @@ plugins { - kotlin("multiplatform") version "1.3.72" - kotlin("plugin.serialization") version "1.3.72" + kotlin("multiplatform") version "1.4.0" + kotlin("plugin.serialization") version "1.4.0" } group = "{{groupId}}" version = "{{artifactVersion}}" -val ktorVersion = "1.3.2" -val kotlinxIoVersion = "0.1.16" +val ktorVersion = "1.4.0" repositories { jcenter() @@ -33,7 +32,10 @@ kotlin { } } } - js() + js(BOTH) { + browser() + nodejs() + } sourceSets { val commonMain by getting { @@ -41,7 +43,6 @@ kotlin { dependencies { implementation(kotlin("stdlib-common")) - implementation("org.jetbrains.kotlinx:kotlinx-io:$kotlinxIoVersion") api("io.ktor:ktor-client-core:$ktorVersion") api("io.ktor:ktor-client-json:$ktorVersion") api("io.ktor:ktor-client-serialization:$ktorVersion") @@ -63,10 +64,7 @@ kotlin { dependencies { implementation(kotlin("stdlib-jdk8")) - implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:$kotlinxIoVersion") api("io.ktor:ktor-client-core-jvm:$ktorVersion") - api("io.ktor:ktor-client-json-jvm:$ktorVersion") - api("io.ktor:ktor-client-serialization-jvm:$ktorVersion") } } @@ -77,6 +75,7 @@ kotlin { implementation(kotlin("test")) implementation(kotlin("test-junit5")) implementation("org.junit.jupiter:junit-jupiter:5.6.2") + implementation("io.ktor:ktor-client-apache:$ktorVersion") implementation("io.ktor:ktor-client-mock-jvm:$ktorVersion") } } @@ -86,10 +85,7 @@ kotlin { dependencies { implementation(kotlin("stdlib-native")) - implementation("org.jetbrains.kotlinx:kotlinx-io-native:$kotlinxIoVersion") api("io.ktor:ktor-client-ios:$ktorVersion") - api("io.ktor:ktor-client-json-native:$ktorVersion") - api("io.ktor:ktor-client-serialization-native:$ktorVersion") } } @@ -106,10 +102,7 @@ kotlin { dependencies { implementation(kotlin("stdlib-js")) - implementation("org.jetbrains.kotlinx:kotlinx-io-js:$kotlinxIoVersion") api("io.ktor:ktor-client-js:$ktorVersion") - api("io.ktor:ktor-client-json-js:$ktorVersion") - api("io.ktor:ktor-client-serialization-js:$ktorVersion") } } @@ -122,3 +115,9 @@ kotlin { } } } + +tasks { + named<Test>("jvmTest") { + useJUnitPlatform() + } +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiAbstractions.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiAbstractions.kt.mustache index 1197ae8c7e2..36f44ff217f 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiAbstractions.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiAbstractions.kt.mustache @@ -14,6 +14,10 @@ package {{packageName}}.infrastructure } {{#nonPublicApi}}internal {{/nonPublicApi}}class Queries(val queries: MutableMap<String, QueryParam> = mutableMapOf()) { + constructor(queries: MutableMap<String, QueryParam> = mutableMapOf(), config: Queries.() -> Unit): this(queries) { + config(this) + } + // Single fun add(name: String, value: String?) { if (value != null) { diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClientBase.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClientBase.kt.mustache index 8bf5368dff8..cf2c444566f 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClientBase.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/ApiClientBase.kt.mustache @@ -16,20 +16,15 @@ import io.ktor.http.* import io.ktor.http.content.OutgoingContent import io.ktor.http.content.PartData import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonConfiguration import {{packageName}}.auth.* {{#nonPublicApi}}internal {{/nonPublicApi}}open class ApiClientBase( private val baseUrl: String, httpClientEngine: HttpClientEngine?, - private val serializer: KotlinxSerializer + json: Json = Json {} ) { - constructor( - baseUrl: String, - httpClientEngine: HttpClientEngine?, - jsonConfiguration: JsonConfiguration - ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) + private val serializer = KotlinxSerializer(json) private val client: HttpClient by lazy { val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClientBase.serializer } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Base64ByteArray.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Base64ByteArray.kt.mustache index 14ff8ddf45d..d8042c19f76 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Base64ByteArray.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Base64ByteArray.kt.mustache @@ -1,14 +1,21 @@ package {{packageName}}.infrastructure -import kotlinx.serialization.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder -@Serializable -class Base64ByteArray(val value: ByteArray) { - @Serializer(Base64ByteArray::class) +@Serializable(with = Base64ByteArray.Companion::class) +{{#nonPublicApi}}internal {{/nonPublicApi}}class Base64ByteArray(val value: ByteArray) { companion object : KSerializer<Base64ByteArray> { - override val descriptor = PrimitiveDescriptor("Base64ByteArray", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: Base64ByteArray) = encoder.encodeString(value.value.encodeBase64()) - override fun deserialize(decoder: Decoder) = Base64ByteArray(decoder.decodeString().decodeBase64Bytes()) + override val descriptor = PrimitiveSerialDescriptor("Base64ByteArray", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: Base64ByteArray): Unit = + encoder.encodeString(value.value.encodeBase64()) + + override fun deserialize(decoder: Decoder): Base64ByteArray = + Base64ByteArray(decoder.decodeString().decodeBase64Bytes()) } override fun equals(other: Any?): Boolean { @@ -25,4 +32,4 @@ class Base64ByteArray(val value: ByteArray) { override fun toString(): String { return "Base64ByteArray(${hex(value)})" } -} \ No newline at end of file +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Bytes.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Bytes.kt.mustache index dc30e36dcc1..7cd7d14721d 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Bytes.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/Bytes.kt.mustache @@ -32,7 +32,7 @@ internal fun hex(bytes: ByteArray): String { result[resultIndex++] = digits[b and 0x0f] } - return String(result) + return result.concatToString() } /** diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/OctetByteArray.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/OctetByteArray.kt.mustache index 3ba3b74be0c..d6c10d8e516 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/OctetByteArray.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/OctetByteArray.kt.mustache @@ -1,12 +1,16 @@ package {{packageName}}.infrastructure -import kotlinx.serialization.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder -@Serializable -class OctetByteArray(val value: ByteArray) { - @Serializer(OctetByteArray::class) +@Serializable(with = OctetByteArray.Companion::class) +{{#nonPublicApi}}internal {{/nonPublicApi}}class OctetByteArray(val value: ByteArray) { companion object : KSerializer<OctetByteArray> { - override val descriptor = PrimitiveDescriptor("OctetByteArray", PrimitiveKind.STRING) + override val descriptor = PrimitiveSerialDescriptor("OctetByteArray", PrimitiveKind.STRING) override fun serialize(encoder: Encoder, value: OctetByteArray) = encoder.encodeString(hex(value.value)) override fun deserialize(decoder: Decoder) = OctetByteArray(hex(decoder.decodeString())) } @@ -25,4 +29,4 @@ class OctetByteArray(val value: ByteArray) { override fun toString(): String { return "OctetByteArray(${hex(value)})" } -} \ No newline at end of file +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/encoding.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/encoding.kt.mustache index 1fddae2868f..2ec8b39e353 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/encoding.kt.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/infrastructure/encoding.kt.mustache @@ -1,5 +1,3 @@ package {{packageName}}.infrastructure -import kotlinx.io.core.toByteArray - -fun String.toBase64() = toByteArray().encodeBase64() +fun String.toBase64() = encodeToByteArray().encodeBase64() diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_list.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_list.mustache index d637b98683b..c387cdcaa18 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_list.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_request_list.mustache @@ -1,13 +1,13 @@ - @Serializable + @Serializable(with = {{operationIdCamelCase}}Request.Companion::class) private class {{operationIdCamelCase}}Request(val value: List<{{#bodyParam}}{{baseType}}{{/bodyParam}}>) { - @Serializer({{operationIdCamelCase}}Request::class) {{#nonPublicApi}}internal {{/nonPublicApi}}companion object : KSerializer<{{operationIdCamelCase}}Request> { - private val serializer = {{#bodyParam}}{{baseType}}{{/bodyParam}}.serializer().list - override val descriptor = PrimitiveDescriptor("{{operationIdCamelCase}}Request", PrimitiveKind.STRING) + private val serializer = ListSerializer({{#bodyParam}}{{baseType}}{{/bodyParam}}.serializer()) + override val descriptor = PrimitiveSerialDescriptor("{{operationIdCamelCase}}Request", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: {{operationIdCamelCase}}Request) = + override fun serialize(encoder: Encoder, value: {{operationIdCamelCase}}Request): Unit = serializer.serialize(encoder, value.value) - override fun deserialize(decoder: Decoder) = {{operationIdCamelCase}}Request(serializer.deserialize(decoder)) + override fun deserialize(decoder: Decoder): {{operationIdCamelCase}}Request = + {{operationIdCamelCase}}Request(serializer.deserialize(decoder)) } - } \ No newline at end of file + } diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_list.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_list.mustache index c3ba3adce3d..b12a8a18434 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_list.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/serial_wrapper_response_list.mustache @@ -1,13 +1,13 @@ - @Serializable + @Serializable(with = {{operationIdCamelCase}}Response.Companion::class) private class {{operationIdCamelCase}}Response(val value: List<{{returnBaseType}}>) { - @Serializer({{operationIdCamelCase}}Response::class) {{#nonPublicApi}}internal {{/nonPublicApi}}companion object : KSerializer<{{operationIdCamelCase}}Response> { - private val serializer = {{returnBaseType}}.serializer().list - override val descriptor = PrimitiveDescriptor("{{operationIdCamelCase}}Response", PrimitiveKind.STRING) + private val serializer = ListSerializer({{returnBaseType}}.serializer()) + override val descriptor = PrimitiveSerialDescriptor("{{operationIdCamelCase}}Response", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: {{operationIdCamelCase}}Response) = + override fun serialize(encoder: Encoder, value: {{operationIdCamelCase}}Response): Unit = serializer.serialize(encoder, value.value) - override fun deserialize(decoder: Decoder) = {{operationIdCamelCase}}Response(serializer.deserialize(decoder)) + override fun deserialize(decoder: Decoder): {{operationIdCamelCase}}Response = + {{operationIdCamelCase}}Response(serializer.deserialize(decoder)) } - } \ No newline at end of file + } -- GitLab From aababfb32730d01c801b3d9185a4fd3dc32414ce Mon Sep 17 00:00:00 2001 From: Cromefire_ <cromefire_@outlook.com> Date: Sun, 30 Aug 2020 01:46:36 +0200 Subject: [PATCH 7/8] Updated sample --- .../kotlin-multiplatform/build.gradle.kts | 29 ++- .../main/org/openapitools/client/ApiClient.kt | 85 ++++++- .../org/openapitools/client/apis/PetApi.kt | 235 +++++++++--------- .../org/openapitools/client/apis/StoreApi.kt | 115 ++++----- .../org/openapitools/client/apis/UserApi.kt | 233 ++++++++--------- .../client/infrastructure/ApiAbstractions.kt | 4 + .../client/infrastructure/ApiClientBase.kt | 9 +- .../client/infrastructure/Base64ByteArray.kt | 21 +- .../client/infrastructure/Bytes.kt | 2 +- .../client/infrastructure/OctetByteArray.kt | 14 +- .../client/infrastructure/encoding.kt | 4 +- 11 files changed, 427 insertions(+), 324 deletions(-) diff --git a/samples/client/petstore/kotlin-multiplatform/build.gradle.kts b/samples/client/petstore/kotlin-multiplatform/build.gradle.kts index eff454c582b..67d8bdfbeb9 100644 --- a/samples/client/petstore/kotlin-multiplatform/build.gradle.kts +++ b/samples/client/petstore/kotlin-multiplatform/build.gradle.kts @@ -1,13 +1,12 @@ plugins { - kotlin("multiplatform") version "1.3.72" - kotlin("plugin.serialization") version "1.3.72" + kotlin("multiplatform") version "1.4.0" + kotlin("plugin.serialization") version "1.4.0" } group = "org.openapitools" version = "1.0.0" -val ktorVersion = "1.3.2" -val kotlinxIoVersion = "0.1.16" +val ktorVersion = "1.4.0" repositories { jcenter() @@ -33,7 +32,10 @@ kotlin { } } } - js() + js(BOTH) { + browser() + nodejs() + } sourceSets { val commonMain by getting { @@ -41,7 +43,6 @@ kotlin { dependencies { implementation(kotlin("stdlib-common")) - implementation("org.jetbrains.kotlinx:kotlinx-io:$kotlinxIoVersion") api("io.ktor:ktor-client-core:$ktorVersion") api("io.ktor:ktor-client-json:$ktorVersion") api("io.ktor:ktor-client-serialization:$ktorVersion") @@ -63,10 +64,7 @@ kotlin { dependencies { implementation(kotlin("stdlib-jdk8")) - implementation("org.jetbrains.kotlinx:kotlinx-io-jvm:$kotlinxIoVersion") api("io.ktor:ktor-client-core-jvm:$ktorVersion") - api("io.ktor:ktor-client-json-jvm:$ktorVersion") - api("io.ktor:ktor-client-serialization-jvm:$ktorVersion") } } @@ -77,6 +75,7 @@ kotlin { implementation(kotlin("test")) implementation(kotlin("test-junit5")) implementation("org.junit.jupiter:junit-jupiter:5.6.2") + implementation("io.ktor:ktor-client-apache:$ktorVersion") implementation("io.ktor:ktor-client-mock-jvm:$ktorVersion") } } @@ -86,10 +85,7 @@ kotlin { dependencies { implementation(kotlin("stdlib-native")) - implementation("org.jetbrains.kotlinx:kotlinx-io-native:$kotlinxIoVersion") api("io.ktor:ktor-client-ios:$ktorVersion") - api("io.ktor:ktor-client-json-native:$ktorVersion") - api("io.ktor:ktor-client-serialization-native:$ktorVersion") } } @@ -106,10 +102,7 @@ kotlin { dependencies { implementation(kotlin("stdlib-js")) - implementation("org.jetbrains.kotlinx:kotlinx-io-js:$kotlinxIoVersion") api("io.ktor:ktor-client-js:$ktorVersion") - api("io.ktor:ktor-client-json-js:$ktorVersion") - api("io.ktor:ktor-client-serialization-js:$ktorVersion") } } @@ -122,3 +115,9 @@ kotlin { } } } + +tasks { + named<Test>("jvmTest") { + useJUnitPlatform() + } +} diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/ApiClient.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/ApiClient.kt index 04bb940f5f4..6a75c16160a 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/ApiClient.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/ApiClient.kt @@ -1,15 +1,90 @@ package org.openapitools.client import io.ktor.client.engine.HttpClientEngine -import kotlinx.serialization.json.JsonConfiguration +import kotlinx.serialization.json.Json import org.openapitools.client.apis.* +import org.openapitools.client.infrastructure.ApiClientBase class ApiClient( baseUrl: String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable + json: Json = Json {} ) { - val pet = PetApi(baseUrl, httpClientEngine, jsonConfiguration) - val store = StoreApi(baseUrl, httpClientEngine, jsonConfiguration) - val user = UserApi(baseUrl, httpClientEngine, jsonConfiguration) + val `pet` = PetApi(baseUrl, httpClientEngine, json) + val `store` = StoreApi(baseUrl, httpClientEngine, json) + val `user` = UserApi(baseUrl, httpClientEngine, json) + + val allClients: Set<ApiClientBase> = setOf( + `pet`, + `store`, + `user`, + ) + + /** + * Set the username for the first HTTP basic authentication for all apis. + * + * @param username Username + */ + fun setUsername(username: String) { + for (client in allClients) { + client.setUsername(username) + } + } + + /** + * Set the password for the first HTTP basic authentication for all apis. + * + * @param password Password + */ + fun setPassword(password: String) { + for (client in allClients) { + client.setPassword(password) + } + } + + /** + * Set the API key value for the first API key authentication for all apis. + * + * @param apiKey API key + * @param paramName The name of the API key parameter, or null or set the first key. + */ + fun setApiKey(apiKey: String, paramName: String? = null) { + for (client in allClients) { + client.setApiKey(apiKey, paramName) + } + } + + /** + * Set the API key prefix for the first API key authentication for all apis. + * + * @param apiKeyPrefix API key prefix + * @param paramName The name of the API key parameter, or null or set the first key. + */ + fun setApiKeyPrefix(apiKeyPrefix: String, paramName: String? = null) { + for (client in allClients) { + client.setApiKeyPrefix(apiKeyPrefix, paramName) + } + } + + /** + * Set the access token for the first OAuth2 authentication for all apis. + * + * @param accessToken Access token + */ + fun setAccessToken(accessToken: String) { + for (client in allClients) { + client.setAccessToken(accessToken) + } + } + + /** + * Set the access token for the first Bearer authentication for all apis. + * + * @param bearerToken The bearer token. + */ + fun setBearerToken(bearerToken: String) { + for (client in allClients) { + client.setBearerToken(bearerToken) + } + } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt index 401b6374c0e..14bfb666545 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/PetApi.kt @@ -17,26 +17,25 @@ import org.openapitools.client.models.Pet import org.openapitools.client.infrastructure.* import io.ktor.client.request.forms.formData import io.ktor.client.engine.HttpClientEngine -import io.ktor.client.features.json.serializer.KotlinxSerializer import io.ktor.client.request.forms.FormPart +import io.ktor.client.utils.EmptyContent import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonConfiguration import io.ktor.http.ParametersBuilder -import kotlinx.serialization.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.list import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder class PetApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, - serializer: KotlinxSerializer -) : ApiClientBase(baseUrl, httpClientEngine, serializer) { - constructor( - baseUrl: String = "http://petstore.swagger.io/v2", - httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable - ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) - + json: Json = Json {}, +) : ApiClientBase(baseUrl, httpClientEngine, json) { /** * Add a new pet to the store * @@ -46,26 +45,27 @@ class PetApi constructor( suspend fun addPet( body: Pet ): HttpResponse<Unit> { - val authNames_ = listOf<String>("petstore_auth") + val authNamesOag = listOf<String>("petstore_auth") - val body_ = body + val bodyOag = body - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.POST, "/pet", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return jsonRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } @@ -81,28 +81,29 @@ class PetApi constructor( petId: kotlin.Long, apiKey: kotlin.String? = null ): HttpResponse<Unit> { - val authNames_ = listOf<String>("petstore_auth") + val authNamesOag = listOf<String>("petstore_auth") - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( "api_key" to this?.toString() ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.DELETE, - "/pet/{petId}".replace("petId", "$petId"), - queries = queries_, - headers = headers_ + "/pet/{petId}".replace("{" + "petId" + "}", petId.toString()), + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -115,43 +116,45 @@ class PetApi constructor( suspend fun findPetsByStatus( status: kotlin.collections.List<kotlin.String> ): HttpResponse<kotlin.collections.List<Pet>> { - val authNames_ = listOf<String>("petstore_auth") + val authNamesOag = listOf<String>("petstore_auth") - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() - queries_.addMulti("status", status, "csv") + val queriesOag = Queries { + addMulti("status", status, "csv") + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.GET, "/pet/findByStatus", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap<FindPetsByStatusResponse>().map { value } } - @Serializable + @Serializable(with = FindPetsByStatusResponse.Companion::class) private class FindPetsByStatusResponse(val value: List<Pet>) { - @Serializer(FindPetsByStatusResponse::class) companion object : KSerializer<FindPetsByStatusResponse> { - private val serializer = Pet.serializer().list - override val descriptor = PrimitiveDescriptor("FindPetsByStatusResponse", PrimitiveKind.STRING) + private val serializer = ListSerializer(Pet.serializer()) + override val descriptor = PrimitiveSerialDescriptor("FindPetsByStatusResponse", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: FindPetsByStatusResponse) = + override fun serialize(encoder: Encoder, value: FindPetsByStatusResponse): Unit = serializer.serialize(encoder, value.value) - override fun deserialize(decoder: Decoder) = FindPetsByStatusResponse(serializer.deserialize(decoder)) + override fun deserialize(decoder: Decoder): FindPetsByStatusResponse = + FindPetsByStatusResponse(serializer.deserialize(decoder)) } } + /** * Finds Pets by tags * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. @@ -162,43 +165,45 @@ class PetApi constructor( suspend fun findPetsByTags( tags: kotlin.collections.List<kotlin.String> ): HttpResponse<kotlin.collections.List<Pet>> { - val authNames_ = listOf<String>("petstore_auth") + val authNamesOag = listOf<String>("petstore_auth") - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() - queries_.addMulti("tags", tags, "csv") + val queriesOag = Queries { + addMulti("tags", tags, "csv") + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.GET, "/pet/findByTags", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap<FindPetsByTagsResponse>().map { value } } - @Serializable + @Serializable(with = FindPetsByTagsResponse.Companion::class) private class FindPetsByTagsResponse(val value: List<Pet>) { - @Serializer(FindPetsByTagsResponse::class) companion object : KSerializer<FindPetsByTagsResponse> { - private val serializer = Pet.serializer().list - override val descriptor = PrimitiveDescriptor("FindPetsByTagsResponse", PrimitiveKind.STRING) + private val serializer = ListSerializer(Pet.serializer()) + override val descriptor = PrimitiveSerialDescriptor("FindPetsByTagsResponse", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: FindPetsByTagsResponse) = + override fun serialize(encoder: Encoder, value: FindPetsByTagsResponse): Unit = serializer.serialize(encoder, value.value) - override fun deserialize(decoder: Decoder) = FindPetsByTagsResponse(serializer.deserialize(decoder)) + override fun deserialize(decoder: Decoder): FindPetsByTagsResponse = + FindPetsByTagsResponse(serializer.deserialize(decoder)) } } + /** * Find pet by ID * Returns a single pet @@ -209,27 +214,28 @@ class PetApi constructor( suspend fun getPetById( petId: kotlin.Long ): HttpResponse<Pet> { - val authNames_ = listOf<String>("api_key") + val authNamesOag = listOf<String>("api_key") - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.GET, - "/pet/{petId}".replace("petId", "$petId"), - queries = queries_, - headers = headers_ + "/pet/{petId}".replace("{" + "petId" + "}", petId.toString()), + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -241,26 +247,27 @@ class PetApi constructor( suspend fun updatePet( body: Pet ): HttpResponse<Unit> { - val authNames_ = listOf<String>("petstore_auth") + val authNamesOag = listOf<String>("petstore_auth") - val body_ = body + val bodyOag = body - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.PUT, "/pet", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return jsonRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } @@ -278,30 +285,31 @@ class PetApi constructor( name: kotlin.String? = null, status: kotlin.String? = null ): HttpResponse<Unit> { - val authNames_ = listOf<String>("petstore_auth") + val authNamesOag = listOf<String>("petstore_auth") - val body_ = + val bodyOag = ParametersBuilder().also { name?.apply { it.append("name", name.toString()) } status?.apply { it.append("status", status.toString()) } }.build() - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.POST, - "/pet/{petId}".replace("petId", "$petId"), - queries = queries_, - headers = headers_ + "/pet/{petId}".replace("{" + "petId" + "}", petId.toString()), + queries = queriesOag, + headers = headersOag ) return urlEncodedFormRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -318,30 +326,31 @@ class PetApi constructor( additionalMetadata: kotlin.String? = null, file: io.ktor.client.request.forms.InputProvider? = null ): HttpResponse<ApiResponse> { - val authNames_ = listOf<String>("petstore_auth") + val authNamesOag = listOf<String>("petstore_auth") - val body_ = + val bodyOag = formData { additionalMetadata?.let { append(FormPart("additionalMetadata", additionalMetadata)) } file?.let { append(FormPart("file", file)) } } - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.POST, - "/pet/{petId}/uploadImage".replace("petId", "$petId"), - queries = queries_, - headers = headers_ + "/pet/{petId}/uploadImage".replace("{" + "petId" + "}", petId.toString()), + queries = queriesOag, + headers = headersOag ) return multipartFormRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt index 865b44a5012..71017f5322b 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/StoreApi.kt @@ -16,26 +16,25 @@ import org.openapitools.client.models.Order import org.openapitools.client.infrastructure.* import io.ktor.client.request.forms.formData import io.ktor.client.engine.HttpClientEngine -import io.ktor.client.features.json.serializer.KotlinxSerializer import io.ktor.client.request.forms.FormPart +import io.ktor.client.utils.EmptyContent import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonConfiguration import io.ktor.http.ParametersBuilder -import kotlinx.serialization.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.list import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder class StoreApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, - serializer: KotlinxSerializer -) : ApiClientBase(baseUrl, httpClientEngine, serializer) { - constructor( - baseUrl: String = "http://petstore.swagger.io/v2", - httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable - ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) - + json: Json = Json {}, +) : ApiClientBase(baseUrl, httpClientEngine, json) { /** * Delete purchase order by ID * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors @@ -45,27 +44,28 @@ class StoreApi constructor( suspend fun deleteOrder( orderId: kotlin.String ): HttpResponse<Unit> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.DELETE, - "/store/order/{orderId}".replace("orderId", "$orderId"), - queries = queries_, - headers = headers_ + "/store/order/{orderId}".replace("{" + "orderId" + "}", orderId.toString()), + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -76,27 +76,28 @@ class StoreApi constructor( @Suppress("UNCHECKED_CAST") suspend fun getInventory( ): HttpResponse<kotlin.collections.Map<kotlin.String, kotlin.Int>> { - val authNames_ = listOf<String>("api_key") + val authNamesOag = listOf<String>("api_key") - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.GET, "/store/inventory", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap<GetInventoryResponse>().map { value } } @Serializable @@ -119,27 +120,28 @@ class StoreApi constructor( suspend fun getOrderById( orderId: kotlin.Long ): HttpResponse<Order> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.GET, - "/store/order/{orderId}".replace("orderId", "$orderId"), - queries = queries_, - headers = headers_ + "/store/order/{orderId}".replace("{" + "orderId" + "}", orderId.toString()), + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -152,26 +154,27 @@ class StoreApi constructor( suspend fun placeOrder( body: Order ): HttpResponse<Order> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = body + val bodyOag = body - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.POST, "/store/order", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return jsonRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt index 5ea1dd47c93..1743a993b8b 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/apis/UserApi.kt @@ -16,26 +16,25 @@ import org.openapitools.client.models.User import org.openapitools.client.infrastructure.* import io.ktor.client.request.forms.formData import io.ktor.client.engine.HttpClientEngine -import io.ktor.client.features.json.serializer.KotlinxSerializer import io.ktor.client.request.forms.FormPart +import io.ktor.client.utils.EmptyContent import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonConfiguration import io.ktor.http.ParametersBuilder -import kotlinx.serialization.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.list import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder class UserApi constructor( baseUrl: kotlin.String = "http://petstore.swagger.io/v2", httpClientEngine: HttpClientEngine? = null, - serializer: KotlinxSerializer -) : ApiClientBase(baseUrl, httpClientEngine, serializer) { - constructor( - baseUrl: String = "http://petstore.swagger.io/v2", - httpClientEngine: HttpClientEngine? = null, - jsonConfiguration: JsonConfiguration = JsonConfiguration.Stable - ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) - + json: Json = Json {}, +) : ApiClientBase(baseUrl, httpClientEngine, json) { /** * Create user * This can only be done by the logged in user. @@ -45,26 +44,27 @@ class UserApi constructor( suspend fun createUser( body: User ): HttpResponse<Unit> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = body + val bodyOag = body - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.POST, "/user", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return jsonRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } @@ -78,42 +78,44 @@ class UserApi constructor( suspend fun createUsersWithArrayInput( body: kotlin.collections.List<User> ): HttpResponse<Unit> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = CreateUsersWithArrayInputRequest(body) + val bodyOag = CreateUsersWithArrayInputRequest(body) - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.POST, "/user/createWithArray", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return jsonRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } - @Serializable + @Serializable(with = CreateUsersWithArrayInputRequest.Companion::class) private class CreateUsersWithArrayInputRequest(val value: List<User>) { - @Serializer(CreateUsersWithArrayInputRequest::class) companion object : KSerializer<CreateUsersWithArrayInputRequest> { - private val serializer = User.serializer().list - override val descriptor = PrimitiveDescriptor("CreateUsersWithArrayInputRequest", PrimitiveKind.STRING) + private val serializer = ListSerializer(User.serializer()) + override val descriptor = PrimitiveSerialDescriptor("CreateUsersWithArrayInputRequest", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: CreateUsersWithArrayInputRequest) = + override fun serialize(encoder: Encoder, value: CreateUsersWithArrayInputRequest): Unit = serializer.serialize(encoder, value.value) - override fun deserialize(decoder: Decoder) = CreateUsersWithArrayInputRequest(serializer.deserialize(decoder)) + override fun deserialize(decoder: Decoder): CreateUsersWithArrayInputRequest = + CreateUsersWithArrayInputRequest(serializer.deserialize(decoder)) } } + /** * Creates list of users with given input array * @@ -123,42 +125,44 @@ class UserApi constructor( suspend fun createUsersWithListInput( body: kotlin.collections.List<User> ): HttpResponse<Unit> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = CreateUsersWithListInputRequest(body) + val bodyOag = CreateUsersWithListInputRequest(body) - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.POST, "/user/createWithList", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return jsonRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } - @Serializable + @Serializable(with = CreateUsersWithListInputRequest.Companion::class) private class CreateUsersWithListInputRequest(val value: List<User>) { - @Serializer(CreateUsersWithListInputRequest::class) companion object : KSerializer<CreateUsersWithListInputRequest> { - private val serializer = User.serializer().list - override val descriptor = PrimitiveDescriptor("CreateUsersWithListInputRequest", PrimitiveKind.STRING) + private val serializer = ListSerializer(User.serializer()) + override val descriptor = PrimitiveSerialDescriptor("CreateUsersWithListInputRequest", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: CreateUsersWithListInputRequest) = + override fun serialize(encoder: Encoder, value: CreateUsersWithListInputRequest): Unit = serializer.serialize(encoder, value.value) - override fun deserialize(decoder: Decoder) = CreateUsersWithListInputRequest(serializer.deserialize(decoder)) + override fun deserialize(decoder: Decoder): CreateUsersWithListInputRequest = + CreateUsersWithListInputRequest(serializer.deserialize(decoder)) } } + /** * Delete user * This can only be done by the logged in user. @@ -168,27 +172,28 @@ class UserApi constructor( suspend fun deleteUser( username: kotlin.String ): HttpResponse<Unit> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.DELETE, - "/user/{username}".replace("username", "$username"), - queries = queries_, - headers = headers_ + "/user/{username}".replace("{" + "username" + "}", username.toString()), + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -201,27 +206,28 @@ class UserApi constructor( suspend fun getUserByName( username: kotlin.String ): HttpResponse<User> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.GET, - "/user/{username}".replace("username", "$username"), - queries = queries_, - headers = headers_ + "/user/{username}".replace("{" + "username" + "}", username.toString()), + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -236,29 +242,30 @@ class UserApi constructor( username: kotlin.String, password: kotlin.String ): HttpResponse<kotlin.String> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() - queries_.add("username", username) - queries_.add("password", password) + val queriesOag = Queries { + add("username", username) + add("password", password) + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.GET, "/user/login", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -268,27 +275,28 @@ class UserApi constructor( */ suspend fun logoutUser( ): HttpResponse<Unit> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = - io.ktor.client.utils.EmptyContent + val bodyOag = + EmptyContent - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.GET, "/user/logout", - queries = queries_, - headers = headers_ + queries = queriesOag, + headers = headersOag ) return request( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } /** @@ -302,26 +310,27 @@ class UserApi constructor( username: kotlin.String, body: User ): HttpResponse<Unit> { - val authNames_ = listOf<String>() + val authNamesOag = listOf<String>() - val body_ = body + val bodyOag = body - val queries_ = Queries() + val queriesOag = Queries { + } - val headers_ = mutableMapOf<String, String?>( + val headersOag = mutableMapOf<String, String?>( ) - val config_ = RequestConfig( + val configOag = RequestConfig( RequestMethod.PUT, - "/user/{username}".replace("username", "$username"), - queries = queries_, - headers = headers_ + "/user/{username}".replace("{" + "username" + "}", username.toString()), + queries = queriesOag, + headers = headersOag ) return jsonRequest( - config_, - body_, - authNames_ + configOag, + bodyOag, + authNamesOag ).wrap() } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt index f79709dfd56..96a5b698e6d 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiAbstractions.kt @@ -14,6 +14,10 @@ sealed class QueryParam { } class Queries(val queries: MutableMap<String, QueryParam> = mutableMapOf()) { + constructor(queries: MutableMap<String, QueryParam> = mutableMapOf(), config: Queries.() -> Unit): this(queries) { + config(this) + } + // Single fun add(name: String, value: String?) { if (value != null) { diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClientBase.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClientBase.kt index d538747a02c..44d3c57a7c7 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClientBase.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/ApiClientBase.kt @@ -16,20 +16,15 @@ import io.ktor.http.* import io.ktor.http.content.OutgoingContent import io.ktor.http.content.PartData import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonConfiguration import org.openapitools.client.auth.* open class ApiClientBase( private val baseUrl: String, httpClientEngine: HttpClientEngine?, - private val serializer: KotlinxSerializer + json: Json = Json {} ) { - constructor( - baseUrl: String, - httpClientEngine: HttpClientEngine?, - jsonConfiguration: JsonConfiguration - ) : this(baseUrl, httpClientEngine, KotlinxSerializer(Json(jsonConfiguration))) + private val serializer = KotlinxSerializer(json) private val client: HttpClient by lazy { val jsonConfig: JsonFeature.Config.() -> Unit = { this.serializer = this@ApiClientBase.serializer } diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt index 6906d5a323a..cb4eeb475ab 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Base64ByteArray.kt @@ -1,14 +1,21 @@ package org.openapitools.client.infrastructure -import kotlinx.serialization.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder -@Serializable +@Serializable(with = Base64ByteArray.Companion::class) class Base64ByteArray(val value: ByteArray) { - @Serializer(Base64ByteArray::class) companion object : KSerializer<Base64ByteArray> { - override val descriptor = PrimitiveDescriptor("Base64ByteArray", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: Base64ByteArray) = encoder.encodeString(value.value.encodeBase64()) - override fun deserialize(decoder: Decoder) = Base64ByteArray(decoder.decodeString().decodeBase64Bytes()) + override val descriptor = PrimitiveSerialDescriptor("Base64ByteArray", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: Base64ByteArray): Unit = + encoder.encodeString(value.value.encodeBase64()) + + override fun deserialize(decoder: Decoder): Base64ByteArray = + Base64ByteArray(decoder.decodeString().decodeBase64Bytes()) } override fun equals(other: Any?): Boolean { @@ -25,4 +32,4 @@ class Base64ByteArray(val value: ByteArray) { override fun toString(): String { return "Base64ByteArray(${hex(value)})" } -} \ No newline at end of file +} diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Bytes.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Bytes.kt index 43295604da7..dea7d43223a 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Bytes.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/Bytes.kt @@ -32,7 +32,7 @@ internal fun hex(bytes: ByteArray): String { result[resultIndex++] = digits[b and 0x0f] } - return String(result) + return result.concatToString() } /** diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt index 2ef5640587a..f2083a69000 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/OctetByteArray.kt @@ -1,12 +1,16 @@ package org.openapitools.client.infrastructure -import kotlinx.serialization.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder -@Serializable +@Serializable(with = OctetByteArray.Companion::class) class OctetByteArray(val value: ByteArray) { - @Serializer(OctetByteArray::class) companion object : KSerializer<OctetByteArray> { - override val descriptor = PrimitiveDescriptor("OctetByteArray", PrimitiveKind.STRING) + override val descriptor = PrimitiveSerialDescriptor("OctetByteArray", PrimitiveKind.STRING) override fun serialize(encoder: Encoder, value: OctetByteArray) = encoder.encodeString(hex(value.value)) override fun deserialize(decoder: Decoder) = OctetByteArray(hex(decoder.decodeString())) } @@ -25,4 +29,4 @@ class OctetByteArray(val value: ByteArray) { override fun toString(): String { return "OctetByteArray(${hex(value)})" } -} \ No newline at end of file +} diff --git a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/encoding.kt b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/encoding.kt index 34af19afba5..45ccc4036bf 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/encoding.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/common/main/org/openapitools/client/infrastructure/encoding.kt @@ -1,5 +1,3 @@ package org.openapitools.client.infrastructure -import kotlinx.io.core.toByteArray - -fun String.toBase64() = toByteArray().encodeBase64() +fun String.toBase64() = encodeToByteArray().encodeBase64() -- GitLab From b8441e27c5221d3edeb9e01f3eadc958c0e2b1a1 Mon Sep 17 00:00:00 2001 From: Cromefire_ <cromefire_@outlook.com> Date: Sun, 30 Aug 2020 14:54:24 +0200 Subject: [PATCH 8/8] Updated kotlin docs --- docs/generators/kotlin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/generators/kotlin.md b/docs/generators/kotlin.md index c53f7f7a59d..1960dcae3c8 100644 --- a/docs/generators/kotlin.md +++ b/docs/generators/kotlin.md @@ -10,7 +10,7 @@ sidebar_label: kotlin |artifactVersion|Generated artifact's package version.| |1.0.0| |collectionType|Option. Collection type to use|<dl><dt>**array**</dt><dd>kotlin.Array</dd><dt>**list**</dt><dd>kotlin.collections.List</dd></dl>|list| |dateLibrary|Option. Date library to use|<dl><dt>**threetenbp-localdatetime**</dt><dd>Threetenbp - Backport of JSR310 (jvm only, for legacy app only)</dd><dt>**string**</dt><dd>String</dd><dt>**java8-localdatetime**</dt><dd>Java 8 native JSR310 (jvm only, for legacy app only)</dd><dt>**java8**</dt><dd>Java 8 native JSR310 (jvm only, preferred for jdk 1.8+)</dd><dt>**threetenbp**</dt><dd>Threetenbp - Backport of JSR310 (jvm only, preferred for jdk < 1.8)</dd></dl>|java8| -|enumPropertyNaming|Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original'| |camelCase| +|enumPropertyNaming|Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original'| |PascalCase| |groupId|Generated artifact package's organization (i.e. maven groupId).| |org.openapitools| |library|Library template (sub-template) to use|<dl><dt>**jvm-okhttp4**</dt><dd>[DEFAULT] Platform: Java Virtual Machine. HTTP client: OkHttp 4.2.0 (Android 5.0+ and Java 8+). JSON processing: Moshi 1.8.0.</dd><dt>**jvm-okhttp3**</dt><dd>Platform: Java Virtual Machine. HTTP client: OkHttp 3.12.4 (Android 2.3+ and Java 7+). JSON processing: Moshi 1.8.0.</dd><dt>**jvm-retrofit2**</dt><dd>Platform: Java Virtual Machine. HTTP client: Retrofit 2.6.2.</dd><dt>**multiplatform**</dt><dd>Platform: Kotlin multiplatform. HTTP client: Ktor 1.2.4. JSON processing: Kotlinx Serialization: 0.12.0.</dd></dl>|jvm-okhttp4| |modelMutable|Create mutable models| |false| -- GitLab