From 0bf8d2a88586b6a1490fd5eaa1d29e1ed16ea705 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 7 Jan 2021 08:41:11 -0800 Subject: [PATCH] ensure crlf line endings of stdin are handled properly --- src/flake8/utils.py | 3 ++- tests/unit/test_utils.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/flake8/utils.py b/src/flake8/utils.py index 8963011..29dc554 100644 --- a/src/flake8/utils.py +++ b/src/flake8/utils.py @@ -195,7 +195,8 @@ def _stdin_get_value_py3(): # type: () -> str fd = io.BytesIO(stdin_value) try: coding, _ = tokenize.detect_encoding(fd.readline) - return stdin_value.decode(coding) + fd.seek(0) + return io.TextIOWrapper(fd, coding).read() except (LookupError, SyntaxError, UnicodeError): return stdin_value.decode("utf-8") diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index c84a03b..4b89484 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -1,6 +1,8 @@ """Tests for flake8's utils module.""" +import io import logging import os +import sys import mock import pytest @@ -304,3 +306,11 @@ def test_matches_filename_for_excluding_dotfiles(): logger = logging.Logger(__name__) assert not utils.matches_filename('.', ('.*',), '', logger) assert not utils.matches_filename('..', ('.*',), '', logger) + + +@pytest.mark.xfail(sys.version_info < (3,), reason='py3+ only behaviour') +def test_stdin_get_value_crlf(): + """Ensure that stdin is normalized from crlf to lf.""" + stdin = io.TextIOWrapper(io.BytesIO(b'1\r\n2\r\n'), 'UTF-8') + with mock.patch.object(sys, 'stdin', stdin): + assert utils.stdin_get_value.__wrapped__() == '1\n2\n'