Large Python projects often evolve into complex codebases that are tough to maintain. Keeping track of imports, layers, and who depends on whom can quickly turn into a mess. Deply is here to help. It analyzes your code structure and enforces architectural rules, ensuring your Python project remains clean, modular, and easy to maintain—even as it grows.
Why Architectural Enforcement Matters
Python's flexibility makes it easy to introduce spaghetti code if we're not careful. Adding new modules, decorators, or even changing how classes inherit can introduce subtle dependency issues across large teams. Clear boundaries—enforced by automated checks—help keep code quality high. This approach boosts readability and team productivity.
What Is Deply?
Deply is a standalone tool that:
- Lets you define project layers (like views, models, services) in a YAML configuration.
- Collects code elements into these layers through rules (e.g., class_inherits, decorator_usage, file_regex).
- Enforces architectural policies to prevent undesired coupling or naming mishaps.
Why Not Use Another Tool?
- pydeps: Focuses on visualizing imports.
- import-linter: Checks import constraints.
- pytestarch or pytest-archon: Relies on writing code-based tests for architecture.
- Tach (Rust-based): Language-agnostic approach, may not align perfectly with Python specifics.
Deply's advantage is that it goes beyond imports, looking at decorators, class inheritance, file patterns, and more. Its YAML-based configuration makes it simpler to incorporate into CI pipelines without writing new test files.
New in 0.5.2
- Upgraded Collectors: More flexible ways to define classes and functions, including advanced regex patterns.
- Performance Boost: Deply now runs up to 10x faster than before. Integrating it with CI won't slow your builds.
- Expanded Rules: Additional checks for inheritance, decorator usage, and naming conventions let you design granular policies.
Installation
pip install deply
You'll get the latest version, currently 0.5.2.
Deply Configuration (deply.yaml)
Create a deply.yaml file in your project root. At a minimum, define the paths you want to analyze, any files to exclude, your layers, and rules. Below is a sample snippet for a Django-like project.
deply: paths: - /path/to/your/project exclude_files: - ".*\.venv/.*" layers: - name: models collectors: - type: bool any_of: - type: class_inherits base_class: "django.db.models.Model" - type: class_inherits base_class: "django.contrib.auth.models.AbstractUser" - name: views collectors: - type: file_regex regex: ".*/views_api.py" ruleset: views: disallow_layer_dependencies: - models enforce_function_decorator_usage: - type: bool any_of: - type: bool must: - type: function_decorator_name_regex decorator_name_regex: "^HasPerm$" - type: function_decorator_name_regex decorator_name_regex: "^extend_schema$" - type: function_decorator_name_regex decorator_name_regex: "^staticmethod$"
How it works:
- models layer collects classes inheriting from Django's Model or AbstractUser.
- views layer collects code from files ending with views_api.py.
- Rules:
- disallow_layer_dependencies: the views layer can't directly depend on models.
- enforce_function_decorator_usage: all functions in views need either (HasPerm and extend_schema) or staticmethod.
Running Deply
Once your config is ready, run:
pip install deply
- --config=another_config.yaml lets you specify a different file.
- --report-format=text|json|github-actions controls how violations are displayed.
Additional Examples
Class Naming:
deply: paths: - /path/to/your/project exclude_files: - ".*\.venv/.*" layers: - name: models collectors: - type: bool any_of: - type: class_inherits base_class: "django.db.models.Model" - type: class_inherits base_class: "django.contrib.auth.models.AbstractUser" - name: views collectors: - type: file_regex regex: ".*/views_api.py" ruleset: views: disallow_layer_dependencies: - models enforce_function_decorator_usage: - type: bool any_of: - type: bool must: - type: function_decorator_name_regex decorator_name_regex: "^HasPerm$" - type: function_decorator_name_regex decorator_name_regex: "^extend_schema$" - type: function_decorator_name_regex decorator_name_regex: "^staticmethod$"
All classes in the service layer must end with Service.
Function Naming:
deply analyze
All functions in tasks must start with task_.
Pro Tip: Combine multiple conditions with bool to form advanced logic (must, any_of, must_not), ensuring you can craft highly specific rules.
CI Integration
Add a step to your CI pipeline:
service: enforce_class_naming: - type: class_name_regex class_name_regex: ".*Service$"
Your pipeline can fail if any architectural violations are found.
Wrap-Up
Deply is designed to help you catch architectural violations before they become time-consuming refactors. By automating these checks, you can maintain a crisp, layered design, even on large teams.
- GitHub: https://github.com/Vashkatsi/deply
- PyPI: https://pypi.org/project/deply/
Feel free to test it out and adjust the configuration for your own needs. If you have questions or ideas, check out the repo for details on filing issues or contributing. Happy coding!
The above is the detailed content of Deply: keep your python architecture clean. For more information, please follow other related articles on the PHP Chinese website!

This article explains how to use Beautiful Soup, a Python library, to parse HTML. It details common methods like find(), find_all(), select(), and get_text() for data extraction, handling of diverse HTML structures and errors, and alternatives (Sel

Solution to permission issues when viewing Python version in Linux terminal When you try to view Python version in Linux terminal, enter python...

Python's statistics module provides powerful data statistical analysis capabilities to help us quickly understand the overall characteristics of data, such as biostatistics and business analysis. Instead of looking at data points one by one, just look at statistics such as mean or variance to discover trends and features in the original data that may be ignored, and compare large datasets more easily and effectively. This tutorial will explain how to calculate the mean and measure the degree of dispersion of the dataset. Unless otherwise stated, all functions in this module support the calculation of the mean() function instead of simply summing the average. Floating point numbers can also be used. import random import statistics from fracti

Serialization and deserialization of Python objects are key aspects of any non-trivial program. If you save something to a Python file, you do object serialization and deserialization if you read the configuration file, or if you respond to an HTTP request. In a sense, serialization and deserialization are the most boring things in the world. Who cares about all these formats and protocols? You want to persist or stream some Python objects and retrieve them in full at a later time. This is a great way to see the world on a conceptual level. However, on a practical level, the serialization scheme, format or protocol you choose may determine the speed, security, freedom of maintenance status, and other aspects of the program

This article compares TensorFlow and PyTorch for deep learning. It details the steps involved: data preparation, model building, training, evaluation, and deployment. Key differences between the frameworks, particularly regarding computational grap

This tutorial builds upon the previous introduction to Beautiful Soup, focusing on DOM manipulation beyond simple tree navigation. We'll explore efficient search methods and techniques for modifying HTML structure. One common DOM search method is ex

The article discusses popular Python libraries like NumPy, Pandas, Matplotlib, Scikit-learn, TensorFlow, Django, Flask, and Requests, detailing their uses in scientific computing, data analysis, visualization, machine learning, web development, and H

This article guides Python developers on building command-line interfaces (CLIs). It details using libraries like typer, click, and argparse, emphasizing input/output handling, and promoting user-friendly design patterns for improved CLI usability.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SublimeText3 Chinese version
Chinese version, very easy to use

SublimeText3 English version
Recommended: Win version, supports code prompts!

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Dreamweaver CS6
Visual web development tools

WebStorm Mac version
Useful JavaScript development tools