From 6df685d50790a1881155231fad5b076fcbc0c867 Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Thu, 27 Aug 2026 11:46:36 -0700 Subject: [PATCH] fix: refactor cli generation options to a request object --- .../cli/GenerateProjectRequest.kt | 19 +++++++ .../github/cdsap/projectgenerator/cli/Main.kt | 16 ++---- .../cli/GenerateProjectsCliTest.kt | 54 +++++++++++++++++++ 3 files changed, 76 insertions(+), 13 deletions(-) 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 1d09b4b..ed4b53f 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 @@ -1,5 +1,6 @@ package io.github.cdsap.projectgenerator.cli +import com.github.ajalt.clikt.core.UsageError import io.github.cdsap.projectgenerator.ProjectGenerator import io.github.cdsap.projectgenerator.model.ClassesPerModule import io.github.cdsap.projectgenerator.model.DependencyInjection @@ -63,6 +64,11 @@ data class GenerateProjectRequest( roomDatabase: Boolean, kotlinMultiplatformLibrary: Boolean ): GenerateProjectRequest { + validateAndroidOnlyFeatures( + typeOfProjectRequested = typeOfProjectRequested, + roomDatabase = roomDatabase, + kotlinMultiplatformLibrary = kotlinMultiplatformLibrary + ) val resolvedProjectName = resolveProjectName( projectName, typeOfProjectRequested, @@ -94,6 +100,19 @@ data class GenerateProjectRequest( } } +internal fun validateAndroidOnlyFeatures( + typeOfProjectRequested: TypeProjectRequested, + roomDatabase: Boolean, + kotlinMultiplatformLibrary: Boolean +) { + if (typeOfProjectRequested != TypeProjectRequested.ANDROID && roomDatabase) { + throw UsageError("--room-database is only available when --type android.") + } + if (typeOfProjectRequested != TypeProjectRequested.ANDROID && kotlinMultiplatformLibrary) { + throw UsageError("--android-kotlin-multiplatform-library is only available when --type android.") + } +} + internal fun resolveProjectName( projectName: String?, typeOfProjectRequested: TypeProjectRequested, diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt index 4514b32..5ffe366 100644 --- a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt @@ -1,7 +1,6 @@ package io.github.cdsap.projectgenerator.cli import com.github.ajalt.clikt.core.CliktCommand -import com.github.ajalt.clikt.core.UsageError import com.github.ajalt.clikt.core.main import com.github.ajalt.clikt.core.subcommands import com.github.ajalt.clikt.parameters.options.* @@ -56,20 +55,11 @@ class GenerateProjects : CliktCommand(name = "generate-project") { private val kotlinMultiplatformLibrary by option("--android-kotlin-multiplatform-library").flag(default = false) override fun run() { - val typeOfProjectRequested = TypeProjectRequested.valueOf(type.uppercase()) - val shape = Shape.valueOf(shape.uppercase()) - val dependencyInjection = DependencyInjection.valueOf(di.uppercase()) - if (typeOfProjectRequested != TypeProjectRequested.ANDROID && roomDatabase) { - throw UsageError("--room-database is only available when --type android.") - } - if (typeOfProjectRequested != TypeProjectRequested.ANDROID && kotlinMultiplatformLibrary) { - throw UsageError("--android-kotlin-multiplatform-library is only available when --type android.") - } GenerateProjectRequest.resolve( modules = modules, - shape = shape, + shape = Shape.valueOf(shape.uppercase()), language = Language.valueOf(language.uppercase()), - typeOfProjectRequested = typeOfProjectRequested, + typeOfProjectRequested = TypeProjectRequested.valueOf(type.uppercase()), classesPerModule = ClassesPerModule( ClassesPerModuleType.valueOf(classesModuleType.uppercase()), classesModule @@ -83,7 +73,7 @@ class GenerateProjects : CliktCommand(name = "generate-project") { versionsFile = versionsFile?.let(VersionsParser::fromFile), outputDir = outputDir, projectName = projectName, - dependencyInjection = dependencyInjection, + dependencyInjection = DependencyInjection.valueOf(di.uppercase()), roomDatabase = roomDatabase, kotlinMultiplatformLibrary = kotlinMultiplatformLibrary ).toProjectGenerator().write() 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 77fd153..98b57dd 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 @@ -129,6 +129,60 @@ class GenerateProjectsCliTest { ) } + @Test + fun `resolve rejects room database for jvm type`() { + val error = assertThrows { + GenerateProjectRequest.resolve( + modules = 6, + shape = Shape.RECTANGLE, + language = Language.KTS, + typeOfProjectRequested = TypeProjectRequested.JVM, + classesPerModule = ClassesPerModule(ClassesPerModuleType.FIXED, 10), + typeOfStringResources = TypeOfStringResources.NORMAL, + layers = 5, + generateUnitTest = false, + cliGradle = null, + develocityFlag = false, + develocityUrl = null, + versionsFile = null, + outputDir = null, + projectName = null, + dependencyInjection = DependencyInjection.HILT, + roomDatabase = true, + kotlinMultiplatformLibrary = false + ) + } + assertTrue(error.message?.contains("--room-database is only available when --type android.") == true) + } + + @Test + fun `resolve rejects android kotlin multiplatform library for jvm type`() { + val error = assertThrows { + GenerateProjectRequest.resolve( + modules = 6, + shape = Shape.RECTANGLE, + language = Language.KTS, + typeOfProjectRequested = TypeProjectRequested.JVM, + classesPerModule = ClassesPerModule(ClassesPerModuleType.FIXED, 10), + typeOfStringResources = TypeOfStringResources.NORMAL, + layers = 5, + generateUnitTest = false, + cliGradle = null, + develocityFlag = false, + develocityUrl = null, + versionsFile = null, + outputDir = null, + projectName = null, + dependencyInjection = DependencyInjection.HILT, + roomDatabase = false, + kotlinMultiplatformLibrary = true + ) + } + assertTrue( + error.message?.contains("--android-kotlin-multiplatform-library is only available when --type android.") == true + ) + } + @Test fun `classes module lower than minimum is rejected`() { val error = assertThrows {