summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Sottile <asottile@umich.edu>2021-09-08 17:20:53 -0400
committerGitHub <noreply@github.com>2021-09-08 17:20:53 -0400
commiteea10665da3d32e86bbcdc229890269d5ed624dc (patch)
tree12018453b0c6ee98999573f4b2982a3d5a41dddb
parent62cf28bf091826008796105f93231438af93a534 (diff)
parent7a353d2e23ed336cea41a05a03732a35e45801c2 (diff)
downloadflake8-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.py3
-rw-r--r--tests/unit/test_base_formatter.py27
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):