README.md in axr-0.6.0 vs README.md in axr-0.6.1

- old
+ new

@@ -1,43 +1,91 @@ # AXR -### Ruby applications architecture for simplicity and team adoption +**Ruby architecture for simplicity and team adoption** Architecture is hard. It’s very easy to build a complex system; much harder to build a simple and adaptable one. The code doesn't matter and coding for the sake of writing code is foolish. Few of us get to write software that survives 5-10 years or longer. 90% of our work is garbage that becomes obsolete 1-3 years after release. Most of our work hours are wasted on features that never get shipped. This is just reality. -(c) Me +(c) Volodya Sveredyuk -### Setup +## Setup ```sh gem install axr ``` -or in your Gemfile: +or in your Gemfile ```ruby -gem 'axr', '~> 0.5' +gem 'axr' ``` +in console ```sh bundle install ``` -Somewhere in your ruby app: +## DSL + +In your ruby app: (for rails app put it into `config/initializers`) ```ruby require 'axr' AxR.app.define do layer 'Api' layer 'YourBusinessLogic' layer 'Repo' end ``` +By default, layers will get level from top to bottom. +``` +Api -> 0 +YourBusinessLogic -> 1 +Repo -> 2 +``` + +Layers with lower-level have less isolation. + +- `Api` knows about `YourBusinessLogic` and `Repo` +- `YourBusinessLogic` knows about `Repo` but don't know anything about `Api` +- `Repo` fully isolated and don't familiar with `Api` and `YourBusinessLogic` + +**Options** + +```ruby +require 'axr' + +AxR.app.define do + layer 'A' + layer 'B', familiar_with: 'C' + layer 'C', familiar_with: 'B' + layer 'D', isolated: true + layer 'E', isolated: true +end +``` + +```ruby + +# app.define options +AxR.app.define(isolated: true) # All layers will be isolated by default +AxR.app.define(familiar_with: ['D', 'E') # All layers will be familiar with D and E by default + +# layer options +familiar_with: [...] # Can operate with other layers +isolated: true # 100% isolated and should not operate with other layers +isolated: true, familiar_with: [...] # Isolated from all except familiars +``` + +Can organize knowledge structure like: + +<img src="docs/images/abcde_example.png" alt="drawing" width="500"/> + +## CLI + Run `AxR` checker in console ```sh axr check . --load path/to/you/app/autoload.rb ``` @@ -54,10 +102,29 @@ Run for a specific file ```sh axr lib/adapters/youtube.rb ``` -### How it works -...TODO +## More examples +**ERP system** + +<img src="docs/images/erp_example.png" alt="drawing" width="500"/> + +```ruby +require 'axr' + +AxR.app.define(isolated: true) do + layer 'Api', familiar_with: ['ERP'] + layer 'UI', familiar_with: ['ERP'] + layer 'ERP', familiar_with: %w[Inventory Sales Supply] + layer 'Sales', familiar_with: 'Inventory' + layer 'Supply', familiar_with: 'Inventory' + layer 'Repo' + layer 'Change' + layer 'Query' +end +``` + ### TODO - Add sublayers +- Add `axr check --exit-on-warning` cli flag