merging the external commit

This commit is contained in:
Ilja Orlovs 2021-10-13 11:27:10 +01:00
commit 46dc6d501c
2 changed files with 14 additions and 13 deletions

View file

@ -184,12 +184,13 @@ class BaseFormatter:
try:
sys.stdout.write(value)
except UnicodeEncodeError:
byte_value = value.encode(sys.stdout.encoding, 'backslashreplace')
if hasattr(sys.stdout, 'buffer'):
byte_value = value.encode(sys.stdout.encoding, "backslashreplace")
if hasattr(sys.stdout, "buffer"):
sys.stdout.buffer.write(byte_value)
else:
sys.stdout.write(
byte_value.decode(sys.stdout.encoding, 'strict'))
byte_value.decode(sys.stdout.encoding, "strict")
)
def _write(self, output: str) -> None:
"""Handle logic of whether to use an output file or print()."""

View file

@ -136,33 +136,33 @@ def test_write_produces_stdout(capsys):
assert capsys.readouterr().out == f"{line}\n{source}\n"
@pytest.mark.parametrize('buffered_stdout', [True, False])
@pytest.mark.parametrize("buffered_stdout", [True, False])
def test_write_hook_fallbacks(buffered_stdout):
"""Varify stdout.write() fallbacks."""
mock_line = mock.Mock(name='Mock Line')
mock_line = mock.Mock(name="Mock Line")
stdout_spec = ['write', 'encoding']
stdout_spec = ["write", "encoding"]
if buffered_stdout:
stdout_spec.append('buffer')
stdout_spec.append("buffer")
with mock.patch('sys.stdout', spec=stdout_spec) as mock_stdout:
with mock.patch("sys.stdout", spec=stdout_spec) as mock_stdout:
def _stdout_write_effect(value):
if value is mock_line:
raise UnicodeEncodeError('unittest-codec', u'', 42, 43, 'NOPE')
raise UnicodeEncodeError("unittest-codec", "", 42, 43, "NOPE")
return None
mock_stdout.write.side_effect = _stdout_write_effect
mock_stdout.encoding = 'ascii'
mock_stdout.write.side_effect = _stdout_write_effect
mock_stdout.encoding = "ascii"
formatter = base.BaseFormatter(options())
formatter.write(mock_line, None)
mock_line.encode.assert_called_once_with('ascii', 'backslashreplace')
mock_line.encode.assert_called_once_with("ascii", "backslashreplace")
byte_mock_line = mock_line.encode.return_value
if buffered_stdout:
mock_stdout.buffer.write.assert_any_call(byte_mock_line)
else:
byte_mock_line.decode.assert_called_once_with('ascii', 'strict')
byte_mock_line.decode.assert_called_once_with("ascii", "strict")
mock_stdout.write.assert_any_call(byte_mock_line.decode.return_value)