Sorginte · Open source · v0.2.0

Know what follows from a Python change.

Static dependency impact for Python modules and pytest files, with the path behind every result.

Working-tree impact
urmare impact --changed
Illustrative resultimpact --changed
  1. changedsrc/payments/service.py
  2. directsrc/api/checkout.py
  3. testtests/api/test_checkout.py
  4. testtests/payments/test_service.py
1 change1 module2 testspaths retained

01 · Impact model

Change → result.

Urmare turns a changed Python file into a dependency graph, affected modules, affected tests, and an explanation path.
  1. 01

    Changed file

    src/payments/service.py
  2. 02

    Dependency graph

    static imports
  3. 03

    Affected modules

    src/api/checkout.py
  4. 04

    Affected tests

    tests/test_service.py
  5. 05

    Explanation

    service.py → test_service.py
Current boundarystatic importsfile-leveldeterministicconservative when required

Not symbol-level, call-graph, runtime, framework-specific, individual-test, or dependency-upgrade analysis.

02 · Product surface

Four operations.

01

Repository model

Discover Python modules and tests. Resolve static imports.

  • discovery
  • absolute + relative imports
02

Change inputs

Analyze explicit files, the working tree, or a Git merge base.

  • files
  • --changed
  • --git-diff
03

Impact outputs

Return direct and transitive modules, pytest files, and paths.

  • modules
  • tests
  • why
04

Repeatable automation

Reuse the persistent index. Emit stable schema-versioned JSON.

  • incremental index
  • JSON v1

03 · Terminal

One change. Two commands.

Illustrative paths and output.

Illustrative session
$ urmare impact --changed
Impact analysis

Changed (1)
  src/payments/service.py

Directly affected modules (1)
  src/api/checkout.py

Affected tests (2)
  tests/api/test_checkout.py
  tests/payments/test_service.py

$ urmare tests --affected --changed
tests/api/test_checkout.py
tests/payments/test_service.py

04 · Analysis cycle

Six deterministic stages.

  1. 01

    Discover

    repository Python files

  2. 02

    Resolve

    modules + static imports

  3. 03

    Index

    reuse unchanged work

  4. 04

    Traverse

    reverse dependencies

  5. 05

    Select

    affected pytest files

  6. 06

    Explain

    preserve dependency paths

05 · Correctness

Prefer visible cost to silent omission.

+

Extra validation

Visible. Conservative. Recoverable.

favor recall

Missed affected file

Silent. More harmful.

  • Uncertaintystays visible in diagnostics
  • Configuration changecan require full validation
  • Analysis unavailablenever becomes a fabricated empty result

06 · Installation

Install from PyPI.

Version 0.2.0 provides binary wheels for Python 3.9–3.14.

uv tool

Recommended isolated install
uv tool install urmare

pipx

Isolated install
pipx install urmare

pip

Virtual environment
pip install urmare

Ephemeral

Run without a persistent install
uvx urmare impact --changed

Verified: PyPI · GitHub Releases

07 · Performance

Real repositories. Measured end to end.

One-file incremental impact completed in 79–263 ms median across five pinned public Python projects.

pinned projects
5
paired samples each
15
incremental median
79–263 ms
Median end-to-end CLI latency in milliseconds for cold, warm, and one-file incremental impact.
ProjectColdempty indexWarmno changeIncrementalone file
Flask15 paired samples116 ms75 ms79 ms
FastAPI15 paired samples222 ms92 ms101 ms
Django15 paired samples628 ms220 ms230 ms
pandas15 paired samples456 ms117 ms126 ms
Apache Airflow15 paired samples610 ms256 ms263 ms

Scroll horizontally to compare scenarios.

Fifteen independently prepared paired samples per project at pinned public repository revisions, using one optimized Urmare binary, isolated persistent caches, one discarded warm-up, and a deterministic content-only edit. The OS filesystem cache was not flushed.

Open source

Run it on a repository.