• Stars
    star
    409
  • Rank 105,709 (Top 3 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created almost 5 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Gradle plugin to create a clean application in Java that already works, It follows our best practices!

Quality Gate Status Maintainability Rating codecov GitHub license Scorecards supply-chain security

Scaffolding of Clean Architecture

Gradle plugin to create a java and kotlin application based on Clean Architecture following our best practices!

Plugin Implementation

To use the plugin you need Gradle version 7.6.1 or later, to start add the following section into your build.gradle file.

plugins {
    id "co.com.bancolombia.cleanArchitecture" version "3.6.1"
}

Or if is a new project execute this script in the root directory of your project.

echo "plugins {
    id \"co.com.bancolombia.cleanArchitecture\" version \"3.6.1\"
}" > build.gradle

To use the plugin you need Gradle version 6.9 or later, to start add the following section into your build.gradle.kts file.

plugins {
    id("co.com.bancolombia.cleanArchitecture") version "3.6.1"
}

Or if is a new project execute this script in the root directory of your project.

echo "plugins {
    id(\"co.com.bancolombia.cleanArchitecture\") version \"3.6.1\"
}" > build.gradle.kts

Tasks

The Scaffolding Clean Architecture plugin will allow you run 8 tasks:

Generate Project

The cleanArchitecture | ca task will generate a clean architecture structure in your project, this task has four optional parameters; package , type, name and coverage. If you run this task on an existing project it will override the main.gradle, build.gradle and gradle.properties files.

  • package = <package.we.need>: You can specify the main or default package of your project. Default Value = co.com.bancolombia

  • type = <imperative | reactive>: With this parameter the task will generate a POO project. Default Value = reactive

  • name = NameProject: This parameter is going to specify the name of the project. Default Value = cleanArchitecture

  • coverage = <jacoco | cobertura>: This parameter is going to specify the coverage tool for the project. Default Value = jacoco

  • lombok = <true | false>: Specify if you want to use this plugin . Default Value = true

  • metrics = <true | false>: Specify if you want to enable this feature with micrometer . Default Value = true

  • language = <JAVA | KOTLIN>: Specify if you want to use this plugin . Default Value = JAVA

  • javaVersion = <VERSION_1_8 | VERSION_11 | VERSION_17>: Java version . Default Value = VERSION_17

gradle cleanArchitecture --package=co.com.bancolombia --type=reactive --name=NameProject --coverage=jacoco --lombok=true
gradle ca --package=co.com.bancolombia --type=reactive --name=NameProject --coverage=jacoco --lombok=true

The structure will look like this for java:

๐Ÿ“ฆNameProject
โ”ฃ ๐Ÿ“‚applications
โ”ƒ โ”— ๐Ÿ“‚app-service
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚config
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œ[configs and beans]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œMainApplication.java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚resources
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œ[properties]
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”— ๐Ÿ“œbuild.gradle
โ”ฃ ๐Ÿ“‚deployment
โ”ƒ โ”ฃ ๐Ÿ“œ[Dockerfile, Pipelines as a code]
โ”ฃ ๐Ÿ“‚domain
โ”ƒ โ”ฃ ๐Ÿ“‚model
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”— ๐Ÿ“œbuild.gradle
โ”ƒ โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ƒ โ”— ๐Ÿ“œbuild.gradle
โ”ฃ ๐Ÿ“‚infrastructure
โ”ƒ โ”ฃ ๐Ÿ“‚driven-adapters
โ”ƒ โ”ฃ ๐Ÿ“‚entry-points
โ”ƒ โ”— ๐Ÿ“‚helpers
โ”ฃ ๐Ÿ“œ.gitignore
โ”ฃ ๐Ÿ“œbuild.gradle
โ”ฃ ๐Ÿ“œgradle.properties
โ”ฃ ๐Ÿ“œlombok.config
โ”ฃ ๐Ÿ“œmain.gradle
โ”ฃ ๐Ÿ“œREADME.md
โ”— ๐Ÿ“œsettings.gradle

The structure will look like this for kotlin:

๐Ÿ“ฆNameProject
โ”ฃ ๐Ÿ“‚applications
โ”ƒ โ”— ๐Ÿ“‚app-service
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚config
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œ[configs and beans]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œMainApplication.kt
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚resources
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œ[properties]
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”— ๐Ÿ“œbuild.gradle.kts
โ”ฃ ๐Ÿ“‚deployment
โ”ƒ โ”ฃ ๐Ÿ“œ[Dockerfile, Pipelines as a code]
โ”ฃ ๐Ÿ“‚domain
โ”ƒ โ”ฃ ๐Ÿ“‚model
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”— ๐Ÿ“œbuild.gradle.kts
โ”ƒ โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ƒ โ”— ๐Ÿ“œbuild.gradle.kts
โ”ฃ ๐Ÿ“‚infrastructure
โ”ƒ โ”ฃ ๐Ÿ“‚driven-adapters
โ”ƒ โ”ฃ ๐Ÿ“‚entry-points
โ”ƒ โ”— ๐Ÿ“‚helpers
โ”ฃ ๐Ÿ“œ.gitignore
โ”ฃ ๐Ÿ“œbuild.gradle.kts
โ”ฃ ๐Ÿ“œgradle.properties
โ”ฃ ๐Ÿ“œlombok.config
โ”ฃ ๐Ÿ“œREADME.md
โ”— ๐Ÿ“œsettings.gradle.kts

Generate Model for Java and Kotlin

The generateModel | gm task will generate a class and interface in model layer, this task has one required parameter name.

   gradle generateModel --name=[modelName]
   gradle gm --name [modelName]

This task will generate something like that:

๐Ÿ“ฆdomain
โ”ฃ ๐Ÿ“‚model
โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚model
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚gateways
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œModelRepository.java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œModel.java
โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚model
โ”ƒ โ”— ๐Ÿ“œbuild.gradle

This task will generate something like that for kotlin:

๐Ÿ“ฆdomain
โ”ฃ ๐Ÿ“‚model
โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚model
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚gateways
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œModelRepository.kt
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œModel.kt
โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚model
โ”ƒ โ”— ๐Ÿ“œbuild.gradle.kts

Generate Use Case for Java and Kotlin

The generateUseCase | guc task will generate a class in model layer, this task has one required parameter name.

   gradle generateUseCase --name=[useCaseName]
   gradle guc --name [useCaseName]

This task will generate something like that:

๐Ÿ“ฆdomain
โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚business
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œBusinessUseCase.java
โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚business
โ”ƒ โ”— ๐Ÿ“œbuild.gradle

This task will generate something like that for kotlin:

๐Ÿ“ฆdomain
โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚business
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œBusinessUseCase.kt
โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚kotlin
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚usecase
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚business
โ”ƒ โ”— ๐Ÿ“œbuild.gradle.kts

Generate Driven Adapter

The generateDrivenAdapter | gda task will generate a module in Infrastructure layer, this task has one required parameter type.
Whether you'll use generic one also parameter name is required.

   gradle generateDrivenAdapter --type=[drivenAdapterType]
   gradle gda --type [drivenAdapterType]
Reference for drivenAdapterType Name Additional Options Java Kotlin
generic Empty Driven Adapter --name [name] โ˜‘ โ˜‘
jpa JPA Repository --secret [true-false] โ˜‘ โ˜‘
mongodb Mongo Repository --secret [true-false] โ˜‘ โ˜‘
asynceventbus Async Event Bus โ˜‘ โ˜‘
restconsumer Rest Client Consumer --url [url] โ˜‘ โ˜‘
redis Redis --mode [template-repository] --secret [true-false] โ˜‘ โ˜‘
rsocket RSocket Requester โ˜‘ โ˜‘
r2dbc R2dbc Postgresql Client โ˜‘ โ˜‘
kms AWS Key Management Service โ˜‘ โ˜‘
secrets Secrets Manager Bancolombia โ˜‘ โ˜‘
s3 AWS Simple Storage Service โ˜‘ โ˜‘
mq JMS MQ Client to send messages โ˜‘ โ˜‘
ktor HTTP client for kotlin โ˜ โ˜‘
dynamodb Dynamo DB adapter โ˜‘ โ˜‘
sqs SQS message sender โ˜‘ โ˜‘

This task will generate something like that:

๐Ÿ“ฆinfrastructure
โ”ฃ ๐Ÿ“‚driven-adapters
โ”ƒ โ”— ๐Ÿ“‚jpa-repository
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚jpa
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚config
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œDBSecret.java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚helper
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œAdapterOperations.java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œJPARepository.java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œJPARepositoryAdapter.java
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚jpa
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚helper
โ”ƒ โ”ƒ โ”— ๐Ÿ“œbuild.gradle

Generate Entry Point

The generateEntryPoint | gep task will generate a module in Infrastructure layer, this task has one required parameter type.
Whether you'll use generic one also parameter name is required.

gradle generateEntryPoint --type=[entryPointType]
gradle gep --type [entryPointType]
Reference for entryPointType Name Additional Options Java Kotlin
generic Empty Entry Point --name [name] โ˜‘ โ˜‘
restmvc API REST (Spring Boot Starter Web) --server [serverOption] default undertow โ˜‘ โ˜‘
webflux API REST (Spring Boot Starter WebFlux) --router [true, false] default true โ˜‘ โ˜‘
rsocket Rsocket Controller Entry Point โ˜‘ โ˜‘
graphql API GraphQL --pathgql [name path] default /graphql โ˜‘ โ˜‘
asynceventhandler Async Event Handler โ˜‘ โ˜‘
mq JMS MQ Client to listen messages โ˜‘ โ˜‘
sqs SQS Listener โ˜‘ โ˜‘

Additionally, if you'll use a restmvc, you can specify the web server on which the application will run. By default, undertow.

   gradle generateEntryPoint --type=restmvc --server=[serverOption]
   gradle gep --type=restmvc --server=[serverOption]
Reference for serverOption Name
undertow Undertow server (default)
tomcat Tomcat server
jetty Jetty server

This task will generate something like that:

๐Ÿ“ฆinfrastructure
โ”ฃ ๐Ÿ“‚entry-points
โ”ƒ โ”— ๐Ÿ“‚generic
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚src
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚main
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚generic
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚test
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚java
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚[package]
โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚generic
โ”ƒ โ”ƒ โ”— ๐Ÿ“œbuild.gradle

Generate Helper

The generateHelper | gh task will generate a module in Infrastructure layer, this task has one required parameter name.

   gradle generateHelper --name=[helperName]
   gradle gh --name=[helperName]

Generate Pipeline

The generatePipeline | gpl task will generate CI pipeline inside the folder "./deployment/", this task has one required parameter type.

   gradle generatePipeline --type=[pipelineType]
   gradle gpl --type=[pipelineType]
Reference for pipelineType Name
azure Azure Pipeline
github GitHub Action
jenkins Jenkins Pipeline
circleci CircleCI Pipeline

Generate Acceptance Test

The generateAcceptanceTest | gat task will generate subproject by karate framework inside the folder "./deployment/", this task has one optional parameter, name.

  • name = NameAcceptanceTestProject: This parameter is going to specify the name of the acceptance test project. Default Value = acceptanceTest
      gradle generateAcceptanceTest --name=[acceptanceTestProjectName]
      gradle gat --name=[acceptanceTestProjectName] 

Karate is an open-source tool to combine API test-automation, mocks, performance-testing and even UI automation into a single, unified framework. The BDD syntax popularized by Cucumber is language-neutral, and easy for even non-programmers. Assertions and HTML reports are built-in, and you can run tests in parallel for speed.

Generate Performance Test

The generatePerformanceTest | gpt task will generate Performance test inside the folder "./performance-test/", this task has one required parameter type.

   gradle generatePerformanceTest --type=[performanceType]
   gradle gpt --type=[performanceType]
| Reference for **performanceType** | Name           |
| ------------------------------ | -------------- |
| jmeter                          | Jmeter Performance Test |

Validate Structure

The validateStructure | vs Validate that project references aren't violated.

   gradle validateStructure
   gradle vs

This validation has another best practices verifications, which you can see on the generated ArchitectureTest file within the unit tests of the app-service module.

Dependency Rules

One important point made by Robert C. Martin on Clean Architecture is the Dependency Rule, that can be summarized like this: source code dependencies can only point inwards. Nothing in an inner circle can know anything at all about something in an outer circle. In particular, the name of something declared in an outer circle must not be mentioned by the code in an inner circle.

Having that in mind, the validateStructure | vs task performs the following validations:

  1. Model module: to have no dependencies at all.
  2. UseCase module: to declare dependency to the Model module ONLY, and no other additional dependencies.
  3. Infrastructure Layer modules:
    • Allow declaration of any external dependency.
    • Allow declaration of dependency on Model and/or UseCase modules.
    • Avoid declaration of dependency AppService module.

Whitelisting dependencies:

Some dependencies, specially when working with BOMs (Bills of Materials), are injected transversally to the project, making the validation task to flag failures to rules 1 and 2. To avoid this scenario, or other you may encounter, you can configure a set of whitelisted dependencies.

Example:

  1. Let's say you have declared a BOM in your project:

    dependencies {
      implementation(platform("com.myorg:my-bom:0.0.1"))
    }
  2. This will make validateStructure | vs to flag a failure indicating an error like this:

    Validating Model Module
     --- Dependency com.myorg:some-bom is not allowed in Model Layer
  3. To avoid this, you can white list your BOM like this:

    // build.gradle
    cleanPlugin {
      modelProps {
         whitelistedDependencies = "my-bom, <dep2>, <depN..>"
      }
    }

    Indicating only the name of the dependencies comma-separated.

Delete Module

The deleteModule | dm task will delete a sub project, this task has one required parameter module.

   gradle deleteModule --module=[name]
   gradle dm --module=[name]




Update Project

The updateCleanArchitecture | u task will update plugin and dependencies in all sub projects, this task has one optional parameter dependencies if you only want to update some dependencies the dependency need to contain the group, and the artifact for example for the dependency cleanArchitecture you will need to append co.com.bancolombia:cleanArchitecture. It also updates the spring, lombok, gradle and some other dependencies according to the plugin version that you are using, ocassionally it could make changes in other project structural files. We recommend that you commit your changes to git before running this command, but you can skip the verification passing --git false.

   gradle updateCleanArchitecture --dependencies=[dependency1, dependency2, ...]
   gradle u --dependencies=[dependency1, dependency2, ...]

How can I help?

Review the issues, we hear new ideas. Read more Contributing

Analytics

You can help the Contributors Team to prioritize features and improvements by permitting the Contributors team to send gradle tasks usage statistics to Analytics Server. The Contributors Team collect usage statistics unless you explicitly opt in off.

Due to the user input limitations to gradle task, when running any plugin task you will be notified about the analytics recollection, and you have the possibility to disable this recollection. If you enable or disable analytics explicitly, future task executions will not notify you.

To explicitly enable analytics and avoid the notification message

gradle analytics --enabled true
# o gradle a --enabled true

To disable analytics

gradle analytics --enabled false
# # o gradle a --enabled false

What is collected?

Usage analytics include the commands and selected flags for each execution. Usage analytics may include the following information:

  • Your operating system (macOS, Linux distribution, Windows) and its version.
  • Java vendor name and version.
  • Java specification and runtime versions.
  • Plugin version.
  • Project language (kotlin or java)
  • Task name that was run.
  • Workspace information like language, user that is running the task.
  • For generate use case, generate model, generate helper and delete module tasks, the name will be sent.
  • For all tasks, the type and name, the time it took to run the task, and project type (reactive, imperative).



Whats Next?

Read more About Clean Architecure

More Repositories

1

dart-code-linter

Dart Code Linter is a software analytics tool that helps developers analyse and improve software quality. Dart Code Linter is based on a fork of Dart Code Metrics. We welcome contributions from other developers. Please feel free to submit pull-requests and bugreports to this GitHub repository.
Dart
37
star
2

secrets-manager

This library will help you to decouple your application of your secrets provider
Java
24
star
3

distributed-performance-analyzer

Distributed performance analyzer for http services
Elixir
18
star
4

async-dataflow

Component to deliver asynchronous responses in real time to client applications
Elixir
15
star
5

scaffold-clean-architecture-ex

Mix task to create a clean architecture application in Elixir that already works, It follows our best practices!
Elixir
14
star
6

devsecops-engine-tools

Toolchain for the evaluation of different devsecops practices
Python
12
star
7

performance-benchmark-stacks

Repositorio para el diseรฑo y construcciรณn de pruebas de rendimiento sobre diferentes staks
TypeScript
11
star
8

bin-stash

Caching data in memory and/or a centralized cache to build a two tier stage cache.
Java
9
star
9

data-mask

Utility library to use with Jackson-Databind to provide custom POJO/JSON serialization and deserialization aiming to protect sensitive data via masking with encrypting-decrypting.
Java
9
star
10

oss-enterprise

Bancolombia Open Source Office guides.
8
star
11

fast64_elixir

High performance base64 encoder/decoder for elixir
C
7
star
12

serenity-parallel-execution-plugin

Plugin to execute automated Serenity BDD tests in parallel easily
Groovy
7
star
13

reactive-commons-elixir

Common abstractions for reactive microservices
Elixir
6
star
14

bc_golden_plugin

Dart
5
star
15

async-dataflow-channel-client-js

Transport client for async dataflow implementation for browsers
TypeScript
4
star
16

opensource-innersource-toolkit

project type Action that provides repositories with the necessary tools and documentation for an innersource work model
Shell
2
star
17

latency-simulator

Elixir
2
star
18

submodule-network

GitHub Action focused on updating child submodules of a corporate network. Useful for linked applications among different subsidiaries which shares the same core. This project is freed under the Apache License 2.0.
2
star
19

commons-jms

JMS Configuration Abstraction with Multi-Connection for queue listeners and producers, built on top of spring boot JMS
Java
2
star
20

checkout-azure-repo

GitHub Action which allows you to check-out an Azure Repository. This project is freed under the Apache License 2.0.
1
star
21

virtual-thread-performance-benchmark

Elixir
1
star
22

scaffold-ca-intellij-plugin

Plugin created with clean architecture for the creation of base projects
Kotlin
1
star
23

bancolombia.github.io

HTML
1
star
24

ScreenPlayArchitecture

Screenplay Architecture is a plugin that enables the creation of structured projects used for REST and UX test automation.
Java
1
star