Skip to content

Commit 70effde

Browse files
authored
Support Gradle version in versions.yaml with CLI override precedence (#281)
1 parent 58ff24c commit 70effde

7 files changed

Lines changed: 70 additions & 16 deletions

File tree

cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateVersionsYaml.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package io.github.cdsap.projectgenerator.cli
22

33
import io.github.cdsap.projectgenerator.model.AdditionalPlugin
44
import io.github.cdsap.projectgenerator.model.Versions
5+
import io.github.cdsap.projectgenerator.model.Gradle
56
import java.io.File
67

78
class GenerateVersionsYaml {
89
fun generate() {
910
val file = File("versions.yaml")
1011
val versions = Versions()
1112
val content = """
13+
|gradle: ${Gradle.GRADLE_9_4_0}
1214
|project:
1315
| develocity: ${versions.project.develocity}
1416
| develocityUrl: ${versions.project.develocityUrl}

cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,14 @@ class GenerateProjects : CliktCommand(name = "generate-project") {
4242
private val typeOfStringResources: String by option().choice("large", "normal").default("normal")
4343
private val layers by option().int().default(5)
4444
private val generateUnitTest by option().flag(default = false)
45-
private val gradle: String by option().choice(
45+
private val gradle: String? by option().choice(
4646
"gradle_8_14_3",
4747
"gradle_9_1_0",
4848
"gradle_9_2_0",
4949
"gradle_9_3_0",
5050
"gradle_9_3_1",
5151
"gradle_9_4_0"
5252
)
53-
.default("gradle_9_4_0")
5453
private val develocity by option().flag(default = false)
5554
private val versionsFile by option().file()
5655
private val projectName by option()
@@ -68,8 +67,9 @@ class GenerateProjects : CliktCommand(name = "generate-project") {
6867
if (typeOfProjectRequested != TypeProjectRequested.ANDROID && kotlinMultiplatformLibrary) {
6968
throw UsageError("--android-kotlin-multiplatform-library is only available when --type android.")
7069
}
70+
val versionsOverride = versionsFile?.let(VersionsParser::fromFile)
7171
val versions = getVersions(
72-
fileVersions = versionsFile,
72+
fileVersions = versionsOverride,
7373
develocityUrl = develocityUrl,
7474
roomDatabase = roomDatabase,
7575
kotlinMultiplatformLibrary = kotlinMultiplatformLibrary
@@ -85,7 +85,7 @@ class GenerateProjects : CliktCommand(name = "generate-project") {
8585
TypeOfStringResources.valueOf(typeOfStringResources.uppercase()),
8686
layers,
8787
generateUnitTest,
88-
GradleWrapper(Gradle.valueOf(gradle.uppercase())),
88+
GradleWrapper(resolveGradle(gradle, versionsOverride)),
8989
develocity = develocityEnabled,
9090
projectName = projectName ?: buildString {
9191
append(typeOfProjectRequested.name.lowercase())
@@ -105,13 +105,13 @@ class GenerateProjects : CliktCommand(name = "generate-project") {
105105
}
106106

107107
private fun getVersions(
108-
fileVersions: File?,
108+
fileVersions: VersionsFile?,
109109
develocityUrl: String?,
110110
roomDatabase: Boolean,
111111
kotlinMultiplatformLibrary: Boolean
112112
): Versions {
113113
val versions = if (fileVersions != null) {
114-
VersionsParser.fromFile(fileVersions)
114+
fileVersions.resolve()
115115
} else {
116116
Versions()
117117
}
@@ -132,6 +132,12 @@ class GenerateProjects : CliktCommand(name = "generate-project") {
132132
}
133133
}
134134

135+
internal fun resolveGradle(cliGradle: String?, versionsFile: VersionsFile?): Gradle {
136+
return cliGradle?.let { Gradle.valueOf(it.uppercase()) }
137+
?: versionsFile?.gradle
138+
?: Gradle.GRADLE_9_4_0
139+
}
140+
135141
class GenerateYaml : CliktCommand(name = "generate-yaml-versions") {
136142
override fun run() {
137143
GenerateVersionsYaml().generate()

cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/VersionsParser.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,25 @@ package io.github.cdsap.projectgenerator.cli
22

33
import com.fasterxml.jackson.annotation.JsonSetter
44
import com.fasterxml.jackson.annotation.Nulls
5+
import com.fasterxml.jackson.databind.MapperFeature
56
import com.fasterxml.jackson.databind.ObjectMapper
67
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
78
import com.fasterxml.jackson.module.kotlin.KotlinModule
89
import io.github.cdsap.projectgenerator.model.VersionsFile
9-
import io.github.cdsap.projectgenerator.model.Versions
1010
import java.io.File
1111

1212
object VersionsParser {
1313

1414
private val mapper = ObjectMapper(YAMLFactory()).apply {
1515
registerModule(KotlinModule())
16+
enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS)
1617
configOverride(List::class.java).setterInfo = JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY)
1718
}
1819

1920
/**
20-
* Parses a YAML file into [Versions].
21+
* Parses a YAML file into [VersionsFile].
2122
* [VersionsFile] keeps plugin list fields nullable so omitted YAML keys can resolve to empty lists
22-
* instead of inheriting the runtime defaults from [Versions].
23+
* instead of inheriting the runtime defaults from [io.github.cdsap.projectgenerator.model.Versions].
2324
*/
24-
fun fromFile(file: File): Versions = mapper.readValue(file, VersionsFile::class.java).resolve()
25+
fun fromFile(file: File): VersionsFile = mapper.readValue(file, VersionsFile::class.java)
2526
}

cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package io.github.cdsap.projectgenerator.cli
22

33
import com.github.ajalt.clikt.core.UsageError
44
import com.github.ajalt.clikt.core.parse
5+
import io.github.cdsap.projectgenerator.model.Gradle
6+
import io.github.cdsap.projectgenerator.model.VersionsFile
7+
import org.junit.jupiter.api.Assertions.assertEquals
58
import org.junit.jupiter.api.Assertions.assertTrue
69
import org.junit.jupiter.api.Test
710
import org.junit.jupiter.api.assertThrows
@@ -36,4 +39,25 @@ class GenerateProjectsCliTest {
3639
}
3740
assertTrue(error.message?.contains("classes per module must be >= 10") == true)
3841
}
42+
43+
@Test
44+
fun `gradle from versions file is used when flag is absent`() {
45+
val resolved = resolveGradle(null, VersionsFile(gradle = Gradle.GRADLE_9_3_1))
46+
47+
assertEquals(Gradle.GRADLE_9_3_1, resolved)
48+
}
49+
50+
@Test
51+
fun `gradle flag overrides versions file`() {
52+
val resolved = resolveGradle("gradle_9_4_0", VersionsFile(gradle = Gradle.GRADLE_9_3_1))
53+
54+
assertEquals(Gradle.GRADLE_9_4_0, resolved)
55+
}
56+
57+
@Test
58+
fun `latest gradle is used when neither flag nor versions file provide one`() {
59+
val resolved = resolveGradle(null, null)
60+
61+
assertEquals(Gradle.GRADLE_9_4_0, resolved)
62+
}
3963
}

cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/VersionsParserTest.kt

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.cdsap.projectgenerator.cli
22

33
import io.github.cdsap.projectgenerator.model.AdditionalPlugin
4+
import io.github.cdsap.projectgenerator.model.Gradle
45
import org.junit.jupiter.api.Assertions.assertEquals
56
import org.junit.jupiter.api.Assertions.assertTrue
67
import org.junit.jupiter.api.Test
@@ -23,7 +24,7 @@ class VersionsParserTest {
2324
""".trimIndent()
2425

2526
val file = File(tempDir.toFile(), "versions.yaml").apply { writeText(yaml) }
26-
val versions = VersionsParser.fromFile(file)
27+
val versions = VersionsParser.fromFile(file).resolve()
2728

2829
assertTrue(versions.additionalSettingsPlugins.isEmpty())
2930
assertTrue(versions.additionalBuildGradleRootPlugins.isEmpty())
@@ -47,7 +48,7 @@ class VersionsParserTest {
4748
""".trimIndent()
4849

4950
val file = File(tempDir.toFile(), "versions.yaml").apply { writeText(yaml) }
50-
val versions = VersionsParser.fromFile(file)
51+
val versions = VersionsParser.fromFile(file).resolve()
5152

5253
assertEquals(1, versions.additionalSettingsPlugins.size)
5354
assertEquals(AdditionalPlugin("com.fueledbycaffeine.spotlight", "1.4.1", true), versions.additionalSettingsPlugins.first())
@@ -66,7 +67,7 @@ class VersionsParserTest {
6667
""".trimIndent()
6768

6869
val file = File(tempDir.toFile(), "versions.yaml").apply { writeText(yaml) }
69-
val versions = VersionsParser.fromFile(file)
70+
val versions = VersionsParser.fromFile(file).resolve()
7071

7172
assertTrue(versions.additionalSettingsPlugins.isEmpty())
7273
assertTrue(versions.additionalBuildGradleRootPlugins.isEmpty())
@@ -83,7 +84,7 @@ class VersionsParserTest {
8384
""".trimIndent()
8485

8586
val file = File(tempDir.toFile(), "versions.yaml").apply { writeText(yaml) }
86-
val versions = VersionsParser.fromFile(file)
87+
val versions = VersionsParser.fromFile(file).resolve()
8788

8889
assertEquals(1, versions.additionalSettingsPlugins.size)
8990
assertTrue(versions.additionalBuildGradleRootPlugins.isEmpty())
@@ -100,7 +101,7 @@ class VersionsParserTest {
100101
""".trimIndent()
101102

102103
val file = File(tempDir.toFile(), "versions.yaml").apply { writeText(yaml) }
103-
val versions = VersionsParser.fromFile(file)
104+
val versions = VersionsParser.fromFile(file).resolve()
104105

105106
assertTrue(versions.additionalSettingsPlugins.isEmpty())
106107
assertEquals(1, versions.additionalBuildGradleRootPlugins.size)
@@ -117,9 +118,21 @@ class VersionsParserTest {
117118
""".trimIndent()
118119

119120
val file = File(tempDir.toFile(), "versions.yaml").apply { writeText(yaml) }
120-
val versions = VersionsParser.fromFile(file)
121+
val versions = VersionsParser.fromFile(file).resolve()
121122

122123
assertTrue(versions.additionalSettingsPlugins.isEmpty())
123124
assertTrue(versions.additionalBuildGradleRootPlugins.isEmpty())
124125
}
126+
127+
@Test
128+
fun `parses gradle from YAML case insensitively`() {
129+
val yaml = """
130+
gradle: gradle_9_3_1
131+
""".trimIndent()
132+
133+
val file = File(tempDir.toFile(), "versions.yaml").apply { writeText(yaml) }
134+
val versionsFile = VersionsParser.fromFile(file)
135+
136+
assertEquals(Gradle.GRADLE_9_3_1, versionsFile.gradle)
137+
}
125138
}

project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/VersionsFile.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.cdsap.projectgenerator.model
22

33
data class VersionsFile(
4+
val gradle: Gradle? = null,
45
val kotlin: Kotlin = Kotlin(),
56
val android: Android = Android(),
67
val testing: Testing = Testing(),

project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/model/VersionsFileTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,11 @@ class VersionsFileTest {
3535
versions.additionalBuildGradleRootPlugins
3636
)
3737
}
38+
39+
@Test
40+
fun `gradle override is preserved in versions file`() {
41+
val versionsFile = VersionsFile(gradle = Gradle.GRADLE_9_3_1)
42+
43+
assertEquals(Gradle.GRADLE_9_3_1, versionsFile.gradle)
44+
}
3845
}

0 commit comments

Comments
 (0)