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'