diff --git a/README.md b/README.md index 0a99d0ba..6365e258 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Then, you can use the versions.yaml in the `generate-project` command: - `--language`: kts (default), groovy, both - `--type`: android (default), jvm - `--di`: hilt (default), metro, none -- `--classes-module`: Number of classes per module (default: 5) +- `--classes-module`: Number of classes per module (minimum/default: 10) - `--classes-module-type`: fixed (default), random - `--type-of-string-resources`: normal (default), large - `--generate-unit-test`: Generate unit tests (default: false) @@ -154,10 +154,10 @@ Use the Android Kotlin Multiplatform library plugin for generated Android librar ## `Classes Module` Classes generated per module, options: -* classes: Classes to generate per module. Default 5. +* classes: Classes to generate per module. Minimum and default 10. * type: * Fixed(default): Each module will create n classes where n represents the argument `classes`. - * Random: Each module will create `Random.nextInt(2, classesPerModule.classes)` classes. + * Random: Each module will create between 10 and `classesPerModule.classes` classes. #### Example ```kotlin diff --git a/backend/server.cjs b/backend/server.cjs index db9c8ac6..73556c9a 100644 --- a/backend/server.cjs +++ b/backend/server.cjs @@ -64,6 +64,9 @@ app.post('/api/generate', upload.single('versions-file'), async (req, res) => { toBool(body.androidKotlinMultiplatformLibrary); // ✅ Build CLI args safely + const classesModuleInput = parseInt(body['classes-module']); + const classesModule = Math.max(10, Math.min(Number.isNaN(classesModuleInput) ? 15 : classesModuleInput, 15)); + const args = [ `--shape`, body.shape || 'rectangle', `--modules`, modules, @@ -71,7 +74,7 @@ app.post('/api/generate', upload.single('versions-file'), async (req, res) => { `--language`, body.language || 'kts', `--di`, di, `--type`, type, - `--classes-module`, Math.min(parseInt(body['classes-module']) || 15, 15), + `--classes-module`, classesModule, `--classes-module-type`, body['classes-module-type'] || 'fixed', `--type-of-string-resources`, body['type-of-string-resources'] || 'normal', `--gradle`, body.gradle || 'GRADLE_9_4_0' 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 dbeb6caa..855e922d 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 @@ -40,7 +40,10 @@ class GenerateProjects : CliktCommand(name = "generate-project") { .check("max number of projects 4000") { it in (layers + 1)..4000 } private val type by option().choice("android", "jvm").default("android") private val di: String by option().choice("hilt", "metro", "none").default("hilt") - private val classesModule by option().int().default(5) + private val classesModule by option().int().default(10) + .check("classes per module must be >= ${ClassesPerModule.MIN_CLASSES_PER_MODULE}") { + it >= ClassesPerModule.MIN_CLASSES_PER_MODULE + } private val classesModuleType: String by option().choice("fixed", "random").default("fixed") private val typeOfStringResources: String by option().choice("large", "normal").default("normal") private val layers by option().int().default(5) 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 3b094c37..0bb30f3e 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 @@ -23,4 +23,17 @@ class GenerateProjectsCliTest { 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 { + GenerateProjects().parse( + listOf( + "--modules", "6", + "--classes-module", "9" + ) + ) + } + assertTrue(error.message?.contains("classes per module must be >= 10") == true) + } } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/ProjectGenerator.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/ProjectGenerator.kt index d2345fab..feaba1bb 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/ProjectGenerator.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/ProjectGenerator.kt @@ -10,7 +10,7 @@ class ProjectGenerator( private val shape: Shape, private val language: Language = Language.KTS, private val typeOfProjectRequested: TypeProjectRequested = TypeProjectRequested.ANDROID, - private val classesPerModule: ClassesPerModule = ClassesPerModule(type = ClassesPerModuleType.FIXED, classes = 5), + private val classesPerModule: ClassesPerModule = ClassesPerModule(type = ClassesPerModuleType.FIXED, classes = 10), private val versions: Versions = Versions(), private val typeOfStringResources: TypeOfStringResources = TypeOfStringResources.NORMAL, private val layers: Int, diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/ProjectGraphGenerator.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/ProjectGraphGenerator.kt index 8fa5c61d..f9e0555c 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/ProjectGraphGenerator.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/ProjectGraphGenerator.kt @@ -96,7 +96,11 @@ class ProjectGraphGenerator( private fun getClasses() = if (classesPerModule.type == ClassesPerModuleType.FIXED) { classesPerModule.classes } else { - Random.nextInt(MIN_CLASSES_PER_MODULE, classesPerModule.classes) + if (classesPerModule.classes == MIN_CLASSES_PER_MODULE) { + MIN_CLASSES_PER_MODULE + } else { + Random.nextInt(MIN_CLASSES_PER_MODULE, classesPerModule.classes + 1) + } } private fun generateRandomRelations(numberModules: Int, numberModulesUpperLayer: Int): List { @@ -136,6 +140,6 @@ class ProjectGraphGenerator( } companion object { - const val MIN_CLASSES_PER_MODULE = 5 + const val MIN_CLASSES_PER_MODULE = ClassesPerModule.MIN_CLASSES_PER_MODULE } } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/ClassesPerModule.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/ClassesPerModule.kt index f32668d4..5b2b7595 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/ClassesPerModule.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/ClassesPerModule.kt @@ -3,7 +3,17 @@ package io.github.cdsap.projectgenerator.model data class ClassesPerModule( val type: ClassesPerModuleType = ClassesPerModuleType.FIXED, val classes: Int -) +) { + init { + require(classes >= MIN_CLASSES_PER_MODULE) { + "classes per module must be >= $MIN_CLASSES_PER_MODULE" + } + } + + companion object { + const val MIN_CLASSES_PER_MODULE = 10 + } +} enum class ClassesPerModuleType { FIXED, diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorTest.kt index 49eb9c96..4e895c52 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorTest.kt @@ -23,7 +23,7 @@ class ProjectGeneratorTest { ProjectGenerator( modules = 51, shape = shape, - classesPerModule = ClassesPerModule(ClassesPerModuleType.RANDOM, 8), + classesPerModule = ClassesPerModule(ClassesPerModuleType.RANDOM, 10), layers = 5, path = tempDir.toString(), projectName = "awesome_project${shape.name.capitalize()}", diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/model/ClassesPerModuleTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/model/ClassesPerModuleTest.kt new file mode 100644 index 00000000..16cca435 --- /dev/null +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/model/ClassesPerModuleTest.kt @@ -0,0 +1,14 @@ +package io.github.cdsap.projectgenerator.model + +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +class ClassesPerModuleTest { + + @Test + fun `reject values lower than minimum`() { + assertThrows { + ClassesPerModule(classes = 9) + } + } +}