Skip to content

Commit

Permalink
Merge pull request #7481 from bluetech/tw-unicode-escape
Browse files Browse the repository at this point in the history
terminalwriter: bring back handling of printing characters not supported by stdout
  • Loading branch information
nicoddemus committed Jul 11, 2020
2 parents 7f467eb + 113339b commit 07f5f6f
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/_pytest/_io/terminalwriter.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,18 @@ def write(self, msg: str, *, flush: bool = False, **markup: bool) -> None:

msg = self.markup(msg, **markup)

self._file.write(msg)
try:
self._file.write(msg)
except UnicodeEncodeError:
# Some environments don't support printing general Unicode
# strings, due to misconfiguration or otherwise; in that case,
# print the string escaped to ASCII.
# When the Unicode situation improves we should consider
# letting the error propagate instead of masking it (see #7475
# for one brief attempt).
msg = msg.encode("unicode-escape").decode("ascii")
self._file.write(msg)

if flush:
self.flush()

Expand Down
9 changes: 9 additions & 0 deletions testing/io/test_terminalwriter.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,15 @@ def isatty(self):
assert not tw.hasmarkup


def test_terminalwriter_not_unicode() -> None:
"""If the file doesn't support Unicode, the string is unicode-escaped (#7475)."""
buffer = io.BytesIO()
file = io.TextIOWrapper(buffer, encoding="cp1252")
tw = terminalwriter.TerminalWriter(file)
tw.write("hello 🌀 wôrld אבג", flush=True)
assert buffer.getvalue() == br"hello \U0001f300 w\xf4rld \u05d0\u05d1\u05d2"


win32 = int(sys.platform == "win32")


Expand Down

0 comments on commit 07f5f6f

Please sign in to comment.