Skip to content

Commit bf01b5c

Browse files
authored
Support using a custom spec (#29)
Allow generating a special version of the library using a GE API feature preview spec. Post-process generated files to work around: - OpenAPITools/openapi-generator#14871 - OpenAPITools/openapi-generator#14873
1 parent 5449aa8 commit bf01b5c

File tree

1 file changed

+53
-5
lines changed

1 file changed

+53
-5
lines changed

build.gradle.kts

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,34 @@ group = "com.github.gabrielfeo"
1414
version = "SNAPSHOT"
1515
val repoUrl = "https://github.com/gabrielfeo/gradle-enterprise-api-kotlin"
1616

17+
val localSpecPath = providers.gradleProperty("localSpecPath")
18+
val remoteSpecUrl = providers.gradleProperty("remoteSpecUrl").orElse(
19+
providers.gradleProperty("gradle.enterprise.version").map { geVersion ->
20+
val specName = "gradle-enterprise-$geVersion-api.yaml"
21+
"https://docs.gradle.com/enterprise/api-manual/ref/$specName"
22+
}
23+
)
24+
1725
val downloadApiSpec by tasks.registering {
18-
val geVersion = providers.gradleProperty("gradle.enterprise.version").get()
19-
val specName = "gradle-enterprise-$geVersion-api.yaml"
20-
val spec = resources.text.fromUri("https://docs.gradle.com/enterprise/api-manual/ref/$specName")
26+
onlyIf { !localSpecPath.isPresent() }
27+
val spec = resources.text.fromUri(remoteSpecUrl)
28+
val specName = remoteSpecUrl.map { it.substringAfterLast('/') }
2129
val outFile = project.layout.buildDirectory.file(specName)
22-
inputs.property("GE version", geVersion)
30+
inputs.property("Spec URL", remoteSpecUrl)
2331
outputs.file(outFile)
2432
doLast {
33+
logger.info("Downloaded API spec from ${remoteSpecUrl.get()}")
2534
spec.asFile().renameTo(outFile.get().asFile)
2635
}
2736
}
2837

2938
openApiGenerate {
3039
generatorName.set("kotlin")
31-
inputSpec.set(downloadApiSpec.map { it.outputs.files.first().absolutePath })
40+
val spec = when {
41+
localSpecPath.isPresent() -> localSpecPath.map { File(it).absolutePath }
42+
else -> downloadApiSpec.map { it.outputs.files.first().absolutePath }
43+
}
44+
inputSpec.set(spec)
3245
val generateDir = project.layout.buildDirectory.file("generated/openapi-generator")
3346
outputDir.set(generateDir.map { it.asFile.absolutePath })
3447
val ignoreFile = project.layout.projectDirectory.file(".openapi-generator-ignore")
@@ -42,6 +55,9 @@ openApiGenerate {
4255
}
4356

4457
tasks.openApiGenerate.configure {
58+
doFirst {
59+
logger.info("Using API spec ${inputSpec.get()}")
60+
}
4561
// Replace Response<X> with X in every method return type of GradleEnterpriseApi.kt
4662
doLast {
4763
val apiFile = File(
@@ -57,6 +73,38 @@ tasks.openApiGenerate.configure {
5773
)
5874
}
5975
}
76+
// Workaround for properties generated with `arrayListOf(null,null)` as default value
77+
doLast {
78+
val srcDir = File(outputDir.get(), "src/main/kotlin")
79+
ant.withGroovyBuilder {
80+
"replaceregexp"(
81+
"match" to """arrayListOf\(null,null\)""",
82+
"replace" to """emptyList()""",
83+
"flags" to "gm",
84+
) {
85+
"fileset"(
86+
"dir" to srcDir
87+
)
88+
}
89+
}
90+
}
91+
// Workaround for missing imports of exploded queries
92+
doLast {
93+
val srcDir = File(outputDir.get(), "src/main/kotlin")
94+
val modelPackage = openApiGenerate.modelPackage.get()
95+
val modelPackagePattern = modelPackage.replace(".", "\\.")
96+
ant.withGroovyBuilder {
97+
"replaceregexp"(
98+
"match" to """(?:import $modelPackagePattern.[.\w]+\s)+""",
99+
"replace" to "import $modelPackage.*\n",
100+
"flags" to "m",
101+
) {
102+
"fileset"(
103+
"dir" to srcDir
104+
)
105+
}
106+
}
107+
}
60108
}
61109

62110
sourceSets {

0 commit comments

Comments
 (0)