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
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
5 changes: 4 additions & 1 deletion backend/server.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,17 @@ 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,
`--layers`, body.layers || 5,
`--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'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<UsageError> {
GenerateProjects().parse(
listOf(
"--modules", "6",
"--classes-module", "9"
)
)
}
assertTrue(error.message?.contains("classes per module must be >= 10") == true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Int> {
Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()}",
Expand Down
Original file line number Diff line number Diff line change
@@ -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<IllegalArgumentException> {
ClassesPerModule(classes = 9)
}
}
}