Elixir plugin to create an elixir application based on Clean Architecture following our best practices.
mix archive.install hex elixir_structure_manager <version>
mix help | grep "mix ca."
Task | Description |
---|---|
mix ca.new.structure | Creates a new clean architecture application. |
mix ca.new.model | Creates a new model with empty properties |
mix ca.new.usecase | Creates a new usecase |
mix ca.new.da | Creates a new driven adapter |
mix ca.new.ep | Creates a new entry point |
mix ca.apply.config | Applies some project configuration |
mix <task> -h
Example
mix ca.new.structure -h
Creates a new Clean architecture scaffold
$ mix ca.new.structure [application_name]
$ mix ca.new.structure [application_name] --metrics --distillery
$ mix ca.new.structure [application_name] -m -d
The ca.new.structure
task will generate a clean architecture structure in your project.
mix ca.new.structure <project-name>
mix ca.new.structure <project-name> --metrics --distillery
mix ca.new.structure <project-name> -m -d
The structure will look like this
app
├── config
│ ├── config.exs
│ ├── dev.exs
│ ├── prod.exs
│ └── test.exs
├── lib
│ ├── application.ex
│ ├── config
│ │ ├── app_config.ex
│ │ └── config_holder.ex
│ ├── domain
│ │ ├── behaviours
│ │ ├── model
│ │ └── use_cases
│ ├── infrastructure
│ │ ├── driven_adapters
│ │ └── entry_points
│ │ ├── api_rest.ex
│ │ └── health_check.ex
│ └── utils
│ ├── certificates_admin.ex
│ ├── custom_telemetry.ex
│ └── data_type_utils.ex
├── mix.exs
├── mix.lock
└── rel
├── config.exs
├── plugins
└── vm.args
Creates a new model for the clean architecture project
mix ca.new.model <model_name>
mix ca.new.model <model_name> --behaviour
mix ca.new.model <model_name> -b
mix ca.new.model <model_name> --behaviour-name <behaviour_name>
mix ca.new.model <model name> -n <behaviour_name>
This task will generate something like that:
domain
├── behaviours
│ └── model_behaviour.ex
└── model
└── model.ex
Creates a new usecase for the clean architecture project
mix ca.new.usecase <name_usecase>
This task will generate something like that:
domain
└── use_cases
└── use_case.ex
Creates a new driven adapter for the clean architecture project.
mix ca.new.da --type <driven_adapter_name>
Type param options:
- asynceventbus
- dynamo
- generic
- redis
- repository
- restconsumer
- secrestsmanager
mix ca.new.da --type <driven_adapter_name> --name <my_adapter>
mix ca.new.da -t driven_adapter_name -n <my_adapter>
This task will generate something like that:
infrastructure
└── driven_adapters
└── rest_consumer
└── <name>
├── data
│ ├── <name>_request.ex
│ └── <name>_response.ex
└── <name>_adapter.ex
Creates a new driven adapter for the clean architecture project
mix ca.new.ep --type <entry_point_name>
Type param options:
- asynceventhandler
mix ca.new.ep --type <entry_point_name> --name <my_entry_point>
mix ca.new.ep -t entry_point_name -n <my_entry_point>
This task will generate something like that:
infrastructure
└── entry_points
└── async_messages
└── async_message_handlers.ex
Applies a configuration for the clean architecture project
mix ca.apply.config -t <config_type>
Type param options:
- metrics
- distillery
- sonar
This configuration type will instrument the application and their supporter adapters and entry points
When the project is instrumented by passing the flag -m
or by running this task every new adapter will be generated
with instrumentation by default if supported.
The curren status of instrumentation
Adapter | Metrics | Traces |
---|---|---|
api_rest (default) | ✔ | ✔ |
asynceventhandler | ✔ | ✘ |
redis | ✔ | ✔ |
asynceventbus | ✔ | ✘ |
x aws (any request) | ✔ | ✔ |
repository | ✔ | ✔ |
restconsumer | ✔ | ✔ |
Creates distillery configuration for the clean architecture project.
It generates the next project files:
rel
├── plugins
| └── .gitignore
└── config.exs
It also injects the rel/config.exs file with the next config_providers for prod env
set config_providers: [{Distillery.Releases.Config.Providers.Elixir, ["${RELEASE_ROOT_DIR}/etc/config.exs"]}] # Use config file at runtime
If you are using sonar, you can autogenerate the configuration files, these files will help you to:
- generate sobelow report through
mix sobelow -f json --out sobelow.json
- generate test execution for sonarqube through
mix coveralls.xml
- generate credo report for sonarqube through
mix credo --sonarqube-base-folder ./ --sonarqube-file credo_sonarqube.json
Get version
mix archive
mix archive.uninstall elixir_structure_manager-<version>
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/elixir_structure_manager.