A Python tool for analyzing and visualizing architectural dependencies from DOT graphs.
Project description
Architectural Dependency Analyzer and Visualizer
Overview
This project provides a comprehensive toolset for analyzing and visualizing architectural dependencies within software projects, particularly those structured around Clean Architecture or layered design principles. It processes DOT-formatted dependency graphs, performs various analyses, and generates enhanced, visually intuitive DOT diagrams.
The tool is available as a PyPI package, making it easy to install and use as a command-line interface (CLI). It is specifically designed to work with DOT files generated by Rust's cargo modules tool, but its core functionality can be adapted to any DOT-formatted graph representing module dependencies.
Key Features
- CLI-driven Analysis: A robust command-line interface (
python -m dot_analyzer.cli) with subcommands for various operations. - Dependency Graph Parsing: Converts raw DOT file content into a structured
Graphobject for programmatic analysis. - Circular Dependency Detection: Identifies and reports cyclic dependencies within the module graph, helping to pinpoint potential architectural issues.
- Layer Violation Detection: Verifies adherence to predefined architectural layer rules (e.g.,
domainshould not depend onapplicationorinfrastructure,applicationcan only depend ondomain,infrastructurecan only depend onapplication). It outputs a clear list of any detected violations. - Layered DOT Diagram Generation: Transforms the input graph into a new DOT file that visually groups modules by their architectural layers (
domain,application,infrastructure) using DOT'ssubgraph clustersyntax, and introduces explicit layer nodes (e.g.,my_app::domain) with 'owns' relationships to their respective modules. - Enhanced Visualization:
- Color-coded Layers: Layers are visually distinguished with distinct background colors for improved readability, and explicit layer nodes are introduced.
- Color-coded Edges: Dependency types (
owns,uses) are represented with different edge colors, making relationships clearer. - Simplified Visuals: Unnecessary edges are filtered out to reduce clutter and highlight meaningful connections, ensuring the generated diagrams are clean and easy to understand.
- Extensible Design: The project is built with extensibility in mind, allowing for future additions of new analysis types, visualization options, and integration with other dependency generation tools.
Project Idea and Workflow
The core idea is to provide a robust command-line interface (python -m dot_analyzer.cli) that takes a raw DOT dependency graph (e.g., from cargo modules) and performs various analyses or transformations.
Here's the typical workflow:
- Input: Provide a DOT file representing your project's module dependencies (e.g.,
graph.dot). - Parsing: The tool parses this DOT file into an internal graph representation.
- Analysis (using
analyzecommand):- It checks for circular dependencies within your modules.
- It identifies violations of architectural layer rules, ensuring your
domain,application, andinfrastructurelayers adhere to their intended dependency flow.
- Transformation & Visualization (using
transformcommand):- A new DOT file is generated. In this new file, modules are visually grouped into distinct layers using colored subgraphs, and explicit layer nodes are created with 'owns' relationships to their modules.
- Edges are color-coded based on their type (
ownsoruses) and filtered to show only the most relevant connections, reducing visual noise.
- Output: The generated DOT file (e.g.,
layered_graph.dot) can then be rendered into an image (e.g., PNG, SVG) using Graphviz tools (e.g.,dot -Tpng layered_graph.dot -o output.png). Theanalyzecommand also provides a summary of detected circular dependencies and layer violations.
Getting Started
Requirements
- Python 3.10+
- Graphviz (for rendering DOT files into images)
Installation
You can install the package directly from PyPI:
pip install dot-layered-transform
If you have multiple Python versions, you might use:
python3 -m pip install dot-layered-transform
Usage Example
Here’s a real-world example of how this tool can be used in a project.
1. Generate the initial DOT diagram
I used cargo-modules to generate a DOT file from a Rust project:
cargo modules dependencies --package <PACKAGE-NAME> --bin <PACKAGE-NAME> --no-externs --no-sysroot --no-fns --no-traits --no-types --layout dot > graph.dot
2. Transform the DOT file and analyze
Use the dot-layered-transform CLI tool to analyze the graph, detect violations, and generate a layered DOT file:
# Analyze for violations and cycles
python -m dot_analyzer.cli analyze graph.dot
# Transform and generate a layered DOT file
python -m dot_analyzer.cli transform graph.dot -o layered_graph.dot
The analyze command will print any detected circular dependencies or layer violations to the console.
3. Render the transformed DOT file
Using the Graphviz dot utility, you can generate an image for visualization:
dot -Tpng layered_graph.dot -o layered_graph.png
Visual Comparison
Before Transformation
After Transformation
Command Line Usage
After installing the package (pip install dot-layered-transform), you can use the CLI tool:
python -m dot_analyzer.cli --help
This will show the main commands available: transform and analyze.
Transform Command:
python -m dot_analyzer.cli transform <INPUT_DOT_FILE> [-o <OUTPUT_DOT_FILE>]
<INPUT_DOT_FILE>: Path to your original DOT file (e.g.,example/graph.dot).-o <OUTPUT_DOT_FILE>(optional): Path where the transformed, layered DOT file will be saved. If omitted, the output will be printed to standard output.
Analyze Command:
python -m dot_analyzer.cli analyze <INPUT_DOT_FILE> [--format <FORMAT>]
<INPUT_DOT_FILE>: Path to your original DOT file.--format <FORMAT>(optional): Output format for analysis results. Can betext(default) orjson.
Development and Contribution
This project is designed to be extensible. Future enhancements may include:
- Support for more complex layer definitions and custom rules.
- Integration with other dependency analysis tools.
- Interactive visualization features.
- More detailed reporting options.
Contributions are welcome! Please refer to the CONTRIBUTING.md (if available) for guidelines.
Acknowledgements
Special thanks to the developers of cargo modules for providing a powerful tool for Rust dependency graph generation.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dot_layered_transform-0.0.8a0.tar.gz.
File metadata
- Download URL: dot_layered_transform-0.0.8a0.tar.gz
- Upload date:
- Size: 210.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bdc5a798f916d400fd9a489d8e581b77fc3867c5be0787288fb161e21bb7f3cb
|
|
| MD5 |
02d54f50b0afa71c78704fd1db08e5ee
|
|
| BLAKE2b-256 |
b19ba405ea8f22c8e1ca33b51c6b0daf5dfba538241fa67a7963fea26f66b94a
|
Provenance
The following attestation bundles were made for dot_layered_transform-0.0.8a0.tar.gz:
Publisher:
publish_to_pypi.yml on J4CKVVH173/dot-layered-transform
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dot_layered_transform-0.0.8a0.tar.gz -
Subject digest:
bdc5a798f916d400fd9a489d8e581b77fc3867c5be0787288fb161e21bb7f3cb - Sigstore transparency entry: 245931816
- Sigstore integration time:
-
Permalink:
J4CKVVH173/dot-layered-transform@c2dc7a9a90e144c7ba5dde87a9b0b16bdb84ce73 -
Branch / Tag:
refs/tags/v0.0.8-alpha - Owner: https://github.com/J4CKVVH173
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_to_pypi.yml@c2dc7a9a90e144c7ba5dde87a9b0b16bdb84ce73 -
Trigger Event:
release
-
Statement type:
File details
Details for the file dot_layered_transform-0.0.8a0-py3-none-any.whl.
File metadata
- Download URL: dot_layered_transform-0.0.8a0-py3-none-any.whl
- Upload date:
- Size: 20.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b60ff3137dc466672517dcf4ed5bdbb3212a0ffa2265469694f6067204d47ccb
|
|
| MD5 |
af74c93d530870314b8a5ba0406f9834
|
|
| BLAKE2b-256 |
d1dfe60af5f00f0b5e0d8fb1e4cad6aa2271d423e00adf57c7379357d64657e0
|
Provenance
The following attestation bundles were made for dot_layered_transform-0.0.8a0-py3-none-any.whl:
Publisher:
publish_to_pypi.yml on J4CKVVH173/dot-layered-transform
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dot_layered_transform-0.0.8a0-py3-none-any.whl -
Subject digest:
b60ff3137dc466672517dcf4ed5bdbb3212a0ffa2265469694f6067204d47ccb - Sigstore transparency entry: 245931817
- Sigstore integration time:
-
Permalink:
J4CKVVH173/dot-layered-transform@c2dc7a9a90e144c7ba5dde87a9b0b16bdb84ce73 -
Branch / Tag:
refs/tags/v0.0.8-alpha - Owner: https://github.com/J4CKVVH173
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish_to_pypi.yml@c2dc7a9a90e144c7ba5dde87a9b0b16bdb84ce73 -
Trigger Event:
release
-
Statement type: