Porting map & parity status¶
This is the module-by-module map from upstream Python rich to this Rust port,
plus the porting status of each. It is the lookup table used by both the
port-module and sync-upstream skills, and the single source of truth for
"what's done".
Status: ⬜ not started · 🟡 partial (subset ported) · 🟢 complete
Parity: ✅ golden-tested against real rich · — none yet
Last verified: 2026-08-11, against Python rich 15.0.0 on rc/0.0.2
(9d2610d). The status column is what the differential sweeps measured, not
an estimate — see Parity for the figures.
Mirrored upstream: rich 15.0.0 (see UPSTREAM.toml).
Rendering core¶
upstream rich/… |
rust crates/rich/src/… |
status | parity |
|---|---|---|---|
color.py, color_triplet.py, _palettes.py, palette.py |
color.rs |
🟡 | ✅ truecolor + 8-bit + standard |
style.py |
style.rs |
🟡 | ✅ |
cells.py, _cell_widths.py |
cells.rs |
🟢 | ✅ 0 / 127,754 codepoints |
segment.py |
segment.rs |
🟡 | — |
markup.py |
markup.rs |
🟡 | ✅ |
text.py (+ justify, overflow) |
text.rs |
🟡 | ✅ |
_wrap.py |
wrap.rs |
🟢 | ✅ 0 / 30,680 wrap cases |
theme.py, themes.py, default_styles.py |
theme.rs |
🟡 | — |
terminal_theme.py |
terminal_theme.rs |
🟡 | ✅ |
console.py (+ ConsoleOptions, render_lines) |
console.rs |
🟡 | ✅ |
protocol.py, abc.py, _extension.py |
protocol.rs |
🟡 | — |
measure.py (+ Renderable::measure, fit) |
measure.rs |
🟡 | ✅ |
errors.py |
errors.rs |
🟡 | — |
control.py |
control.rs |
🟢 | ✅ |
ansi.py |
ansi.rs |
🟡 | ✅ |
highlighter.py (Regex/Repr/ISO8601) |
highlighter.rs |
🟡 | ✅ |
scope.py, region.py, containers.py |
(tbd) | ⬜ | — |
Widgets & layout¶
upstream rich/… |
rust file | status | parity |
|---|---|---|---|
box.py (all boxes + substitute) |
box.rs |
🟢 | ✅ |
rule.py |
rule.rs |
🟡 | ✅ |
padding.py |
padding.rs |
🟡 | ✅ |
panel.py |
panel.rs |
🟡 | ✅ |
align.py |
align.rs |
🟡 | ✅ |
constrain.py |
constrain.rs |
🟡 | ✅ |
table.py |
table.rs |
🟡 | ✅ |
columns.py |
columns.rs |
🟡 | ✅ |
tree.py |
tree.rs |
🟡 | ✅ |
layout.py |
layout.rs |
🟡 | ✅ |
styled.py |
styled.rs |
🟢 | ✅ |
screen.py |
screen.rs |
🟡 | — |
progress_bar.py |
progress_bar.rs |
🟡 | |
bar.py |
bar.rs |
🟡 | ✅ |
Live & progress¶
upstream rich/… |
rust file | status |
|---|---|---|
progress.py |
progress.rs |
🟡 |
spinner.py, _spinners.py (full table) |
spinner.rs |
🟡 |
status.py |
status.rs |
🟡 |
live_render.py |
live_render.rs |
🟡 |
live.py (manual refresh) |
live.rs |
🟡 |
Content renderers¶
upstream rich/… |
rust file | status | notes |
|---|---|---|---|
syntax.py |
syntax.rs |
🟡 | functional via syntect (non-parity, DIVERGENCES #18) |
markdown.py |
markdown.rs |
🟡 | paragraphs/headings/inline/lists/quotes/code/links (both hyperlinks modes) + images (including table-cell hoisting and adjacency) + GFM tables via pulldown-cmark (inline styling within a table cell deferred) |
json.py |
json.rs |
🟡 | ✅ default layout, arbitrary integers and overflowing exponents; optional escape-safe layout is off by default (DIVERGENCES §22) |
pretty.py |
pretty.rs |
🟡 | Rust-native (Debug + repr highlight, #19) |
repr.py, _inspect.py |
resp. | ⬜ | need Rust reflection — see #19 |
traceback.py |
traceback.rs |
🟡 | Rust-native (error source() chain, #19) |
_log_render.py |
log_render.rs |
🟡 | Rust-native formatter (#19) |
logging.py (log::Log handler) |
rich-ext |
⬜ | needs the log/tracing crate |
Utilities & platform¶
upstream rich/… |
rust file | status |
|---|---|---|
emoji.py, _emoji_codes.py, _emoji_replace.py |
emoji.rs |
🟡 |
filesize.py |
filesize.rs |
🟡 |
pager.py |
pager.rs |
🟡 |
prompt.py |
prompt.rs |
🟡 |
_unicode_data/ (21 version tables, UNICODE_VERSION) |
cell_widths.rs |
🟢 |
box.substitute (legacy/ASCII fallback) |
box.rs |
🟡 |
_windows.py, _win32_console.py, _windows_renderer.py |
windows/ |
⬜ |
jupyter.py, file_proxy.py, diagnose.py, _fileno.py, _null_file.py |
resp. | ⬜ |
_ratio.py (ratio_resolve) |
ratio.rs |
🟡 |
_loop.py, _pick.py, _stack.py, _timer.py |
internal helpers | ⬜ |
_export_format.py, Console.export_html |
export.rs |
🟡 |
rich-cli (tool — tracks upstream 1.8.1, see UPSTREAM.toml)¶
| upstream feature | rust crates/rich-cli/src/… |
status |
|---|---|---|
| arg parsing, plain-file print, capability demo | main.rs |
🟡 |
--print / --markdown / --json / --syntax / --csv / --rule, width + justify, stdin, extension auto-detect |
main.rs |
🟡 |
csv/tsv table render (blue border, numeric-column bold-green, quoted-field parse, csv.Sniffer) |
main.rs |
🟡 sniffer agrees with CPython's on 42/42 samples |
HTML export (--export-html) + SVG export (--export-svg) |
main.rs |
🟡 both done |
--panel/--padding decorators (+ title/caption/style), --ipynb, URL fetch (fetch feature) |
main.rs |
🟡 done |
paging (--pager) |
pager.rs + main.rs |
🟡 done |
When you change a module's status, keep this table and the relevant roadmap issue in sync.
0.0.3 title and notebook follow-up¶
Panel string labels parse markup/emoji, flatten newlines, expand tabs and measure
visible cells. Rule labels use console markup/emoji handling; Table title/caption
markup retains wrapped lines. Rich 15 goldens cover styled, wide, tiny, multiline
and truncated labels. Text span offsets remain valid when Unicode truncation
replaces a character with padding or an ellipsis. CLI notebooks compose the
upstream cell/output group before applying the shared decorators and alignment.
Windows paging selects more.com and has a required native CI launch test.