diff options
author | Anthony Sottile <asottile@umich.edu> | 2021-09-08 17:20:53 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-08 17:20:53 -0400 |
commit | eea10665da3d32e86bbcdc229890269d5ed624dc (patch) | |
tree | 12018453b0c6ee98999573f4b2982a3d5a41dddb | |
parent | 62cf28bf091826008796105f93231438af93a534 (diff) | |
parent | 7a353d2e23ed336cea41a05a03732a35e45801c2 (diff) | |
download | flake8-eea10665da3d32e86bbcdc229890269d5ed624dc.tar.gz |
Merge pull request #1382 from PyCQA/stdio-encoding-sadness
write directly to sys.stdout.buffer to avoid windows io encoding
-rw-r--r-- | src/flake8/formatting/base.py | 3 | ||||
-rw-r--r-- | tests/unit/test_base_formatter.py | 27 |
2 files changed, 10 insertions, 20 deletions
diff --git a/src/flake8/formatting/base.py b/src/flake8/formatting/base.py index 806d9b8..7919f92 100644 --- a/src/flake8/formatting/base.py +++ b/src/flake8/formatting/base.py @@ -1,6 +1,7 @@ """The base class and interface for all formatting plugins.""" import argparse import os +import sys from typing import IO from typing import List from typing import Optional @@ -183,7 +184,7 @@ class BaseFormatter: if self.output_fd is not None: self.output_fd.write(output + self.newline) if self.output_fd is None or self.options.tee: - print(output, end=self.newline) + sys.stdout.buffer.write(output.encode() + self.newline.encode()) def write(self, line: Optional[str], source: Optional[str]) -> None: """Write the line either to the output file or stdout. diff --git a/tests/unit/test_base_formatter.py b/tests/unit/test_base_formatter.py index b9e9b8d..9fe2c4e 100644 --- a/tests/unit/test_base_formatter.py +++ b/tests/unit/test_base_formatter.py @@ -102,7 +102,7 @@ def test_show_source_updates_physical_line_appropriately(line1, line2, column): @pytest.mark.parametrize("tee", [False, True]) -def test_write_uses_an_output_file(tee): +def test_write_uses_an_output_file(tee, capsys): """Verify that we use the output file when it's present.""" line = "Something to write" source = "source" @@ -111,16 +111,11 @@ def test_write_uses_an_output_file(tee): formatter = base.BaseFormatter(options(tee=tee)) formatter.output_fd = filemock - with mock.patch("flake8.formatting.base.print") as print_func: - formatter.write(line, source) - if tee: - assert print_func.called - assert print_func.mock_calls == [ - mock.call(line, end="\n"), - mock.call(source, end="\n"), - ] - else: - assert not print_func.called + formatter.write(line, source) + if tee: + assert capsys.readouterr().out == f"{line}\n{source}\n" + else: + assert capsys.readouterr().out == "" assert filemock.write.called is True assert filemock.write.call_count == 2 @@ -130,8 +125,7 @@ def test_write_uses_an_output_file(tee): ] -@mock.patch("flake8.formatting.base.print") -def test_write_uses_print(print_function): +def test_write_uses_print(capsys): """Verify that we use the print function without an output file.""" line = "Something to write" source = "source" @@ -139,12 +133,7 @@ def test_write_uses_print(print_function): formatter = base.BaseFormatter(options()) formatter.write(line, source) - assert print_function.called is True - assert print_function.call_count == 2 - assert print_function.mock_calls == [ - mock.call(line, end="\n"), - mock.call(source, end="\n"), - ] + assert capsys.readouterr().out == f"{line}\n{source}\n" class AfterInitFormatter(base.BaseFormatter): |