Skip to main content

pymap

Map a Python codebase in one command. No service, no upload: everything is analysed and rendered locally.

cd my-project
pymap --open

pymap guesses which package to analyse, runs whichever graph tools you have installed, and assembles the result into a single page — plus a flow explorer that pymap builds itself: for every function, the order of the calls, the conditions, the loops, the error paths, and the data flowing through.

Install

pipx install pymap-cli          # isolated, available everywhere
# or, inside the project you want to map:
pip install pymap-cli

The core depends only on the standard library, so installing pymap into a project adds no version constraint to it. The graph tools are optional and live behind an extra:

pip install "pymap-cli[graphs]"     # pydeps, code2flow, pylint, tach
brew install graphviz               # or: apt install graphviz

Any missing tool is reported at start-up and then skipped; the explorer always works.

Usage

pymap                              # guess the current project's package
pymap src/mypkg                    # explicit target
pymap src/mypkg -o map/ --open     # output directory, open when done
pymap --exclude "generated_*"      # skip more paths
pymap --editor pycharm             # code links for another editor

How the target is guessed, in order: [tool.pymap] target in pyproject.toml, a src/<package>/ layout, the package named after the project, then the single top-level package. If nothing stands out, pymap says so and waits for a path.

Configuration

Optional, in the project's pyproject.toml (read on Python ≥ 3.11, or with tomli installed):

[tool.pymap]
target  = "src/mypkg"
output  = "pymap-out"
editor  = "vscode"          # vscodium, cursor, windsurf, zed, pycharm,
                            # idea, sublime, none, or "myeditor://{f}:{l}"
exclude = ["vendor", "generated_*"]
timeout = 300               # seconds per external tool

As a library

from pymap import Settings, map_codebase

report = map_codebase(Settings(target="src/mypkg", output="map/"))
print(report.coverage, "% documented,", len(report.cycles), "cycles")

What the map contains

View Source What you read there
Walkthrough tree pymap (AST) The execution flow function by function, keyboard-navigable
Imports between modules pydeps The layers, and the modules everyone pulls in
Classes and inheritance pyreverse Attributes and hierarchies, when the code is object-oriented
Module boundaries tach File-by-file dependencies, cycles, Mermaid source

The output directory (pymap-out/ by default) holds index.html — the page to open — and the views it links to.

In the explorer

walk the steps · step into the highlighted call · go back up · m mark seen · o open in the editor · / search

How the code is organised

src/pymap/
├── cli.py           command line: arguments, pyproject, messages
├── settings.py      what to analyse, where to write, what to skip
├── mapper.py        orchestration + library API
├── runner.py        launching external tools, detecting missing ones
├── render.py        templates → HTML pages
├── analysis/        what pymap works out on its own, from the AST
│   ├── symbols.py     modules, classes, functions, signatures
│   ├── flow.py        execution tree of a function
│   ├── calls.py       code2flow's call graph
│   └── cycles.py      circular dependencies
├── tools/           one module per external tool
│   ├── pydeps.py    pyreverse.py    code2flow.py    tach.py
└── templates/       index.html, section.html, explorer.html

Adding a tool: drop a module in tools/ exposing execute(settings) that returns raw facts (never HTML), then add one line to STEPS and one section to _sections(), both in mapper.py. See CONTRIBUTING.md.

Guarantees

  • Nothing is executed from the analysed code: everything goes through the standard library's AST.
  • Nothing is written into the target project. tach requires a tach.toml at the root of wherever it runs, so pymap copies the sources into a temporary directory instead of dropping that file in your tree.
  • Environments and caches (.venv/, node_modules/, build/, __pycache__/, …) are pruned during the walk, never traversed.

Known limitations

  • Files sharing a basename share a namespace. Symbol keys are <file stem>::<qualified name>, because that is how code2flow names its graph nodes and it is what lets the two data sets be joined. In a project with app/models.py and blog/models.py, their symbols merge in the explorer. pymap prints a note when it detects the case.
  • tach declares at most 60 modules. Beyond that tach sync gets very slow for a graph that is already unreadable. The count left out is reported.
  • The call graph is only as good as code2flow's static resolution: calls through dynamic dispatch or getattr do not appear.

Development

git clone https://github.com/hermann225-zrouama/pymap-cli
cd pymap-cli
pip install -e ".[dev]"
pytest
ruff check src tests && ruff format --check src tests
pymap                  # pymap maps itself

tests/test_contract.py pins the key names shared between the Python payload and templates/explorer.html. A rename on one side without the other produces a blank page rather than an error, so that test is what keeps them honest.

Licence

MIT — see LICENSE.

The distribution is named pymap-cli because pymap is already taken on PyPI by an IMAP library. The command and the import name are both pymap.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pymap_cli-0.4.0.tar.gz (48.7 kB view details)

Uploaded Source

Built Distribution

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

pymap_cli-0.4.0-py3-none-any.whl (44.1 kB view details)

Uploaded Python 3

File details

Details for the file pymap_cli-0.4.0.tar.gz.

File metadata

  • Download URL: pymap_cli-0.4.0.tar.gz
  • Upload date:
  • Size: 48.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pymap_cli-0.4.0.tar.gz
Algorithm Hash digest
SHA256 a97eafe65be4aac344f6a77066a7d5db700b11bd71cc8c73dc50f5813c0d1314
MD5 c8bd2e239c54e958b15609e984efa364
BLAKE2b-256 210dd856064cdb003e85622c9915b7143ee706be5977039656084bead86bd921

See more details on using hashes here.

Provenance

The following attestation bundles were made for pymap_cli-0.4.0.tar.gz:

Publisher: publish.yml on hermann225-zrouama/pymap-cli

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

File details

Details for the file pymap_cli-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: pymap_cli-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 44.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for pymap_cli-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 81ec656269d703127fdd99d96f383119155d7e360d684eca3c76e7d2ab60636b
MD5 e4cf49096303054a77528eee45f8b11c
BLAKE2b-256 4834897c0bdd1fa0a7bc6b8ac2aca510d54e45687ddd9da841a131df74db948f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pymap_cli-0.4.0-py3-none-any.whl:

Publisher: publish.yml on hermann225-zrouama/pymap-cli

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

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 files

0.3.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page