Skip to content
Open
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
217 changes: 38 additions & 179 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,64 +1,49 @@
# Project Generator
CLI generating modularized Gradle projects based on different shapes
<p float="left">
<img src="resources/example_readme.png" width="500" height="200"/>
<img src="resources/project2.png" height="200" />
</p>

A CLI tool to bootstrap Android or JVM Gradle projects with a customizable module graph.

# Usage
## CLI
### Install
```
curl -L https://github.com/cdsap/ProjectGenerator/releases/download/v0.2.1/projectGenerator --output projectGenerator
chmod 0757 projectGenerator
```

### Modes

#### 1. Generate Project (default)
## Installation
```bash
./projectGenerator generate-project --modules 100
curl -L https://github.com/cdsap/ProjectGenerator/releases/download/v0.2.1/projectGenerator --output projectGenerator
chmod 0757 projectGenerator
```
This command generates a project with the specified shape, layers, and modules. All options below can be combined with this mode.

#### 2. Generate YAML Versions File
## Commands
- **generate-project** (default)
Generates a project. Example:
```bash
./projectGenerator generate-project --modules 100
```
- **generate-yaml-versions**
Produces a template `versions.yaml` file. The file can then be passed to `generate-project` via `--versions-file`.

## Options
Key flags for `generate-project`:
- `--shape` triangle, rhombus, flat, rectangle, middle_bottleneck, inverse_triangle (default: rectangle)
- `--modules` required number of modules
- `--layers` number of layers (default: 5)
- `--language` kts (default), groovy, both
- `--type` android (default) or jvm
- `--classes-module` number of classes per module (default: 5)
- `--classes-module-type` fixed (default) or random
- `--type-of-string-resources` normal (default) or large
- `--generate-unit-test` generate unit tests (default: false)
- `--gradle` gradle_8_2, gradle_8_5, gradle_8_9, gradle_8_13, gradle_8_14_3 (default)
- `--develocity` enable Develocity build scan plugin
- `--versions-file` path to a custom YAML versions file

Example with several options:
```bash
./projectGenerator generate-yaml-versions
./projectGenerator generate-project --shape rhombus --modules 50 --layers 4 --language both --type jvm --classes-module 10 --classes-module-type random --type-of-string-resources large --generate-unit-test --gradle gradle_8_9 --develocity --versions-file my_versions.yaml
```

This command generates a `versions.yaml` file template for custom dependency versions.
Then, you can use the versions.yaml in the `generate-project` command:
```
./projectGenerator generate-project --shape triangle --layers 5 --modules 100 --versions-file versions.yaml
```

### CLI Options
- `--shape`: triangle, rhombus, flat, rectangle, middle_bottleneck, inverse_triangle (default: rectangle)
- `--modules` (required): Number of modules to create
- `--layers`: Number of layers (default: 5)
- `--language`: kts (default), groovy, both
- `--type`: android (default), jvm
- `--classes-module`: Number of classes per module (default: 5)
- `--classes-module-type`: fixed (default), random
- `--type-of-string-resources`: normal (default), large
- `--generate-unit-test`: Generate unit tests (default: false)
- `--gradle`: gradle_8_2, gradle_8_5, gradle_8_9, gradle_8_13, gradle_8_14_3 (default: gradle_8_14_3)
- `--develocity`: Enable Develocity build scan plugin (default: false)
- `--versions-file`: Path to a custom YAML file with dependency versions

#### Example: Generate a project with custom options
```bash
./projectGenerator generate-project --shape rhombus --modules 50 --layers 4 --language both --type jvm --classesModule 10 --classesModuleType random --typeOfStringResources large --generateUnitTest --gradle gradle_8_9 --develocity --versionsFile ./my_versions.yaml
```

## Library
## Library usage
```kotlin
val modules = 50
val shape = Shape.RHOMBUS
ProjectGenerator(
modules = 50,
shape =shape,
modules = modules,
shape = shape,
language = Language.KTS,
typeOfProjectRequested = TypeProjectRequested.ANDROID,
classesPerModule = ClassesPerModule(ClassesPerModuleType.FIXED, 20),
Expand All @@ -69,111 +54,13 @@ ProjectGenerator(
gradle = GradleWrapper(Gradle.GRADLE_8_14_3),
path = file.path
).write()

```
### Dependency
```
implementation("io.github.cdsap:projectgenerator:0.2.1")
```

# Options

## `modules`
Number of modules to create in the project
## `layers`
Number of layers where the modules will be distributed.
## `shape`
Defines the shape of the project dependency graph based on the distribution of modules by layer.
Current shapes supported:
### `triangle`
![Triangle](resources/triangle.png)
### `inverse_triangle`
![Triangle](resources/inverse_triangle.png)
### `rhombus`
![Rhombus](resources/rhombus.png)
### `rectangle` (default)
![Rectangle](resources/rectangle.png)
### `flat`
![Flat](resources/flat.png)
### `middle_bottleneck`
![Flat](resources/middle_bottleneck.png)

## `language`
### `kts`
**default**

The project generated includes modules build scripts in Kotlin DSL
### `groovy`
The project generated includes modules build scripts in Groovy
### `both`
Two projects will be generated using Kotlin DSL and Groovy

#### Example
```kotlin
./projectGenerator generate-project --shape triangle --layers 5 --modules 100 --language groovy
```
## `type`
Type of project generated:
### `android`
**default**

Android project
### `jvm`
Kotlin-JVM project

#### Example
```kotlin
./projectGenerator generate-project --shape triangle --layers 5 --modules 100 --type jvm
```

## `Classes Module`
Classes generated per module, options:
* classes: Classes to generate per module. Default 5.
* 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.

#### Example
Add the dependency to use the generator programmatically:
```kotlin
./projectGenerator generate-project --shape triangle --layers 5 --modules 100 --classes-module-type random --classes-module 150
implementation("io.github.cdsap:projectgenerator:0.2.1")
```

## String Resources type
### Normal
Each module generated includes 8 string resources in the file `strings.xml`. **Default**.

### Large
Each module generated includes 900 string resources in the file `strings.xml`

##### Example
```kotlin
./projectGenerator generate-project --shape triangle --layers 5 --modules 100 --type-of-string-resources large
```
## Generate Unit Test
**default false**

If enabled, each module will generate n unit tests, where n is the argument `classes`

##### Example
```kotlin
./projectGenerator generate-project --shape triangle --layers 5 --modules 100 --generate-unit-test true
```
## Gradle
Gradle used, versions supported:
* Gradle 8.2
* Gradle 8.5
* Gradle 8.9
* Gradle 8.13
* Gradle 8.14_2 **default**

##### Example
```kotlin
./projectGenerator generate-project --shape triangle --layers 5 --modules 100 --gradle 8.13
```


## Versions
Example output versions.yaml:
## Versions file example
```yaml
project:
develocity: 4.0.1
Expand All @@ -182,38 +69,10 @@ kotlin:
kgp: 2.1.20
ksp: 2.1.20-2.0.0
coroutines: 1.7.3
kotlinProcessor:
processor: KSP
android:
agp: 8.9.1
androidxCore: 1.9.0
appcompat: 1.7.0
material: 1.8.0
lifecycle: 2.7.0
fragment: 1.6.2
activity: 1.8.2
constraintlayout: 2.1.4
work: 2.10.1
hilt: 2.56.1
hiltAandroidx: 1.2.0
composeBom: 2025.05.00
testing:
junit4: 4.13.2
junit5: 5.10.1
truth: 1.1.5
mockk: 1.13.9
coreTesting: 2.2.0
junitExt: 1.1.5
additionalSettingsPlugins:

additionalBuildGradleRootPlugins:
- id: com.autonomousapps.dependency-analysis
version: 2.18.999
apply: true

```


See `resources/versions.yaml` for a complete list.

## Libraries used
* [clikt](https://github.com/ajalt/clikt)
- [clikt](https://github.com/ajalt/clikt)