Skip to content

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

License

Notifications You must be signed in to change notification settings

dskliarov-vio/scaffold-clean-architecture-ex

 
 

Repository files navigation

Elixir Structure Manager

Elixir plugin to create an elixir application based on Clean Architecture following our best practices.

Install

HexDocs

mix archive.install hex elixir_structure_manager <version>

Tasks

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

Task detail

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

Generate Project

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

Generate Model

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

Generate Use Case

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

Generate Driven Adapter

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

Generate Entry Point

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

Apply a Project Configuration

Applies a configuration for the clean architecture project

 mix ca.apply.config -t <config_type>

Type param options:

  • metrics
  • distillery
  • sonar

Metrics

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

Distillery

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

Sonar

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

Uninstall

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.

About

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Elixir 99.9%
  • Shell 0.1%