Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ data class GenerateProjectRequest(
language = language,
typeOfProjectRequested = typeOfProjectRequested,
classesPerModule = classesPerModule,
versions = resolveVersions(
versions = VersionsResolver.resolve(
fileVersions = versionsFile,
dependencyInjection = dependencyInjection,
develocityUrl = develocityUrl,
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<UsageError> {
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}
}
Loading