To support for modular projects I thought of creating a modules key in the root of the config as today we already have layers.
Something like modules sharing a common layer definition:
{:modules {:module-a {:defined-by "module-a\..*"}
:module-b {:defined-by "module-b\..*"}}
:layers {:controller {:defined-by ".*\\.controllers?\\..*"
:accessed-by-layers #{}}
:logic {:defined-by ".*\\.logic\\..*"
:accessed-by-layers #{:controller}}
:model {:defined-by ".*\\.models?\\..*"
:accessed-by-layers #{:logic :controller}}}}
And that would be a bit dynamic, as it would also support the possibility of having a common layer definition and a module with its own layer definition:
{:modules {:module-a {:defined-by "module-a\..*"
:layers {:layer {:defined-by ".*\\.controllers?\\..*"
:accessed-by-layers #{}}
:logic {:defined-by ".*\\.logic\\..*"
:accessed-by-layers #{:controller}}
:model {:defined-by ".*\\.models?\\..*"
:accessed-by-layers #{:logic :controller}}}}
:module-b {:defined-by "module-b\..*"}}
:layers {:controller {:defined-by ".*\\.controllers?\\..*"
:accessed-by-layers #{}}
:logic {:defined-by ".*\\.logic\\..*"
:accessed-by-layers #{:controller}}
:model {:defined-by ".*\\.models?\\..*"
:accessed-by-layers #{:logic :controller}}}}
Or even each module having its own layer definition:
{:modules {:module-a {:defined-by "module-a\..*"
:layers {:controller {:defined-by ".*\\.controllers?\\..*"
:accessed-by-layers #{}}
:logic {:defined-by ".*\\.logic\\..*"
:accessed-by-layers #{:controller}}
:model {:defined-by ".*\\.models?\\..*"
:accessed-by-layers #{:logic :controller}}}}
:module-b {:defined-by "module-b\..*"
:layers {:controller {:defined-by ".*\\.controllers?\\..*"
:accessed-by-layers #{}}
:logic {:defined-by ".*\\.logic\\..*"
:accessed-by-layers #{:controller}}
:model {:defined-by ".*\\.models?\\..*"
:accessed-by-layers #{:logic :controller}}}}}}
For each namespace the clj-depend analyzer would check if the namespace belongs to any of the modules. If the identified module has a layer definition it will be used, otherwise the common layer definition will be used.
If there is no modules key declared the behavior will be the same as today.
To support for modular projects I thought of creating a
moduleskey in the root of the config as today we already havelayers.Something like modules sharing a common layer definition:
{:modules {:module-a {:defined-by "module-a\..*"} :module-b {:defined-by "module-b\..*"}} :layers {:controller {:defined-by ".*\\.controllers?\\..*" :accessed-by-layers #{}} :logic {:defined-by ".*\\.logic\\..*" :accessed-by-layers #{:controller}} :model {:defined-by ".*\\.models?\\..*" :accessed-by-layers #{:logic :controller}}}}And that would be a bit dynamic, as it would also support the possibility of having a common layer definition and a module with its own layer definition:
{:modules {:module-a {:defined-by "module-a\..*" :layers {:layer {:defined-by ".*\\.controllers?\\..*" :accessed-by-layers #{}} :logic {:defined-by ".*\\.logic\\..*" :accessed-by-layers #{:controller}} :model {:defined-by ".*\\.models?\\..*" :accessed-by-layers #{:logic :controller}}}} :module-b {:defined-by "module-b\..*"}} :layers {:controller {:defined-by ".*\\.controllers?\\..*" :accessed-by-layers #{}} :logic {:defined-by ".*\\.logic\\..*" :accessed-by-layers #{:controller}} :model {:defined-by ".*\\.models?\\..*" :accessed-by-layers #{:logic :controller}}}}Or even each module having its own layer definition:
{:modules {:module-a {:defined-by "module-a\..*" :layers {:controller {:defined-by ".*\\.controllers?\\..*" :accessed-by-layers #{}} :logic {:defined-by ".*\\.logic\\..*" :accessed-by-layers #{:controller}} :model {:defined-by ".*\\.models?\\..*" :accessed-by-layers #{:logic :controller}}}} :module-b {:defined-by "module-b\..*" :layers {:controller {:defined-by ".*\\.controllers?\\..*" :accessed-by-layers #{}} :logic {:defined-by ".*\\.logic\\..*" :accessed-by-layers #{:controller}} :model {:defined-by ".*\\.models?\\..*" :accessed-by-layers #{:logic :controller}}}}}}For each namespace the clj-depend analyzer would check if the namespace belongs to any of the modules. If the identified module has a layer definition it will be used, otherwise the common layer definition will be used.
If there is no
moduleskey declared the behavior will be the same as today.