diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt index ed4b53f..99b2220 100644 --- a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt @@ -81,7 +81,7 @@ data class GenerateProjectRequest( language = language, typeOfProjectRequested = typeOfProjectRequested, classesPerModule = classesPerModule, - versions = resolveVersions( + versions = VersionsResolver.resolve( fileVersions = versionsFile, dependencyInjection = dependencyInjection, develocityUrl = develocityUrl, @@ -131,33 +131,6 @@ internal fun resolveDevelocityEnabled(develocity: Boolean, develocityUrl: String return develocity || develocityUrl != null } -internal fun resolveVersions( - fileVersions: VersionsFile?, - dependencyInjection: DependencyInjection, - develocityUrl: String?, - roomDatabase: Boolean, - kotlinMultiplatformLibrary: Boolean -): Versions { - val versions = if (fileVersions != null) { - fileVersions.resolve() - } else { - Versions() - } - var androidConfig = versions.android - if (roomDatabase) { - androidConfig = androidConfig.copy(roomDatabase = true) - } - if (kotlinMultiplatformLibrary) { - androidConfig = androidConfig.copy(kotlinMultiplatformLibrary = true) - } - val withAndroidFlags = versions.copy(android = androidConfig, di = dependencyInjection) - return if (develocityUrl != null) { - withAndroidFlags.copy(project = withAndroidFlags.project.copy(develocityUrl = develocityUrl)) - } else { - withAndroidFlags - } -} - internal fun resolveProjectRootPath(outputDir: String?, language: Language, projectName: String): String { return if (outputDir != null) { outputDir diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/VersionsResolver.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/VersionsResolver.kt new file mode 100644 index 0000000..6ecc080 --- /dev/null +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/VersionsResolver.kt @@ -0,0 +1,35 @@ +package io.github.cdsap.projectgenerator.cli + +import io.github.cdsap.projectgenerator.model.DependencyInjection +import io.github.cdsap.projectgenerator.model.Versions +import io.github.cdsap.projectgenerator.model.VersionsFile + +object VersionsResolver { + fun resolve( + fileVersions: VersionsFile?, + dependencyInjection: DependencyInjection, + develocityUrl: String?, + roomDatabase: Boolean, + kotlinMultiplatformLibrary: Boolean + ): Versions { + val versions = if (fileVersions != null) { + fileVersions.resolve() + } else { + Versions() + } + // CLI flags only enable features; false must not clear values from --versions-file. + var androidConfig = versions.android + if (roomDatabase) { + androidConfig = androidConfig.copy(roomDatabase = true) + } + if (kotlinMultiplatformLibrary) { + androidConfig = androidConfig.copy(kotlinMultiplatformLibrary = true) + } + val withAndroidFlags = versions.copy(android = androidConfig, di = dependencyInjection) + return if (develocityUrl != null) { + withAndroidFlags.copy(project = withAndroidFlags.project.copy(develocityUrl = develocityUrl)) + } else { + withAndroidFlags + } + } +} diff --git a/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt b/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt index 98b57dd..97d5754 100644 --- a/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt +++ b/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt @@ -2,17 +2,14 @@ package io.github.cdsap.projectgenerator.cli import com.github.ajalt.clikt.core.UsageError import com.github.ajalt.clikt.core.parse -import io.github.cdsap.projectgenerator.model.Android import io.github.cdsap.projectgenerator.model.ClassesPerModule import io.github.cdsap.projectgenerator.model.ClassesPerModuleType import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.Gradle import io.github.cdsap.projectgenerator.model.Language -import io.github.cdsap.projectgenerator.model.Project import io.github.cdsap.projectgenerator.model.Shape import io.github.cdsap.projectgenerator.model.TypeOfStringResources import io.github.cdsap.projectgenerator.model.TypeProjectRequested -import io.github.cdsap.projectgenerator.model.Versions import io.github.cdsap.projectgenerator.model.VersionsFile import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertFalse @@ -22,83 +19,6 @@ import org.junit.jupiter.api.assertThrows class GenerateProjectsCliTest { - @Test - fun `resolveVersions uses defaults when versions file is absent`() { - val resolved = resolveVersions( - fileVersions = null, - dependencyInjection = DependencyInjection.HILT, - develocityUrl = null, - roomDatabase = false, - kotlinMultiplatformLibrary = false - ) - - assertEquals(Versions(), resolved) - } - - @Test - fun `resolveVersions keeps versions-file values when cli overrides are absent`() { - val fileVersions = VersionsFile( - project = Project(develocityUrl = "https://develocity.example"), - android = Android(roomDatabase = true, kotlinMultiplatformLibrary = true), - di = DependencyInjection.METRO - ) - - val resolved = resolveVersions( - fileVersions = fileVersions, - dependencyInjection = DependencyInjection.HILT, - develocityUrl = null, - roomDatabase = false, - kotlinMultiplatformLibrary = false - ) - - assertEquals("https://develocity.example", resolved.project.develocityUrl) - assertTrue(resolved.android.roomDatabase) - assertTrue(resolved.android.kotlinMultiplatformLibrary) - assertEquals(DependencyInjection.HILT, resolved.di) - } - - @Test - fun `resolveVersions applies cli overrides for develocity room kmp and di`() { - val fileVersions = VersionsFile( - project = Project(develocityUrl = "https://from-file.example"), - android = Android(roomDatabase = false, kotlinMultiplatformLibrary = false), - di = DependencyInjection.HILT - ) - - val resolved = resolveVersions( - fileVersions = fileVersions, - dependencyInjection = DependencyInjection.NONE, - develocityUrl = "https://from-cli.example", - roomDatabase = true, - kotlinMultiplatformLibrary = true - ) - - assertEquals("https://from-cli.example", resolved.project.develocityUrl) - assertTrue(resolved.android.roomDatabase) - assertTrue(resolved.android.kotlinMultiplatformLibrary) - assertEquals(DependencyInjection.NONE, resolved.di) - } - - @Test - fun `resolveVersions does not clear file android flags when cli flags are false`() { - val fileVersions = VersionsFile( - android = Android(roomDatabase = true, kotlinMultiplatformLibrary = true) - ) - - val resolved = resolveVersions( - fileVersions = fileVersions, - dependencyInjection = DependencyInjection.METRO, - develocityUrl = null, - roomDatabase = false, - kotlinMultiplatformLibrary = false - ) - - assertTrue(resolved.android.roomDatabase) - assertTrue(resolved.android.kotlinMultiplatformLibrary) - assertEquals("", resolved.project.develocityUrl) - assertEquals(DependencyInjection.METRO, resolved.di) - } - @Test fun `room database flag is rejected for jvm type`() { val error = assertThrows { diff --git a/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/VersionsResolverTest.kt b/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/VersionsResolverTest.kt new file mode 100644 index 0000000..e6c352a --- /dev/null +++ b/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/VersionsResolverTest.kt @@ -0,0 +1,90 @@ +package io.github.cdsap.projectgenerator.cli + +import io.github.cdsap.projectgenerator.model.Android +import io.github.cdsap.projectgenerator.model.DependencyInjection +import io.github.cdsap.projectgenerator.model.Project +import io.github.cdsap.projectgenerator.model.Versions +import io.github.cdsap.projectgenerator.model.VersionsFile +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +class VersionsResolverTest { + + @Test + fun `resolve uses defaults when versions file is absent`() { + val resolved = VersionsResolver.resolve( + fileVersions = null, + dependencyInjection = DependencyInjection.HILT, + develocityUrl = null, + roomDatabase = false, + kotlinMultiplatformLibrary = false + ) + + assertEquals(Versions(), resolved) + } + + @Test + fun `resolve keeps versions-file values when cli overrides are absent`() { + val fileVersions = VersionsFile( + project = Project(develocityUrl = "https://develocity.example"), + android = Android(roomDatabase = true, kotlinMultiplatformLibrary = true), + di = DependencyInjection.METRO + ) + + val resolved = VersionsResolver.resolve( + fileVersions = fileVersions, + dependencyInjection = DependencyInjection.HILT, + develocityUrl = null, + roomDatabase = false, + kotlinMultiplatformLibrary = false + ) + + assertEquals("https://develocity.example", resolved.project.develocityUrl) + assertTrue(resolved.android.roomDatabase) + assertTrue(resolved.android.kotlinMultiplatformLibrary) + assertEquals(DependencyInjection.HILT, resolved.di) + } + + @Test + fun `resolve applies cli overrides for develocity room kmp and di`() { + val fileVersions = VersionsFile( + project = Project(develocityUrl = "https://from-file.example"), + android = Android(roomDatabase = false, kotlinMultiplatformLibrary = false), + di = DependencyInjection.HILT + ) + + val resolved = VersionsResolver.resolve( + fileVersions = fileVersions, + dependencyInjection = DependencyInjection.NONE, + develocityUrl = "https://from-cli.example", + roomDatabase = true, + kotlinMultiplatformLibrary = true + ) + + assertEquals("https://from-cli.example", resolved.project.develocityUrl) + assertTrue(resolved.android.roomDatabase) + assertTrue(resolved.android.kotlinMultiplatformLibrary) + assertEquals(DependencyInjection.NONE, resolved.di) + } + + @Test + fun `resolve does not clear file android flags when cli flags are false`() { + val fileVersions = VersionsFile( + android = Android(roomDatabase = true, kotlinMultiplatformLibrary = true) + ) + + val resolved = VersionsResolver.resolve( + fileVersions = fileVersions, + dependencyInjection = DependencyInjection.METRO, + develocityUrl = null, + roomDatabase = false, + kotlinMultiplatformLibrary = false + ) + + assertTrue(resolved.android.roomDatabase) + assertTrue(resolved.android.kotlinMultiplatformLibrary) + assertEquals("", resolved.project.develocityUrl) + assertEquals(DependencyInjection.METRO, resolved.di) + } +}