Skip to main content

Dependency analysis, coupling enforcement, and architectural contract visualization for Django/Python projects.

Project description

grimp-tools

Dependency analysis, coupling enforcement, and architectural contract visualization for Django/Python projects.

Reads configuration from the consumer project's pyproject.toml. Zero config needed if you already use import-linter.

Installation

uv add --dev grimp-tools

Requires Python 3.11+.

Prerequisites

Your project must have import-linter configured with root_packages:

# pyproject.toml
[tool.importlinter]
root_packages = ["api", "game", "engine", "authentication"]

Commands

analyze

Module and app-level dependency analysis with cycle detection.

grimp-tools analyze
grimp-tools analyze --exit-on-cycles          # exit 1 if cycles found (CI)
grimp-tools analyze --history docs/deps.log   # append timestamped report
grimp-tools analyze --skip migrations,admin   # override skip modules
grimp-tools analyze --extra-packages celery   # add packages beyond root_packages

snapshot

Save and compare dependency snapshots over time.

grimp-tools snapshot save                     # save to docs/deps-snapshot.json
grimp-tools snapshot diff                     # compare current vs saved
grimp-tools snapshot diff --ref master        # compare current vs snapshot at git ref
grimp-tools snapshot summary                  # print metrics without saving

Track docs/deps-snapshot.json in git to see how dependencies evolve across commits.

focus-graph

Focused Mermaid graph showing only what changed between two git refs. Uses worktrees for clean builds.

grimp-tools focus-graph                              # HEAD vs HEAD~1
grimp-tools focus-graph --new main --old main~1      # specific refs
grimp-tools focus-graph -o docs/focus-graph.md       # save .md + .html

contracts-graph

Visualize import-linter contracts as Mermaid diagrams.

grimp-tools contracts-graph                          # print to stdout
grimp-tools contracts-graph -o docs/contracts.md     # save .md + .html

check-names

Validate that Python files follow naming conventions.

grimp-tools check-names                              # check all tracked .py files
grimp-tools check-names --ref master                 # only files changed vs ref

Coupling contract (import-linter plugin)

A custom import-linter contract that enforces coupling thresholds as a ratchet: coupling can decrease (warns to update config) but not increase (breaks the contract).

# pyproject.toml
[tool.importlinter]
contract_types = [
  "coupling_metrics: grimp_tools.coupling_contract.CouplingMetricsContract",
]

[[tool.importlinter.contracts]]
id = "coupling"
name = "Coupling metrics"
type = "coupling_metrics"
skip_modules = "migrations,admin,apps,management"
top_n = 30
exact_edges = 42
exact_cross_app_edges = 18

Run with lint-imports --verbose to see the full coupling report.

Configuration

All configuration is optional. If [tool.grimp-tools] is absent, defaults are used.

# pyproject.toml
[tool.grimp-tools]
# Modules to skip in analysis (default: migrations, admin, apps, management)
skip_modules = ["migrations", "admin", "apps", "management"]

# Snapshot output path (default: docs/deps-snapshot.json)
snapshot_path = "docs/deps-snapshot.json"

# File naming conventions for check-names
standard_names = [
  "models", "managers", "views", "serializers", "services", "urls",
  "admin", "apps", "forms", "signals", "tasks", "choices", "fields",
  "widgets", "middleware", "decorators", "exceptions", "types",
  "perms", "filters", "queries", "factories", "report", "adapters",
  "validators", "defaults", "enums", "mixins", "contexts", "caches",
  "actions", "tags", "pagination", "storage", "config", "help_texts",
  "conftest", "router", "settings", "wsgi", "manage",
]

exempt_dirs = [
  "migrations", "management", "commands", "scripts", "docs",
  "templatetags",
]

Makefile integration

deps:
	grimp-tools analyze --history docs/deps-history.log

snapshot:
	grimp-tools snapshot save

focus-graph:
	grimp-tools focus-graph --new main --old main~1 -o docs/focus-graph.md

check:
	lint-imports
	grimp-tools check-names

Releasing

Publishing is automated via GitHub Actions with Trusted Publishers (OIDC, no tokens needed).

To publish a new version:

  1. Update version in pyproject.toml
  2. Commit and push to main
  3. Create a git tag: git tag v0.2.0 && git push origin v0.2.0
  4. Go to GitHub > Releases > "Draft a new release", select the tag, and click "Publish release"

The workflow (.github/workflows/publish.yml) builds and uploads to PyPI automatically via Trusted Publishers.

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

grimp_tools-0.3.0.tar.gz (69.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

grimp_tools-0.3.0-py3-none-any.whl (37.2 kB view details)

Uploaded Python 3

File details

Details for the file grimp_tools-0.3.0.tar.gz.

File metadata

  • Download URL: grimp_tools-0.3.0.tar.gz
  • Upload date:
  • Size: 69.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for grimp_tools-0.3.0.tar.gz
Algorithm Hash digest
SHA256 a5d44c2f1867e1c643a7c54a408a28c1180922afff14e469b12ecd9090b1f1fd
MD5 f3175ddb6c4f915417dda966a891f2a3
BLAKE2b-256 6acfb188068aeda7560c0b93ac633cef110ff26df6f2006948b1683bd50d4ebc

See more details on using hashes here.

Provenance

The following attestation bundles were made for grimp_tools-0.3.0.tar.gz:

Publisher: publish.yml on Virako/grimp-tools

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file grimp_tools-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: grimp_tools-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 37.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for grimp_tools-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 de91c9a0ebd25c24b3114c0cc7ab4a2bb0970ef12cfb4074c75854ce714dff9a
MD5 581da89b9394fe4fc4f3af92a0c01ef4
BLAKE2b-256 959e25f7f347cca6122bf6eac0fc166a52980d8dbd147a8b8e04896deddcc47f

See more details on using hashes here.

Provenance

The following attestation bundles were made for grimp_tools-0.3.0-py3-none-any.whl:

Publisher: publish.yml on Virako/grimp-tools

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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