Skip to content

Commit

Permalink
New feature: OpenAPI generator for kotlin (micronaut-projects#1254)
Browse files Browse the repository at this point in the history
Adds a new OpenAPI generator implementation for Kotlin

Fixes micronaut-projects#1239
  • Loading branch information
altro3 committed Nov 2, 2023
1 parent 267cb7d commit bca51f3
Show file tree
Hide file tree
Showing 120 changed files with 10,129 additions and 512 deletions.
3 changes: 3 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ insert_final_newline = true
charset = utf-8
indent_style = space

[{*.mustache,*.ftl}]
insert_final_newline = false

[{*.sh,gradlew}]
end_of_line = lf

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ dependencies {
}

def openapiGenerate = tasks.register("generateOpenApi", OpenApiGeneratorTask) {
lang = "java"
classpath.from(configurations.openapiGenerator)
openApiDefinition.convention(layout.projectDirectory.file("petstore.json"))
outputDirectory.convention(layout.buildDirectory.dir("generated/openapi"))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import io.micronaut.build.internal.openapi.OpenApiGeneratorTask

plugins {
id 'io.micronaut.minimal.application'
}

repositories {
mavenCentral()
}

configurations {
openapiGenerator {
canBeResolved = true
canBeConsumed = false
}
}

dependencies {
openapiGenerator(project(":test-suite-generator-util"))
}

def openapiGenerate = tasks.register("generateOpenApi", OpenApiGeneratorTask) {
lang = "kotlin"
classpath.from(configurations.openapiGenerator)
openApiDefinition.convention(layout.projectDirectory.file("petstore.json"))
outputDirectory.convention(layout.buildDirectory.dir("generated/openapi"))
generatorKind.convention("client")
outputKinds.convention(["models", "apis", "apiDocs", "modelDocs", "supportingFiles", "modelTests", "apiTests"])
parameterMappings.convention([])
responseBodyMappings.convention([])
}

sourceSets {
main {
java.srcDir(openapiGenerate.map(OpenApiGeneratorTask::getGeneratedSourcesDirectory))
}
test {
java.srcDir(openapiGenerate.map(OpenApiGeneratorTask::getGeneratedTestSourcesDirectory))
}
}

micronaut {
version = libs.versions.micronaut.platform.get()
runtime("netty")
testRuntime("junit5")
}

dependencies {
constraints {
implementation("io.micronaut:micronaut-http-client:${libs.versions.micronaut.asProvider().get()}")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@
*/
package io.micronaut.build.internal.openapi;

import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Map;

import javax.inject.Inject;

import org.gradle.api.DefaultTask;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.file.Directory;
Expand All @@ -33,13 +40,6 @@
import org.gradle.api.tasks.TaskAction;
import org.gradle.process.ExecOperations;

import javax.inject.Inject;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
* A task which simulates what the Gradle Micronaut plugin
* would do. Must be used with the test entry point.
Expand All @@ -55,17 +55,22 @@ public abstract class OpenApiGeneratorTask extends DefaultTask {
@Input
public abstract Property<String> getGeneratorKind();

@Input
public abstract Property<String> getLang();

@OutputDirectory
public abstract DirectoryProperty getOutputDirectory();

@Internal
public Provider<Directory> getGeneratedSourcesDirectory() {
return getOutputDirectory().dir("src/main/java");
String lang = getLang().get();
return lang.equalsIgnoreCase("JAVA") ? getOutputDirectory().dir("src/main/java") : getOutputDirectory().dir("src/main/kotlin");
}

@Internal
public Provider<Directory> getGeneratedTestSourcesDirectory() {
return getOutputDirectory().dir("src/test/groovy");
String lang = getLang().get();
return lang.equalsIgnoreCase("JAVA") ? getOutputDirectory().dir("src/test/groovy") : getOutputDirectory().dir("src/test/kotlin");
}

@Input
Expand All @@ -77,27 +82,28 @@ public Provider<Directory> getGeneratedTestSourcesDirectory() {
@Input
public abstract ListProperty<Map<String, String>> getResponseBodyMappings();


@Inject
protected abstract ExecOperations getExecOperations();

@TaskAction
public void execute() throws IOException {
var generatedSourcesDir = getGeneratedSourcesDirectory().get().getAsFile();
var generatedTestSourcesDir = getGeneratedTestSourcesDirectory().get().getAsFile();
var lang = getLang().get();
Files.createDirectories(generatedSourcesDir.toPath());
Files.createDirectories(generatedTestSourcesDir.toPath());
getProject().getLogger().info("json: " + getParameterMappings().get());
getProject().getLogger().info("json: {}", getParameterMappings().get());
getExecOperations().javaexec(javaexec -> {
javaexec.setClasspath(getClasspath());
javaexec.getMainClass().set("io.micronaut.openapi.testsuite.GeneratorMain");
List<String> args = new ArrayList<>();
var args = new ArrayList<String>();
args.add(getGeneratorKind().get());
args.add(getOpenApiDefinition().get().getAsFile().toURI().toString());
args.add(getOutputDirectory().get().getAsFile().getAbsolutePath());
args.add(String.join(",", getOutputKinds().get()));
args.add(getParameterMappings().get().toString());
args.add(getResponseBodyMappings().get().toString());
args.add(lang.toUpperCase());
javaexec.args(args);
});
}
Expand Down
5 changes: 3 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ managed-parboiled = "1.4.1"
managed-freemarker = "2.3.32"
managed-pegdown = "1.6.0"

kotlin = "1.9.10"
kotlin = "1.9.20"
jspecify = "0.3.0"
jdt-annotation = "2.2.700"
android-annotation = "1.7.0"
Expand All @@ -18,7 +18,7 @@ swagger-parser-v3 = "2.1.18"
javaparser = "3.25.5"
commons-codec = "1.16.0"

micronaut = "4.1.10"
micronaut = "4.1.11"
micronaut-security = "4.1.0"
micronaut-serde = "2.2.6"
micronaut-rxjava2 = "2.0.1"
Expand Down Expand Up @@ -61,6 +61,7 @@ managed-pegdown = {module = "org.pegdown:pegdown", version.ref = "managed-pegdow

# Versions from BOM
junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine" }
junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params" }
jackson-datatype-jsr310 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" }
jackson-dataformat-yaml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml" }
kotlinx-coroutines-reactor = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactor" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

/**
Expand All @@ -34,6 +35,7 @@
public abstract class OpenAPIMixin {

@JsonAnyGetter
@JsonInclude
public abstract Map<String, Object> getExtensions();

@JsonAnySetter
Expand Down
1 change: 1 addition & 0 deletions openapi-generator/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies {
implementation libs.commons.codec

testImplementation mnTest.micronaut.test.junit5
testImplementation libs.junit.jupiter.params

testFixturesImplementation mnTest.assertj.core
testFixturesImplementation libs.javaparser
Expand Down
Loading

0 comments on commit bca51f3

Please sign in to comment.