Skip to content

Commit ef26ce6

Browse files
karismannwing328
authored andcommitted
[Kotlin] client improvement / remove WildCards in client/server (#2862)
1 parent 9323cad commit ef26ce6

58 files changed

Lines changed: 660 additions & 344 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,14 @@ samples/client/petstore/typescript-angular/tsd-debug.log
175175
# aspnetcore
176176
samples/server/petstore/aspnetcore/.vs/
177177
effective.pom
178+
178179
# kotlin
179180
samples/client/petstore/kotlin/src/main/kotlin/test/
180181
samples/client/petstore/kotlin-threetenbp/build
181182
samples/client/petstore/kotlin-string/build
182-
samples/server/petstore/kotlin-server/ktor/build
183183
samples/openapi3/client/petstore/kotlin/build
184+
samples/server/petstore/kotlin-server/ktor/build
185+
samples/server/petstore/kotlin-springboot/build
184186
\?
185187

186188
# haskell

docs/generators/kotlin-server.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ sidebar_label: kotlin-server
88
| Option | Description | Values | Default |
99
| ------ | ----------- | ------ | ------- |
1010
|sourceFolder|source folder for generated code| |src/main/kotlin|
11-
|packageName|Generated artifact package name.| |org.openapitools|
11+
|packageName|Generated artifact package name.| |org.openapitools.server|
1212
|apiSuffix|suffix for api classes| |Api|
1313
|groupId|Generated artifact package's organization (i.e. maven groupId).| |org.openapitools|
14-
|artifactId|Generated artifact id (name of jar).| |null|
14+
|artifactId|Generated artifact id (name of jar).| |kotlin-server|
1515
|artifactVersion|Generated artifact's package version.| |1.0.0|
1616
|enumPropertyNaming|Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original'| |camelCase|
1717
|parcelizeModels|toggle "@Parcelize" for generated models| |null|
18-
|library|library template (sub-template) to use|<dl><dt>**ktor**</dt><dd>ktor framework</dd><dl>|ktor|
18+
|library|library template (sub-template)|<dl><dt>**ktor**</dt><dd>ktor framework</dd><dl>|ktor|
1919
|featureAutoHead|Automatically provide responses to HEAD requests for existing routes that have the GET verb defined.| |true|
2020
|featureConditionalHeaders|Avoid sending content if client already has same content, by checking ETag or LastModified properties.| |false|
2121
|featureHSTS|Avoid sending content if client already has same content, by checking ETag or LastModified properties.| |true|

docs/generators/kotlin-spring.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ sidebar_label: kotlin-spring
1111
|packageName|Generated artifact package name.| |org.openapitools|
1212
|apiSuffix|suffix for api classes| |Api|
1313
|groupId|Generated artifact package's organization (i.e. maven groupId).| |org.openapitools|
14-
|artifactId|Generated artifact id (name of jar).| |null|
14+
|artifactId|Generated artifact id (name of jar).| |openapi-spring|
1515
|artifactVersion|Generated artifact's package version.| |1.0.0|
1616
|enumPropertyNaming|Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original'| |camelCase|
1717
|parcelizeModels|toggle &quot;@Parcelize&quot; for generated models| |null|
@@ -26,4 +26,4 @@ sidebar_label: kotlin-spring
2626
|serviceInterface|generate service interfaces to go alongside controllers. In most cases this option would be used to update an existing project, so not to override implementations. Useful to help facilitate the generation gap pattern| |false|
2727
|serviceImplementation|generate stub service implementations that extends service interfaces. If this is set to true service interfaces will also be generated| |false|
2828
|useBeanValidation|Use BeanValidation API annotations to validate data types| |true|
29-
|library|library template (sub-template) to use|<dl><dt>**spring-boot**</dt><dd>Spring-boot Server application.</dd><dl>|spring-boot|
29+
|library|library template (sub-template)|<dl><dt>**spring-boot**</dt><dd>Spring-boot Server application.</dd><dl>|spring-boot|

docs/generators/kotlin.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ sidebar_label: kotlin
88
| Option | Description | Values | Default |
99
| ------ | ----------- | ------ | ------- |
1010
|sourceFolder|source folder for generated code| |src/main/kotlin|
11-
|packageName|Generated artifact package name.| |org.openapitools|
11+
|packageName|Generated artifact package name.| |org.openapitools.client|
1212
|apiSuffix|suffix for api classes| |Api|
1313
|groupId|Generated artifact package's organization (i.e. maven groupId).| |org.openapitools|
14-
|artifactId|Generated artifact id (name of jar).| |null|
14+
|artifactId|Generated artifact id (name of jar).| |kotlin-client|
1515
|artifactVersion|Generated artifact's package version.| |1.0.0|
1616
|enumPropertyNaming|Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original'| |camelCase|
1717
|parcelizeModels|toggle &quot;@Parcelize&quot; for generated models| |null|
18-
|dateLibrary|Option. Date library to use|<dl><dt>**string**</dt><dd>String</dd><dt>**java8**</dt><dd>Java 8 native JSR310</dd><dt>**threetenbp**</dt><dd>Threetenbp</dd><dl>|null|
19-
|collectionType|Option. Collection type to use|<dl><dt>**array**</dt><dd>kotlin.Array</dd><dt>**list**</dt><dd>kotlin.collections.List</dd><dl>|null|
18+
|dateLibrary|Option. Date library to use|<dl><dt>**string**</dt><dd>String</dd><dt>**java8**</dt><dd>Java 8 native JSR310</dd><dt>**threetenbp**</dt><dd>Threetenbp</dd><dl>|java8|
19+
|collectionType|Option. Collection type to use|<dl><dt>**array**</dt><dd>kotlin.Array</dd><dt>**list**</dt><dd>kotlin.collections.List</dd><dl>|array|

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public JavaClientCodegen() {
102102
apiPackage = "org.openapitools.client.api";
103103
modelPackage = "org.openapitools.client.model";
104104

105-
// clioOptions default redifinition need to be updated
105+
// cliOptions default redefinition need to be updated
106106
updateOption(CodegenConstants.INVOKER_PACKAGE, this.getInvokerPackage());
107107
updateOption(CodegenConstants.ARTIFACT_ID, this.getArtifactId());
108108
updateOption(CodegenConstants.API_PACKAGE, apiPackage);

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import org.openapitools.codegen.CodegenConstants;
2222
import org.openapitools.codegen.CodegenType;
2323
import org.openapitools.codegen.SupportingFile;
24-
import org.slf4j.Logger;
25-
import org.slf4j.LoggerFactory;
2624

2725
import java.io.File;
2826
import java.util.HashMap;
@@ -32,7 +30,6 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
3230

3331
public static final String DATE_LIBRARY = "dateLibrary";
3432
public static final String COLLECTION_TYPE = "collectionType";
35-
private static final Logger LOGGER = LoggerFactory.getLogger(KotlinClientCodegen.class);
3633

3734
protected String dateLibrary = DateLibrary.JAVA8.value;
3835
protected String collectionType = CollectionType.ARRAY.value;
@@ -69,6 +66,10 @@ public KotlinClientCodegen() {
6966
artifactId = "kotlin-client";
7067
packageName = "org.openapitools.client";
7168

69+
// cliOptions default redefinition need to be updated
70+
updateOption(CodegenConstants.ARTIFACT_ID, this.artifactId);
71+
updateOption(CodegenConstants.PACKAGE_NAME, this.packageName);
72+
7273
outputFolder = "generated-code" + File.separator + "kotlin-client";
7374
modelTemplateFiles.put("model.mustache", ".kt");
7475
apiTemplateFiles.put("api.mustache", ".kt");
@@ -78,21 +79,21 @@ public KotlinClientCodegen() {
7879
apiPackage = packageName + ".apis";
7980
modelPackage = packageName + ".models";
8081

81-
enumPropertyNaming = CodegenConstants.ENUM_PROPERTY_NAMING_TYPE.camelCase;
82-
8382
CliOption dateLibrary = new CliOption(DATE_LIBRARY, "Option. Date library to use");
8483
Map<String, String> dateOptions = new HashMap<>();
8584
dateOptions.put(DateLibrary.THREETENBP.value, "Threetenbp");
8685
dateOptions.put(DateLibrary.STRING.value, "String");
8786
dateOptions.put(DateLibrary.JAVA8.value, "Java 8 native JSR310");
8887
dateLibrary.setEnum(dateOptions);
88+
dateLibrary.setDefault(this.dateLibrary);
8989
cliOptions.add(dateLibrary);
9090

9191
CliOption collectionType = new CliOption(COLLECTION_TYPE, "Option. Collection type to use");
9292
Map<String, String> collectionOptions = new HashMap<>();
9393
collectionOptions.put(CollectionType.ARRAY.value, "kotlin.Array");
9494
collectionOptions.put(CollectionType.LIST.value, "kotlin.collections.List");
9595
collectionType.setEnum(collectionOptions);
96+
collectionType.setDefault(this.collectionType);
9697
cliOptions.add(collectionType);
9798
}
9899

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,22 @@ public KotlinServerCodegen() {
6262

6363
artifactId = "kotlin-server";
6464
packageName = "org.openapitools.server";
65+
66+
// cliOptions default redefinition need to be updated
67+
updateOption(CodegenConstants.ARTIFACT_ID, this.artifactId);
68+
updateOption(CodegenConstants.PACKAGE_NAME, this.packageName);
69+
6570
outputFolder = "generated-code" + File.separator + "kotlin-server";
6671
modelTemplateFiles.put("model.mustache", ".kt");
6772
apiTemplateFiles.put("api.mustache", ".kt");
6873
embeddedTemplateDir = templateDir = "kotlin-server";
6974
apiPackage = packageName + ".apis";
7075
modelPackage = packageName + ".models";
7176

72-
supportedLibraries.put("ktor", "ktor framework");
77+
supportedLibraries.put(Constants.KTOR, "ktor framework");
7378

7479
// TODO: Configurable server engine. Defaults to netty in build.gradle.
75-
CliOption library = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use");
80+
CliOption library = new CliOption(CodegenConstants.LIBRARY, CodegenConstants.LIBRARY_DESC);
7681
library.setDefault(DEFAULT_LIBRARY);
7782
library.setEnum(supportedLibraries);
7883

@@ -147,9 +152,9 @@ public void processOpts() {
147152

148153
// set default library to "ktor"
149154
if (StringUtils.isEmpty(library)) {
150-
this.setLibrary("ktor");
151-
additionalProperties.put(CodegenConstants.LIBRARY, "ktor");
152-
LOGGER.info("`library` option is empty. Default to 'ktor'.");
155+
this.setLibrary(DEFAULT_LIBRARY);
156+
additionalProperties.put(CodegenConstants.LIBRARY, DEFAULT_LIBRARY);
157+
LOGGER.info("`library` option is empty. Default to " + DEFAULT_LIBRARY);
153158
}
154159

155160
if (additionalProperties.containsKey(Constants.AUTOMATIC_HEAD_REQUESTS)) {
@@ -182,7 +187,7 @@ public void processOpts() {
182187
additionalProperties.put(Constants.COMPRESSION, getCompressionFeatureEnabled());
183188
}
184189

185-
Boolean generateApis = additionalProperties.containsKey(CodegenConstants.GENERATE_APIS) && (Boolean)additionalProperties.get(CodegenConstants.GENERATE_APIS);
190+
boolean generateApis = additionalProperties.containsKey(CodegenConstants.GENERATE_APIS) && (Boolean)additionalProperties.get(CodegenConstants.GENERATE_APIS);
186191
String packageFolder = (sourceFolder + File.separator + packageName).replace(".", File.separator);
187192
String resourcesFolder = "src/main/resources"; // not sure this can be user configurable.
188193

@@ -226,7 +231,7 @@ private void addMustacheLambdas(Map<String, Object> objs) {
226231
if (objs.containsKey("lambda")) {
227232
LOGGER.warn("A property named 'lambda' already exists. Mustache lambdas renamed from 'lambda' to '_lambda'. " +
228233
"You'll likely need to use a custom template, " +
229-
"see https://github.com/swagger-api/swagger-codegen#modifying-the-client-library-format. "); // TODO: update the URL
234+
"see https://github.com/OpenAPITools/openapi-generator/blob/master/docs/templating.md. ");
230235
objs.put("_lambda", lambdas);
231236
} else {
232237
objs.put("lambda", lambdas);

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ public KotlinSpringServerCodegen() {
8787
apiPackage = "org.openapitools.api";
8888
modelPackage = "org.openapitools.model";
8989

90+
// cliOptions default redefinition need to be updated
91+
updateOption(CodegenConstants.ARTIFACT_ID, this.artifactId);
92+
9093
// Use lists instead of arrays
9194
typeMapping.put("array", "List");
9295
typeMapping.put("string", "String");
@@ -149,7 +152,7 @@ public KotlinSpringServerCodegen() {
149152
supportedLibraries.put(SPRING_BOOT, "Spring-boot Server application.");
150153
setLibrary(SPRING_BOOT);
151154

152-
CliOption cliOpt = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use");
155+
CliOption cliOpt = new CliOption(CodegenConstants.LIBRARY, CodegenConstants.LIBRARY_DESC);
153156
cliOpt.setDefault(SPRING_BOOT);
154157
cliOpt.setEnum(supportedLibraries);
155158
cliOptions.add(cliOpt);

modules/openapi-generator/src/main/resources/kotlin-client/README.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Requires
44

5-
* Kotlin 1.3.20
5+
* Kotlin 1.3.31
66
* Gradle 4.9
77

88
## Build

modules/openapi-generator/src/main/resources/kotlin-client/api.mustache

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,17 @@ package {{apiPackage}}
44
{{#imports}}import {{import}}
55
{{/imports}}
66

7-
import {{packageName}}.infrastructure.*
7+
import {{packageName}}.infrastructure.ApiClient
8+
import {{packageName}}.infrastructure.ClientException
9+
import {{packageName}}.infrastructure.ClientError
10+
import {{packageName}}.infrastructure.ServerException
11+
import {{packageName}}.infrastructure.ServerError
12+
import {{packageName}}.infrastructure.MultiValueMap
13+
import {{packageName}}.infrastructure.RequestConfig
14+
import {{packageName}}.infrastructure.RequestMethod
15+
import {{packageName}}.infrastructure.ResponseType
16+
import {{packageName}}.infrastructure.Success
17+
import {{packageName}}.infrastructure.toMultiValue
818
{{#threetenbp}}
919
import org.threeten.bp.LocalDateTime
1020
{{/threetenbp}}
@@ -23,7 +33,7 @@ class {{classname}}(basePath: kotlin.String = "{{{basePath}}}") : ApiClient(base
2333
fun {{operationId}}({{#allParams}}{{paramName}}: {{{dataType}}}{{^required}}?{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) : {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}} {
2434
val localVariableBody: kotlin.Any? = {{#hasBodyParam}}{{#bodyParams}}{{paramName}}{{/bodyParams}}{{/hasBodyParam}}{{^hasBodyParam}}{{^hasFormParams}}null{{/hasFormParams}}{{#hasFormParams}}mapOf({{#formParams}}"{{{baseName}}}" to "${{paramName}}"{{#hasMore}}, {{/hasMore}}{{/formParams}}){{/hasFormParams}}{{/hasBodyParam}}
2535
val localVariableQuery: MultiValueMap = {{^hasQueryParams}}mapOf(){{/hasQueryParams}}{{#hasQueryParams}}mapOf({{#queryParams}}"{{paramName}}" to {{#isContainer}}toMultiValue({{paramName}}.toList(), "{{collectionFormat}}"){{/isContainer}}{{^isContainer}}listOf("${{paramName}}"){{/isContainer}}{{#hasMore}}, {{/hasMore}}{{/queryParams}}){{/hasQueryParams}}
26-
val localVariableHeaders: kotlin.collections.Map<kotlin.String,kotlin.String> = mapOf({{#hasFormParams}}"Content-Type" to "multipart/form-data"{{/hasFormParams}}{{^hasHeaderParams}}){{/hasHeaderParams}}{{#hasHeaderParams}}{{#hasFormParams}}, {{/hasFormParams}}{{#headerParams}}"{{baseName}}" to {{#isContainer}}{{paramName}}.joinToString(separator = collectionDelimiter("{{collectionFormat}}")){{/isContainer}}{{^isContainer}}{{paramName}}.toString(){{/isContainer}}{{#hasMore}}, {{/hasMore}}{{/headerParams}}){{/hasHeaderParams}}
36+
val localVariableHeaders: MutableMap<String, String> = mutableMapOf({{#hasFormParams}}"Content-Type" to {{^consumes}}"multipart/form-data"{{/consumes}}{{#consumes.0}}"{{MediaType}}"{{/consumes.0}}{{/hasFormParams}}{{^hasHeaderParams}}){{/hasHeaderParams}}{{#hasHeaderParams}}{{#hasFormParams}}, {{/hasFormParams}}{{#headerParams}}"{{baseName}}" to {{#isContainer}}{{paramName}}.joinToString(separator = collectionDelimiter("{{collectionFormat}}")){{/isContainer}}{{^isContainer}}{{paramName}}.toString(){{/isContainer}}{{#hasMore}}, {{/hasMore}}{{/headerParams}}){{/hasHeaderParams}}
2737
val localVariableConfig = RequestConfig(
2838
RequestMethod.{{httpMethod}},
2939
"{{path}}"{{#pathParams}}.replace("{"+"{{baseName}}"+"}", "${{paramName}}"){{/pathParams}},

0 commit comments

Comments
 (0)