`ruff format .` across the repo: 153 files, no behaviour change. This is the second gate CONTRIBUTING.md promises, and until now it reported 154 files needing reformat — so a first contributor ran the command the guide told them to run and could not tell their own diff from the background. Landed on its own, with nothing else in it, because a whole-repo reformat is only safe to skip past in blame if it is provably nothing but layout. It was checked that way rather than assumed: every changed file was formatted in memory and compared by full `ast.dump()`, and 152 of 153 come out structurally identical (the one exception was a docstring opening on a quote character, fixed in the commit before this one). The string and comment token streams were diffed separately, so a quote flip or an edited comment could not hide inside a re-layout — five quote-style normalisations and sixteen implicit-concatenation joins, all value-identical, and one commented-out line gaining the space after its `#`. `meshterm specimen` is byte-identical on both platforms, and the suite is 1888 green, gallery gate and `test_theme16` included. What actually changed, in order of how much of the diff it is: wrapped calls and signatures rejoin onto one line where they fit inside the hundred columns; the magic trailing comma expands what it is there to expand; complex slices gain their spaces (`[len(noise) :]`); a few redundant parens go. The tables that are laid out to be read were fenced in the previous commit and are untouched here. The aligned trailing-comment column is gone from about ninety lanes that were not fenced — including the `heat.*` ladder in `MESH_THEME`, which cannot be fenced where it sits. Every comment stays on the entry it describes, so nothing there reads wrong; it just no longer lines up. Add this commit to `.git-blame-ignore-revs`, which follows immediately. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
75 lines
3.4 KiB
Python
75 lines
3.4 KiB
Python
"""Session width tests: reclaiming the terminal's final column.
|
|
|
|
Some terminals (and prompt_toolkit's size probe on them) report the window one column
|
|
narrower than it really is, so the frame's right border lands one short and the true last
|
|
column sits unused. The session can report one extra column to close that gap. The wrapping
|
|
output is pure and the resolver is a small branch, so both are assertable without a terminal.
|
|
|
|
The default comes from the active :class:`~meshterm.platforms.Platform` (on, desktop; off,
|
|
PicoCalc — reclaiming a phantom column on its exact-width console would tear the frame), and
|
|
``MESHTERM_FULL_WIDTH`` remains an explicit override on top of that default either way.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from types import SimpleNamespace
|
|
|
|
from prompt_toolkit.data_structures import Size
|
|
|
|
from meshterm.platforms import PICOCALC, REGULAR, set_platform
|
|
from meshterm.ui.tui.session import TuiSession, _WidthExtendedOutput
|
|
|
|
|
|
def test_width_extended_output_reports_one_more_column() -> None:
|
|
"""get_size() gains a column; every other attribute forwards to the wrapped output."""
|
|
inner = SimpleNamespace(
|
|
get_size=lambda: Size(rows=24, columns=80),
|
|
write=lambda s: f"wrote:{s}",
|
|
encoding="utf-8",
|
|
)
|
|
out = _WidthExtendedOutput(inner)
|
|
assert out.get_size() == Size(rows=24, columns=81) # the reclaimed column
|
|
assert out.write("x") == "wrote:x" # forwarded method
|
|
assert out.encoding == "utf-8" # forwarded attribute
|
|
|
|
|
|
def test_session_leaves_a_supplied_output_untouched() -> None:
|
|
"""A test-supplied output is never wrapped — headless sizes stay exactly as set."""
|
|
dummy = SimpleNamespace(get_size=lambda: Size(rows=10, columns=40))
|
|
session = TuiSession(output=dummy)
|
|
assert session._resolve_output() is dummy
|
|
|
|
|
|
def test_session_wraps_the_real_terminal_on_regular(monkeypatch) -> None:
|
|
"""No supplied output + REGULAR (today's default) → the real terminal is width-extended."""
|
|
fake = SimpleNamespace(get_size=lambda: Size(rows=30, columns=100))
|
|
monkeypatch.setattr("prompt_toolkit.output.defaults.create_output", lambda: fake)
|
|
monkeypatch.delenv("MESHTERM_FULL_WIDTH", raising=False)
|
|
set_platform(REGULAR)
|
|
out = TuiSession()._resolve_output()
|
|
assert isinstance(out, _WidthExtendedOutput)
|
|
assert out.get_size() == Size(rows=30, columns=101)
|
|
|
|
|
|
def test_session_leaves_the_bare_terminal_on_picocalc(monkeypatch) -> None:
|
|
"""PICOCALC's exact-width console → no reclaim: a phantom column would tear the frame."""
|
|
monkeypatch.delenv("MESHTERM_FULL_WIDTH", raising=False)
|
|
set_platform(PICOCALC)
|
|
assert TuiSession()._resolve_output() is None
|
|
|
|
|
|
def test_env_override_forces_reclaim_on_despite_picocalc(monkeypatch) -> None:
|
|
"""``MESHTERM_FULL_WIDTH=1`` wins over PICOCALC's off-by-default."""
|
|
fake = SimpleNamespace(get_size=lambda: Size(rows=30, columns=100))
|
|
monkeypatch.setattr("prompt_toolkit.output.defaults.create_output", lambda: fake)
|
|
monkeypatch.setenv("MESHTERM_FULL_WIDTH", "1")
|
|
set_platform(PICOCALC)
|
|
assert isinstance(TuiSession()._resolve_output(), _WidthExtendedOutput)
|
|
|
|
|
|
def test_env_override_forces_reclaim_off_despite_regular(monkeypatch) -> None:
|
|
"""``MESHTERM_FULL_WIDTH=0`` wins over REGULAR's on-by-default."""
|
|
monkeypatch.setenv("MESHTERM_FULL_WIDTH", "0")
|
|
set_platform(REGULAR)
|
|
assert TuiSession()._resolve_output() is None
|