Skip to content

Commit 0744edc

Browse files
nightcitybladehenryiii
authored andcommitted
fix: fall back for legacy-encoded spinners
1 parent 6934e30 commit 0744edc

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

nox/_parallel.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
from nox.sessions import SessionRunner
6868

6969
_SPINNER = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
70+
_ASCII_SPINNER = "|/-\\"
7071
_SYMBOLS = {
7172
Status.SUCCESS: "✓",
7273
Status.SKIPPED: "⊘",
@@ -129,6 +130,15 @@ def _status_symbol(status: Status, encoding: str | None) -> str:
129130
return symbol
130131

131132

133+
def _spinner_frame(spin: int, encoding: str | None) -> str:
134+
frame = _SPINNER[spin % len(_SPINNER)]
135+
try:
136+
frame.encode(encoding or "utf-8")
137+
except UnicodeEncodeError:
138+
return _ASCII_SPINNER[spin % len(_ASCII_SPINNER)]
139+
return frame
140+
141+
132142
@dataclasses.dataclass(kw_only=True)
133143
class _Reporter:
134144
"""Buffers per-session output and renders progress.
@@ -206,7 +216,7 @@ def _render(self, now: float, width: int) -> list[str]:
206216
header = plain_header[: width - 1]
207217
lines = [self._banner(width), header]
208218

209-
frame = _SPINNER[self._spin % len(_SPINNER)]
219+
frame = _spinner_frame(self._spin, self.stream.encoding)
210220
for name, start in self._active.items():
211221
# Plain and colored renderings are built from the same segments so
212222
# the width math can't drift from what is actually displayed.

tests/test_parallel.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,15 @@ def test_reporter_render_truncates_to_width() -> None:
613613
assert "\x1b" not in line
614614

615615

616+
def test_reporter_render_uses_ascii_spinner_for_legacy_encoding() -> None:
617+
buffer = io.BytesIO()
618+
with io.TextIOWrapper(buffer, encoding="cp1252") as stream:
619+
reporter = _parallel._Reporter(color=False, tty=True, total=1)
620+
reporter.stream = stream
621+
reporter._active = {"a": 100.0}
622+
assert reporter._render(105.0, width=0)[2] == "| a (5s)"
623+
624+
616625
def test_reporter_render_color() -> None:
617626
reporter = _parallel._Reporter(color=True, tty=False, total=1)
618627
reporter._active = {"a": 100.0}

0 commit comments

Comments
 (0)