Skip to main content

Relaxed layer architecture linter based on the import graph.

Project description

Layer Enforcer is a tool for linting your imports within the project.

The tool was designed to help maintain following order of things:

  • Dependencies always flow towards root of the tree. Often this is domain layer.

  • Dependencies may skip layers, as long as they flow in same direction. For instance, your web layer may import use cases from domain layer.

  • Infer layer from imports or module names. Say, if you import fastapi anywhere on the chain, the module is assigned to web layer, or maybe you want models to always be db layer.

  • Flexible layer structure. Preferably defined via config file.

  • Code is packaged by component. I.e. single component may contain code from the different layers.

Be warned, since this might not the best fit for you.

Algorithm

First pass: Match modules to layers. Report conflict if single module match more than one layer.

Second pass: For each module, iterate through all the imported modules. If current module has no assigned layer, assign first found layer within list of imported modules. If current module has an assigned layer, report conflict if import is not allowed.

Installation

pip install layer-enforcer

For Development

pip install -e .[test,lint]

Usage

layer-enforcer myproject myotherproject --layers layers.yml

pyproject.toml

Instead of explicitly specifying CLI arguments, it is possible to provide configuration via pyproject.toml within the tool.layer_enforcer table:

[tool.layer_enforcer]
modules = ["myproject", "myotherproject"]
ignore = ["myproject.containers"]
layers = "layers.yml"

layers.yml

An example of clean-architecture-ish layer layout for typical web app:

name: domain
submodules: ["entities", "use_cases"]
layers:
- name: service
  submodules: ["services"]
  layers:
  - name: infrastructure
    imports: ["stripe", "requests", "passlib"]
    layers:
    - name: db
      imports: ["sqlalchemy", "psycopg2", "alembic"]
      submodules: ["models", "memory", "database"]
    - name: web
      imports: ["fastapi", "jose"]
      submodules: ["views", "schemas"]
    - name: tasks
      imports: ["celery"]
      submodules: ["tasks"]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

layer_enforcer-0.2.0.tar.gz (10.3 kB view details)

Uploaded Source

Built Distribution

layer_enforcer-0.2.0-py3-none-any.whl (12.4 kB view details)

Uploaded Python 3

File details

Details for the file layer_enforcer-0.2.0.tar.gz.

File metadata

  • Download URL: layer_enforcer-0.2.0.tar.gz
  • Upload date:
  • Size: 10.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for layer_enforcer-0.2.0.tar.gz
Algorithm Hash digest
SHA256 2ccb59fc75047a2f76f4bd88c0a87b3010d07f344746fdd21ae26f7c5345d3f7
MD5 4f9770db31e99a8efa288c51b72e151e
BLAKE2b-256 a089ca952cc42bf990469195aebe8ee2e79ebfb62649a6fa8f0d2b5e658fc12b

See more details on using hashes here.

File details

Details for the file layer_enforcer-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for layer_enforcer-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 58b59f7198888d4dbad91b16bbe31313df129d2620c8f14ecec1af7632cd702b
MD5 3d2465d7ea58ebc29ccecab9adda23af
BLAKE2b-256 feceed86bc0e8bea30e5445475ec21737aec933ddf2d5527c1972d5e42dd0650

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page