Layer Linter checks that your project follows a custom-defined layered architecture, based on its internal dependencies (i.e. the imports between its modules).
- Free software: BSD license
- Documentation: https://layer-linter.readthedocs.io.
Notice: This package will soon be superseded by Import Linter, which does everything Layer Linter does, but with more features and a slightly different API. Although it’s currently in alpha, you may wish to try Import Linter out instead. If you’re already using Layer Linter, migrating to Import Linter is simple: there is a guide here.
Layer Linter is a command line tool to check that you are following a self-imposed
architecture within your Python project. It does this by analysing the internal
imports between all the modules in your code base, and compares this
against a set of simple rules that you provide in a
For example, you can use it to check that no modules inside
import from any modules inside
myproject.bar, even indirectly.
This is particularly useful if you are working on a complex codebase within a team, when you want to enforce a particular architectural style. In this case you can add Layer Linter to your deployment pipeline, so that any code that does not follow the architecture will fail tests.
Install Layer Linter:
pip install layer-linter
Decide on the dependency flows you wish to check. In this example, we have
organised our project into three subpackages,
myproject.low. These subpackages are known as layers. Note: layers must
have the same parent package (i.e. all be in the same directory). This parent is known as a container.
layers.yml in the root of your project. For example:
My Layers Contract: containers: - myproject layers: - high - medium - low
(This contract tells Layer Linter that the order of the layers runs from
low at the bottom
high at the top. Layers higher up can import ones lower down, but not the other way around.)
Note that the container is an absolute name of a Python package, while the layers are relative to the container.
Now, from your project root, run:
If your code violates the contract, you will see an error message something like this:
============ Layer Linter ============ --------- Contracts --------- Analyzed 23 files, 44 dependencies. ----------------------------------- My layer contract BROKEN Contracts: 0 kept, 1 broken. ---------------- Broken contracts ---------------- My layer contract ----------------- 1. myproject.low.x imports myproject.high.y: myproject.low.x <- myproject.utils <- myproject.high.y
For more details, see Usage.