Skip to main content

renderdag

A Python port of Meta's sapling-renderdag Rust library for rendering directed acyclic graphs (DAGs) as text.

Renderers

ASCII — basic characters, compact:

o    E  merge commit
|\
o |  D
| |
| o  C  branch
|/
o  B
|
o  A

ASCII Large — wider spacing, easier to read:

o     E  merge commit
|\
| \
o  |  D
|  |
|  o  C  branch
| /
|/
o  B
|
o  A

Box Drawing — Unicode line-drawing characters:

o    E  merge commit
├─╮
o │  D
│ │
│ o  C  branch
├─╯
o  B
│
o  A

Install

pip install renderdag
# or
uv add renderdag

Usage

from renderdag import Ancestor, GraphRowRenderer

renderer = GraphRowRenderer().output().build_box_drawing()

# Render rows top-down (most recent commit first)
print(renderer.next_row("C", [Ancestor.parent("B")], "o", "C  latest"))
print(renderer.next_row("B", [Ancestor.parent("A")], "o", "B"))
print(renderer.next_row("A", [], "o", "A  root"))

The API follows a row-at-a-time model: call next_row() for each node in topological order (heads first), passing the node identifier, its parents as Ancestor values, a glyph string, and a message. The renderer tracks column state and returns the formatted string for that row.

Ancestor types

  • Ancestor.parent(node) — direct parent (solid line)
  • Ancestor.ancestor(node) — indirect ancestor (dotted line)
  • Ancestor.anonymous() — unknown/missing parent (terminator ~)

Builder options

# ASCII renderer
renderer = GraphRowRenderer().output().build_ascii()

# ASCII Large with taller rows
renderer = GraphRowRenderer().output().with_min_row_height(3).build_ascii_large()

# Box Drawing with square corners instead of curved
renderer = GraphRowRenderer().output().build_box_drawing().with_square_glyphs()

# Reserve a column for a node before it appears
renderer.reserve("some-node")

Development

Requires uv and just.

just demo          # see example output from all renderers
just test          # run all tests
just test-fast     # skip Rust cross-validation
just test-xval     # run only Rust cross-validation

License

MIT. This is a derivative work of sapling-renderdag by Meta Platforms, Inc. See LICENSE for details.

Note: this library was created using LLMs.

Release files for renderdag 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for renderdag 0.1.1
File Size Uploaded
renderdag-0.1.1.tar.gz 8.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for renderdag 0.1.1
File Interpreter ABI Platform
renderdag-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 20.8 kB

Release files / renderdag-0.1.1.tar.gz

Download URL renderdag-0.1.1.tar.gz
Size 8.4 kB
Tags Source
SHA-256 checksum
How to use checksums
bc474583ab450c155c788d07bd6e5400c81105a787e13f720d42496b90fe8f5b
BLAKE2b-256 checksum
How to use checksums
36806d8316097b96553402943adc0dc2c32f23ed1c2ea435431cafd98de648e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release files / renderdag-0.1.1-py3-none-any.whl

Download URL renderdag-0.1.1-py3-none-any.whl
Size 12.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
89f67da5e045e42a08b7e7c4024a4601467ae68b4280d5187bdbc7f04084c95a
BLAKE2b-256 checksum
How to use checksums
64293ac771a191bd0509d988941ac21e77752e27e05309a0927c4e0b5e510dd9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release 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