diff --git a/modules/openapi-generator-gradle-plugin/README.adoc b/modules/openapi-generator-gradle-plugin/README.adoc index f7f22550b4f409342607493f033c9cbaee6a210e..a0c81fe2c7ad9036d51619f148240984c2e82d47 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 82105777a66419bcf0307bf48ed187a211beeb6b..dcc3ce08915ddab990ff0c9a7e21331e247b10b2 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<Project> { 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 55dee4400e29a873d637adc4894317686b82c46c..846a03d29417b71d0e33b60a855300b7fd24c11b 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<String, String>() + /** + * Templating engine: "mustache" (default) or "handlebars" (beta) + */ + val engine = project.objects.property<String?>() + 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 0ffc93cf4fea037a5780d6d6c09b34d91fab2a85..e0dee13cafe4bd3adaf22979e86d72677c6d367a 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<String, String>() + /** + * Templating engine: "mustache" (default) or "handlebars" (beta) + */ + @get:Internal + val engine = project.objects.property<String?>() + private fun <T : Any?> Property<T>.ifNotEmpty(block: Property<T>.(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 9f62e7e9feedf9de3afcca6b371c3a47e521a787..6aecc119252b54b4bd07657308871d5cac81b799 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