Skip to content

Support for modular projects #23

Description

@fabiodomingues

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions