All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Plain Python packages now appear in the live debug view (
/__depmap__/) as well as the management command output. Switched_discover_plain_packagesfromimportlib.import_moduletoimportlib.util.find_specso discovery no longer executes the package's__init__.py; this avoids import-time exceptions (e.g.AppRegistryNotReady, circular imports) that silently suppressed discovery in a web-request context. - Namespace packages (no
__init__.py) are now supported as root packages viaspec.submodule_search_locations. - Broadened exception handling in plain-package discovery so a single broken root package can no longer null out the whole
app_mapvia the outerexcept Exceptionin_run_analysis.
- Diagnostic warnings emitted once per process when a plain package can't be resolved (bad import, missing spec, or no source location) — helps future users diagnose configuration issues without log spam.
- Support for plain Python packages in
DEPENDENCY_MAP_ROOT_PACKAGES. Subpackages of a non-Django root package are auto-discovered and added as nodes alongside Django apps; flat packages become a single node. Django app internals (migrations/,management/,templatetags/,locale/) and subpackages of registered Django apps are excluded.
- Regression in the display of third-party packages. Abstract-base-model nodes that appeared in foreign clusters are now skipped outright rather than reattributed, which was causing inherited FKs (e.g.
created_by) to be incorrectly drawn between apps. Inheritance edges were already suppressed by edge classification.
Duplicate release tag — points at the same commit as 0.3.1 (tagging mistake). No changes.
- Abstract models causing spurious dependency cycles.
graph_models --group-modelsduplicates abstract-base nodes into every cluster that inherits from them; the parser now detects foreign nodes via the node-ID prefix and resolves them to the true owning app instead of attributing FKs to each inheriting app.
- Import-linter contract rule export. New "Rules" tab in the export panel generates ready-to-paste
.importlintercontract rules from the currently visible graph. - Root packages are now threaded through to the renderer and DjDT panel so exported rules reference the correct top-level package names.
- Export panel redesigned from modal dialog to bottom-docked drawer for better visibility while inspecting the graph.
- Model relationship classification: FK, O2O, M2M, and generic relations are now distinguished in the model-edge type, parsed from DOT arrow attributes via
_classify_dot_edge. - Per-edge
import_countso edge thickness / tooltips can reflect import frequency. - Cycle-break suggestions via
grimp.nominate_cycle_breakers(). Suggested edges are surfaced both in the graph (is_break_suggestionflag) and as a structured list in the serialized output. - Inheritance edges are now filtered out of the model graph — grimp already covers these via imports, so including them double-counts.
- Edge parser rewritten to capture the full attribute string, enabling downstream edge classification.
dependency_mapmanagement command with--open,--format,--output,--checkflags- Model-level FK/M2M relationship extraction via
graph_models(django-extensions) - Import graph analysis via
grimp - Unified app-level graph merging both sources with coupling classification (
fk,import,both) - Interactive D3 v7 force-directed HTML visualisation (self-contained, no server required)
- Edge colour coding: FK (blue), import (green, dashed), both (purple), violation (red), cycle (orange)
- Node sizing proportional to model count
- Side panel: model list, instability metric, afferent/efferent coupling, dependency list
- Edge tooltip: model-level FK pairs and field names
- Filter buttons to toggle edge types independently
.importlinter/setup.cfgcontract auto-parsing (layers, independence, forbidden)- Cycle detection via Tarjan's SCC algorithm
- Cycle visualisation: orange node halos, orange cycle edges, cycle panel section
--checkCI mode: structured stderr report, exits 1 on violations or cycles--no-importlinterflag to skip contract auto-loading--violation SRC:TGTflag for manual violation pairs--root-packageflag (repeatable) for monorepo support- JSON output mode (
--format json)