From 906ec5dfa37d05f41f2ec79dc7f5dba6223252eb Mon Sep 17 00:00:00 2001 From: Sorin Florea <30589784+sorin-florea@users.noreply.github.com> Date: Wed, 23 Nov 2022 04:15:59 +0100 Subject: [PATCH] Cleanup outputDir before openApiGenerate (#13659) * Cleanup outputdir before openApiGenerate * Add cleanupOutput property to GenerateTask --- .../gradle/plugin/OpenApiGeneratorPlugin.kt | 1 + .../OpenApiGeneratorGenerateExtension.kt | 9 ++ .../gradle/plugin/tasks/GenerateTask.kt | 14 +++ .../src/test/kotlin/GenerateTaskDslTest.kt | 87 ++++++++++++++++++- 4 files changed, 110 insertions(+), 1 deletion(-) 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 19c9a7c4b91..4975fe21661 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 @@ -146,6 +146,7 @@ class OpenApiGeneratorPlugin : Plugin { skipValidateSpec.set(generate.skipValidateSpec) generateAliasAsModel.set(generate.generateAliasAsModel) engine.set(generate.engine) + cleanupOutput.set(generate.cleanupOutput) } } } 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 6e88fa79642..4d9cff54143 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 @@ -17,6 +17,8 @@ package org.openapitools.generator.gradle.plugin.extensions import org.gradle.api.Project +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Optional import org.gradle.kotlin.dsl.listProperty import org.gradle.kotlin.dsl.mapProperty import org.gradle.kotlin.dsl.property @@ -341,6 +343,12 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { */ val engine = project.objects.property() + /** + * Defines whether the output dir should be cleaned up before generating the output. + * + */ + val cleanupOutput = project.objects.property() + init { applyDefaults() } @@ -362,5 +370,6 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { enablePostProcessFile.set(false) skipValidateSpec.set(false) generateAliasAsModel.set(false) + cleanupOutput.set(false) } } 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 38c128a4b8f..9c0c721ee23 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 @@ -490,6 +490,14 @@ open class GenerateTask : DefaultTask() { @Input val engine = project.objects.property() + /** + * Defines whether the output dir should be cleaned up before generating the output. + * + */ + @Optional + @Input + val cleanupOutput = project.objects.property() + private fun Property.ifNotEmpty(block: Property.(T) -> Unit) { if (isPresent) { val item: T? = get() @@ -512,6 +520,12 @@ open class GenerateTask : DefaultTask() { @Suppress("unused") @TaskAction fun doWork() { + cleanupOutput.ifNotEmpty { cleanup -> + if (cleanup) { + project.delete(outputDir) + } + } + val configurator: CodegenConfigurator = if (configFile.isPresent) { CodegenConfigurator.fromFile(configFile.get()) } else createDefaultCodegenConfigurator() 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 660f0845bdf..e1c1e1f1989 100644 --- a/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt +++ b/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt @@ -128,6 +128,91 @@ class GenerateTaskDslTest : TestBase() { "Expected a successful run, but found ${result.task(":openApiGenerate")?.outcome}") } + @Test + fun `openApiGenerate should not cleanup outputDir by default`() { + // Arrange + val projectFiles = mapOf( + "spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0.yaml") + ) + withProject(defaultBuildGradle, projectFiles) + + val oldFile = File(temp, "build/kotlin/should-be-removed") + oldFile.mkdirs() + oldFile.createNewFile() + + // Act + val result = GradleRunner.create() + .withProjectDir(temp) + .withArguments("openApiGenerate") + .withPluginClasspath() + .build() + + // Assert + assertTrue( + result.output.contains("Successfully generated code to"), + "User friendly generate notice is missing." + ) + + assertTrue(oldFile.exists(), "Old files should have been removed") + + assertEquals( + TaskOutcome.SUCCESS, result.task(":openApiGenerate")?.outcome, + "Expected a successful run, but found ${result.task(":openApiGenerate")?.outcome}" + ) + } + + @Test + fun `openApiGenerate should cleanup outputDir`() { + // 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" + configOptions = [ + dateLibrary: "java8" + ] + cleanupOutput = true + } + """.trimIndent(), + projectFiles + ) + + val oldFile = File(temp, "build/kotlin/should-be-removed") + oldFile.mkdirs() + oldFile.createNewFile() + + // Act + val result = GradleRunner.create() + .withProjectDir(temp) + .withArguments("openApiGenerate") + .withPluginClasspath() + .build() + + // Assert + assertTrue( + result.output.contains("Successfully generated code to"), + "User friendly generate notice is missing." + ) + + assertFalse(oldFile.exists(), "Old files should have been removed") + + assertEquals( + TaskOutcome.SUCCESS, result.task(":openApiGenerate")?.outcome, + "Expected a successful run, but found ${result.task(":openApiGenerate")?.outcome}" + ) + } + @Test fun `should apply prefix & suffix config parameters`() { // Arrange @@ -373,4 +458,4 @@ class GenerateTaskDslTest : TestBase() { assertEquals(TaskOutcome.FAILED, result.task(":openApiGenerate")?.outcome, "Expected a failed run, but found ${result.task(":openApiGenerate")?.outcome}") } -} \ No newline at end of file +}