From 59e1dd9a3f1ddec6095ee3d4e1ac9db0284f5376 Mon Sep 17 00:00:00 2001 From: Leon Linhart Date: Tue, 30 Sep 2025 13:21:46 +0200 Subject: [PATCH] Make Gradle properties non-nullable They were never really intended to support null values, so this is kind of a bug. However, this is technically also breaking for users that set these properties to `null` explicitly (instead of leaving them unset). --- .../OpenApiGeneratorGenerateExtension.kt | 26 +++++----- .../gradle/plugin/tasks/GenerateTask.kt | 49 ++++++++----------- 2 files changed, 33 insertions(+), 42 deletions(-) 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 8d7d31d5d1fb..3d5a3489cf01 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 @@ -81,12 +81,12 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { /** * The template directory holding a custom template. */ - val templateDir = project.objects.property() + val templateDir = project.objects.property() /** * The template location (which may be a directory or a classpath location) holding custom templates. */ - val templateResourcePath = project.objects.property() + val templateResourcePath = project.objects.property() /** * Adds authorization headers when fetching the OpenAPI definitions remotely. @@ -109,7 +109,7 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { /** * Specifies if the existing files should be overwritten during the generation. */ - val skipOverwrite = project.objects.property() + val skipOverwrite = project.objects.property() /** * Package for generated classes (where supported) @@ -244,32 +244,32 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { /** * Reference the library template (sub-template) of a generator. */ - val library = project.objects.property() + val library = project.objects.property() /** * Git host, e.g. gitlab.com. */ - val gitHost = project.objects.property() + val gitHost = project.objects.property() /** * Git user ID, e.g. openapitools. */ - val gitUserId = project.objects.property() + val gitUserId = project.objects.property() /** * Git repo ID, e.g. openapi-generator. */ - val gitRepoId = project.objects.property() + val gitRepoId = project.objects.property() /** * Release note, default to 'Minor update'. */ - val releaseNote = project.objects.property() + val releaseNote = project.objects.property() /** * HTTP user agent, e.g. codegen_csharp_api_client, default to 'OpenAPI-Generator/{packageVersion}/{language}' */ - val httpUserAgent = project.objects.property() + val httpUserAgent = project.objects.property() /** * Specifies how a reserved name should be escaped to. Otherwise, the default _ is used. @@ -279,17 +279,17 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { /** * Specifies an override location for the .openapi-generator-ignore file. Most useful on initial generation. */ - val ignoreFileOverride = project.objects.property() + val ignoreFileOverride = project.objects.property() /** * Remove prefix of operationId, e.g. config_getId => getId */ - val removeOperationIdPrefix = project.objects.property() + val removeOperationIdPrefix = project.objects.property() /** * Skip examples defined in the operation */ - val skipOperationExample = project.objects.property() + val skipOperationExample = project.objects.property() /** * Defines which API-related files should be generated. This allows you to create a subset of generated files (or none at all). @@ -394,7 +394,7 @@ open class OpenApiGeneratorGenerateExtension(project: Project) { /** * Templating engine: "mustache" (default) or "handlebars" (beta) */ - val engine = project.objects.property() + val engine = project.objects.property() /** * Defines whether the output dir should be cleaned up before generating the output. 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 ede44708d03c..61b66a1d409a 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 @@ -55,7 +55,6 @@ import org.openapitools.codegen.config.MergedSpecBuilder * * @author Jim Schubert */ -@Suppress("UnstableApiUsage") @CacheableTask open class GenerateTask @Inject constructor(private val objectFactory: ObjectFactory) : DefaultTask() { @@ -154,14 +153,14 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac @get:Optional @get:InputDirectory @get:PathSensitive(PathSensitivity.RELATIVE) - val templateDir = project.objects.property() + val templateDir = project.objects.property() /** * Resource path containing template files. */ @get:Optional @get:Input - val templateResourcePath = project.objects.property() + val templateResourcePath = project.objects.property() /** * Adds authorization headers when fetching the OpenAPI definitions remotely. @@ -193,7 +192,7 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac */ @get:Optional @get:Input - val skipOverwrite = project.objects.property() + val skipOverwrite = project.objects.property() /** * Package for generated classes (where supported) @@ -384,42 +383,42 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac */ @get:Optional @get:Input - val library = project.objects.property() + val library = project.objects.property() /** * Git host, e.g. gitlab.com. */ @get:Optional @get:Input - val gitHost = project.objects.property() + val gitHost = project.objects.property() /** * Git user ID, e.g. openapitools. */ @get:Optional @get:Input - val gitUserId = project.objects.property() + val gitUserId = project.objects.property() /** * Git repo ID, e.g. openapi-generator. */ @get:Optional @get:Input - val gitRepoId = project.objects.property() + val gitRepoId = project.objects.property() /** * Release note, default to 'Minor update'. */ @get:Optional @get:Input - val releaseNote = project.objects.property() + val releaseNote = project.objects.property() /** * HTTP user agent, e.g. codegen_csharp_api_client, default to 'OpenAPI-Generator/{packageVersion}/{language}' */ @get:Optional @get:Input - val httpUserAgent = project.objects.property() + val httpUserAgent = project.objects.property() /** * Specifies how a reserved name should be escaped to. @@ -434,21 +433,21 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac @get:Optional @get:InputFile @get:PathSensitive(PathSensitivity.RELATIVE) - val ignoreFileOverride = project.objects.property() + val ignoreFileOverride = project.objects.property() /** * Remove prefix of operationId, e.g. config_getId => getId */ @get:Optional @get:Input - val removeOperationIdPrefix = project.objects.property() + val removeOperationIdPrefix = project.objects.property() /** * Remove examples defined in the operation */ @get:Optional @get:Input - val skipOperationExample = project.objects.property() + val skipOperationExample = project.objects.property() /** * Defines which API-related files should be generated. This allows you to create a subset of generated files (or none at all). @@ -581,7 +580,7 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac */ @get:Optional @get:Input - val engine = project.objects.property() + val engine = project.objects.property() /** * Defines whether the output dir should be cleaned up before generating the output. @@ -598,19 +597,11 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac @get:Input val dryRun = project.objects.property() - private fun Property.ifNotEmpty(block: Property.(T) -> Unit) { + private fun Property.ifNotEmpty(block: Property.(T) -> Unit) { if (isPresent) { - val item: T? = get() - if (item != null) { - when (get()) { - is String -> if ((get() as String).isNotEmpty()) { - block(get()) - } - is String? -> if (true == (get() as String?)?.isNotEmpty()) { - block(get()) - } - else -> block(get()) - } + when (val value = get()) { + is String -> if (value.isNotEmpty()) block(value) + else -> block(value) } } } @@ -725,7 +716,7 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac } skipOverwrite.ifNotEmpty { value -> - configurator.setSkipOverwrite(value ?: false) + configurator.setSkipOverwrite(value) } generatorName.ifNotEmpty { value -> @@ -820,11 +811,11 @@ open class GenerateTask @Inject constructor(private val objectFactory: ObjectFac } removeOperationIdPrefix.ifNotEmpty { value -> - configurator.setRemoveOperationIdPrefix(value!!) + configurator.setRemoveOperationIdPrefix(value) } skipOperationExample.ifNotEmpty { value -> - configurator.setSkipOperationExample(value!!) + configurator.setSkipOperationExample(value) } logToStderr.ifNotEmpty { value ->