Skip to content

Commit ae11608

Browse files
committed
implement feedback from CR. Add tests
1 parent 4e79178 commit ae11608

5 files changed

Lines changed: 59 additions & 0 deletions

File tree

modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.gradle.kotlin.dsl.listProperty
2323
import org.gradle.kotlin.dsl.mapProperty
2424
import org.gradle.kotlin.dsl.property
2525
import org.openapitools.generator.gradle.plugin.utils.isRemoteUri
26+
import java.io.File
2627

2728
/**
2829
* Gradle project level extension object definition for the `generate` task
@@ -448,8 +449,10 @@ open class OpenApiGeneratorGenerateExtension(private val project: Project) {
448449
fun setInputSpec(path: String) {
449450
if (path.isRemoteUri()) {
450451
remoteInputSpec.set(path)
452+
inputSpec.set(null as File?) // Clear local file to prevent conflicts
451453
} else {
452454
inputSpec.set(project.layout.projectDirectory.file(path))
455+
remoteInputSpec.set(null as String?) // Clear remote URL to prevent conflicts
453456
}
454457
}
455458

modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorValidateExtension.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.gradle.api.file.RegularFileProperty
2121
import org.gradle.api.provider.Property
2222
import org.gradle.kotlin.dsl.property
2323
import org.openapitools.generator.gradle.plugin.utils.isRemoteUri
24+
import java.io.File
2425

2526
/**
2627
* Gradle project level extension object definition for the generators task
@@ -58,8 +59,10 @@ open class OpenApiGeneratorValidateExtension(private val project: Project) {
5859
fun setInputSpec(path: String) {
5960
if (path.isRemoteUri()) {
6061
remoteInputSpec.set(path)
62+
inputSpec.set(null as File?) // Clear local file to prevent conflicts
6163
} else {
6264
inputSpec.set(project.layout.projectDirectory.file(path))
65+
remoteInputSpec.set(null as String?) // Clear remote URL to prevent conflicts
6366
}
6467
}
6568

modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import org.openapitools.codegen.config.CodegenConfigurator
3838
import org.openapitools.codegen.config.GlobalSettings
3939
import org.openapitools.codegen.config.MergedSpecBuilder
4040
import org.openapitools.generator.gradle.plugin.utils.isRemoteUri
41+
import java.io.File
4142
import javax.inject.Inject
4243

4344
// =========================================================================================
@@ -983,12 +984,15 @@ abstract class GenerateTask : DefaultTask() {
983984
/**
984985
* Groovy-compatible setter for inputSpec property.
985986
* Accepts a String and automatically routes to remote or local file based on URI detection.
987+
* Clears the opposite property to prevent stale values from taking precedence.
986988
*/
987989
fun setInputSpecAsString(path: String) {
988990
if (path.isRemoteUri()) {
989991
remoteInputSpec.set(path)
992+
inputSpec.set(null as File?) // Clear local file to prevent conflicts
990993
} else {
991994
inputSpec.set(layout.projectDirectory.file(path))
995+
remoteInputSpec.set(null as String?) // Clear remote URL to prevent conflicts
992996
}
993997
}
994998

modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/ValidateTask.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import org.gradle.api.tasks.options.Option
2828
import org.openapitools.codegen.validations.oas.OpenApiEvaluator
2929
import org.openapitools.codegen.validations.oas.RuleConfiguration
3030
import org.openapitools.generator.gradle.plugin.utils.isRemoteUri
31+
import java.io.File
3132
import javax.inject.Inject
3233

3334
/**
@@ -188,12 +189,15 @@ abstract class ValidateTask : DefaultTask() {
188189
/**
189190
* Groovy-compatible setter for inputSpec property.
190191
* Accepts a String and automatically routes to remote or local file based on URI detection.
192+
* Clears the opposite property to prevent stale values from taking precedence.
191193
*/
192194
fun setInputSpecAsString(path: String) {
193195
if (path.isRemoteUri()) {
194196
remoteInputSpec.set(path)
197+
inputSpec.set(null as File?) // Clear local file to prevent conflicts
195198
} else {
196199
inputSpec.set(layout.projectDirectory.file(path))
200+
remoteInputSpec.set(null as String?) // Clear remote URL to prevent conflicts
197201
}
198202
}
199203
}

modules/openapi-generator-gradle-plugin/src/test/kotlin/GroovyBridgeMethodsTest.kt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import kotlin.test.assertTrue
1212
* Test class for Groovy DSL bridge methods (setPropertyNameAsString pattern).
1313
* These tests verify that Groovy users can use both method-style and property-style
1414
* syntax to set file/directory properties using String paths.
15+
*
16+
* Also tests the fix for stale remoteInputSpec values.
1517
*/
1618
class GroovyBridgeMethodsTest : TestBase() {
1719
override var temp: File = createTempDirectory(javaClass.simpleName).toFile()
@@ -94,6 +96,49 @@ class GroovyBridgeMethodsTest : TestBase() {
9496
)
9597
}
9698

99+
@Test
100+
fun `setInputSpecAsString should clear stale remoteInputSpec when setting local file`() {
101+
// This test verifies the P2 bug fix: setting a local file after a remote URL
102+
// should clear the remote URL to prevent it from taking precedence
103+
val buildContents = """
104+
plugins {
105+
id 'org.openapi.generator'
106+
}
107+
108+
tasks.register('testGenerate', org.openapitools.generator.gradle.plugin.tasks.GenerateTask) {
109+
generatorName = "kotlin"
110+
// First set a remote URL (simulating previous configuration)
111+
setInputSpecAsString("https://example.com/api.yaml")
112+
// Then override with a local file - this should clear the remote URL
113+
setInputSpecAsString("spec.yaml")
114+
setOutputDirAsString("build/test-kotlin")
115+
apiPackage = "org.openapitools.test.api"
116+
invokerPackage = "org.openapitools.test.invoker"
117+
modelPackage = "org.openapitools.test.model"
118+
skipValidateSpec = true
119+
}
120+
""".trimIndent()
121+
122+
withProjectFiles(buildContents)
123+
124+
// Act
125+
val result = GradleRunner.create()
126+
.withProjectDir(temp)
127+
.withArguments("testGenerate")
128+
.withPluginClasspath()
129+
.build()
130+
131+
// Assert - should use local file, not remote URL
132+
assertTrue(
133+
result.output.contains("Successfully generated code to"),
134+
"Expected successful generation using local file (not remote URL)"
135+
)
136+
assertEquals(
137+
TaskOutcome.SUCCESS, result.task(":testGenerate")?.outcome,
138+
"Expected a successful run with local file overriding remote URL"
139+
)
140+
}
141+
97142
// Helper method to create project files
98143
private fun withProjectFiles(buildContents: String, includeConfig: Boolean = false, includeTemplates: Boolean = false) {
99144
File(temp, "build.gradle").writeText(buildContents)

0 commit comments

Comments
 (0)