From 256a431f037d7ed152c39fbb89fa3373676f57d2 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Wed, 25 Mar 2020 12:27:05 -0400 Subject: [PATCH] [gradle] Include engine option for handlebars generation (#5686) --- .../README.adoc | 4 +++ .../gradle/plugin/OpenApiGeneratorPlugin.kt | 1 + .../OpenApiGeneratorGenerateExtension.kt | 5 +++ .../gradle/plugin/tasks/GenerateTask.kt | 12 +++++++ .../src/test/kotlin/GenerateTaskDslTest.kt | 36 +++++++++++++++++++ 5 files changed, 58 insertions(+) diff --git a/modules/openapi-generator-gradle-plugin/README.adoc b/modules/openapi-generator-gradle-plugin/README.adoc index f7f22550b4f..a0c81fe2c7a 100644 --- a/modules/openapi-generator-gradle-plugin/README.adoc +++ b/modules/openapi-generator-gradle-plugin/README.adoc @@ -330,6 +330,10 @@ apply plugin: 'org.openapi.generator' |false |To generate alias (array, list, map) as model. When false, top-level objects defined as array, list, or map will result in those definitions generated as top-level Array-of-items, List-of-items, Map-of-items definitions. When true, A model representation either containing or extending the array,list,map (depending on specific generator implementation) will be generated. +|engine +|String +|mustache +|Templating engine: "mustache" (default) or "handlebars" (beta) |=== [NOTE] diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt index 82105777a66..dcc3ce08915 100644 --- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt +++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt @@ -138,6 +138,7 @@ class OpenApiGeneratorPlugin : Plugin { enablePostProcessFile.set(generate.enablePostProcessFile) skipValidateSpec.set(generate.skipValidateSpec) generateAliasAsModel.set(generate.generateAliasAsModel) + engine.set(generate.engine) } } } diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt index 55dee4400e2..846a03d2941 100644 --- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt +++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt @@ -307,6 +307,11 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { */ val configOptions = project.objects.mapProperty() + /** + * Templating engine: "mustache" (default) or "handlebars" (beta) + */ + val engine = project.objects.property() + init { applyDefaults() } diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt index 0ffc93cf4fe..e0dee13cafe 100644 --- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt +++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt @@ -375,6 +375,12 @@ open class GenerateTask : DefaultTask() { @get:Internal val configOptions = project.objects.mapProperty() + /** + * Templating engine: "mustache" (default) or "handlebars" (beta) + */ + @get:Internal + val engine = project.objects.property() + private fun Property.ifNotEmpty(block: Property.(T) -> Unit) { if (isPresent) { val item: T? = get() @@ -561,6 +567,12 @@ open class GenerateTask : DefaultTask() { configurator.setGenerateAliasAsModel(value) } + engine.ifNotEmpty { value -> + if ("handlebars".equals(value, ignoreCase = true)) { + configurator.setTemplatingEngineName("handlebars") + } + } + if (systemProperties.isPresent) { systemProperties.get().forEach { entry -> configurator.addSystemProperty(entry.key, entry.value) diff --git a/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt b/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt index 9f62e7e9fee..6aecc119252 100644 --- a/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt +++ b/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt @@ -126,4 +126,40 @@ class GenerateTaskDslTest : TestBase() { assertEquals(TaskOutcome.SUCCESS, result.task(":openApiGenerate")?.outcome, "Expected a successful run, but found ${result.task(":openApiGenerate")?.outcome}") } + + @Test + fun `openapiGenerate should attempt to set handlebars when specified as engine`(){ + // Arrange + val projectFiles = mapOf( + "spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0.yaml") + ) + + withProject(""" + plugins { + id 'org.openapi.generator' + } + openApiGenerate { + generatorName = "kotlin" + inputSpec = file("spec.yaml").absolutePath + outputDir = file("build/kotlin").absolutePath + apiPackage = "org.openapitools.example.api" + invokerPackage = "org.openapitools.example.invoker" + modelPackage = "org.openapitools.example.model" + engine = "handlebars" + } + """.trimIndent(), projectFiles) + + // Act + val result = GradleRunner.create() + .withProjectDir(temp) + .withArguments("openApiGenerate") + .withPluginClasspath() + .buildAndFail() + + // Assert + // rather than write out full handlebars generator templates, we'll just test that the configurator has set handlebars as the engine. + assertTrue(result.output.contains("kotlin-client/model.handlebars (No such file or directory)"), "Build should have attempted to use handlebars.") + assertEquals(TaskOutcome.FAILED, result.task(":openApiGenerate")?.outcome, + "Expected a failed run, but found ${result.task(":openApiGenerate")?.outcome}") + } } \ No newline at end of file