From 9374dbd0308598a56b11746c364a71fceaa82c2b Mon Sep 17 00:00:00 2001 From: Erik VanderWerf Date: Wed, 19 Feb 2025 01:28:03 -0800 Subject: [PATCH] Add option to skip merging spec files (#19396) Introduced a new property `inputSpecRootDirectorySkipMerge` to conditionally skip the merging step of the specification files. Updated the logic to honor this new property, ensuring merging only occurs if it is explicitly not skipped. Enabled configuration via Gradle build file. --- .../gradle/plugin/OpenApiGeneratorPlugin.kt | 1 + .../OpenApiGeneratorGenerateExtension.kt | 17 ++++++++++- .../gradle/plugin/tasks/GenerateTask.kt | 29 ++++++++++++++++--- 3 files changed, 42 insertions(+), 5 deletions(-) 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 f1b1d9e74ed..bd8f7767bed 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 @@ -98,6 +98,7 @@ class OpenApiGeneratorPlugin : Plugin { outputDir.set(generate.outputDir) inputSpec.set(generate.inputSpec) inputSpecRootDirectory.set(generate.inputSpecRootDirectory) + inputSpecRootDirectorySkipMerge.set(generate.inputSpecRootDirectorySkipMerge) remoteInputSpec.set(generate.remoteInputSpec) templateDir.set(generate.templateDir) templateResourcePath.set(generate.templateResourcePath) 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 48c5e88259f..8d7d31d5d1f 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 @@ -51,14 +51,28 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { /** * The Open API 2.0/3.x specification location. + * + * Be default, Gradle will treat the openApiGenerate task as up-to-date based only on this file, regardless of + * changes to any $ref referenced files. Use the `inputSpecRootDirectory` property to have Gradle track changes to + * an entire directory of spec files. */ val inputSpec = project.objects.property() /** - * Local root folder with spec files + * Local root folder with spec files. + * + * By default, a merged spec file will be generated based on the contents of the directory. To disable this, set the + * `inputSpecRootDirectorySkipMerge` property. */ val inputSpecRootDirectory = project.objects.property() + /** + * Skip bundling all spec files into a merged spec file, if true. + * + * Default false. + */ + val inputSpecRootDirectorySkipMerge = project.objects.property() + /** * The remote Open API 2.0/3.x specification URL location. */ @@ -400,6 +414,7 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { @Suppress("MemberVisibilityCanBePrivate") fun applyDefaults() { releaseNote.set("Minor update") + inputSpecRootDirectorySkipMerge.set(false) modelNamePrefix.set("") modelNameSuffix.set("") apiNameSuffix.set("") 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 a96e31d8f96..8da6bc79b0b 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 @@ -106,6 +106,10 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac /** * The Open API 2.0/3.x specification location. + * + * Be default, Gradle will treat the openApiGenerate task as up-to-date based only on this file, regardless of + * changes to any $ref referenced files. Use the `inputSpecRootDirectory` property to have Gradle track changes to + * an entire directory of spec files. */ @Optional @get:InputFile @@ -113,13 +117,23 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac val inputSpec = project.objects.property() /** - * Local root folder with spec files + * Local root folder with spec files. + * + * By default, a merged spec file will be generated based on the contents of the directory. To disable this, set the + * `inputSpecRootDirectorySkipMerge` property. */ @Optional @get:InputDirectory @PathSensitive(PathSensitivity.RELATIVE) val inputSpecRootDirectory = project.objects.property(); + /** + * Skip bundling all spec files into a merged spec file, if true. + */ + @Input + @Optional + val inputSpecRootDirectorySkipMerge = project.objects.property() + /** * Name of the file that will contain all merged specs */ @@ -625,9 +639,16 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac } inputSpecRootDirectory.ifNotEmpty { inputSpecRootDirectoryValue -> - run { - resolvedInputSpec = MergedSpecBuilder(inputSpecRootDirectoryValue, mergedFileName.getOrElse("merged")).buildMergedSpec() - logger.info("Merge input spec would be used - {}", resolvedInputSpec) + val skipMerge = inputSpecRootDirectorySkipMerge.get() + val runMergeSpec = !skipMerge + if (runMergeSpec) { + run { + resolvedInputSpec = MergedSpecBuilder( + inputSpecRootDirectoryValue, + mergedFileName.getOrElse("merged") + ).buildMergedSpec() + logger.info("Merge input spec would be used - {}", resolvedInputSpec) + } } }