diff options
| author | Anthony Sottile <asottile@umich.edu> | 2020-01-16 14:06:37 -0800 |
|---|---|---|
| committer | Anthony Sottile <asottile@umich.edu> | 2020-01-16 14:10:33 -0800 |
| commit | 32c7ebcd7b527a70e96906e3d995ab79a5c39464 (patch) | |
| tree | d0c64c175a230767361002e651f631da716c2887 | |
| parent | b56c88fe654af09161a66bf81e00481fa5d2d8c5 (diff) | |
| download | flake8-32c7ebcd7b527a70e96906e3d995ab79a5c39464.tar.gz | |
split lines the same when read from stdin
| -rw-r--r-- | src/flake8/processor.py | 2 | ||||
| -rw-r--r-- | src/flake8/utils.py | 34 | ||||
| -rw-r--r-- | tests/integration/test_main.py | 23 | ||||
| -rw-r--r-- | tests/unit/test_file_processor.py | 17 |
4 files changed, 47 insertions, 29 deletions
diff --git a/src/flake8/processor.py b/src/flake8/processor.py index 498b9c7..aa7f1d8 100644 --- a/src/flake8/processor.py +++ b/src/flake8/processor.py @@ -334,7 +334,7 @@ class FileProcessor(object): def read_lines_from_stdin(self): # type: () -> List[str] """Read the lines from standard in.""" - return utils.stdin_get_value().splitlines(True) + return utils.stdin_get_lines() def should_ignore_file(self): # type: () -> bool diff --git a/src/flake8/utils.py b/src/flake8/utils.py index 5c7232c..29df9bc 100644 --- a/src/flake8/utils.py +++ b/src/flake8/utils.py @@ -13,6 +13,7 @@ from typing import Callable, Dict, Generator, List, Optional, Pattern from typing import Sequence, Set, Tuple, Union from flake8 import exceptions +from flake8._compat import lru_cache if False: # `typing.TYPE_CHECKING` was introduced in 3.5.2 from flake8.plugins.manager import Plugin @@ -189,28 +190,31 @@ def normalize_path(path, parent=os.curdir): return path.rstrip(separator + alternate_separator) -def _stdin_get_value_py3(): # type: () -> io.StringIO +def _stdin_get_value_py3(): # type: () -> str stdin_value = sys.stdin.buffer.read() fd = io.BytesIO(stdin_value) try: - (coding, lines) = tokenize.detect_encoding(fd.readline) - return io.StringIO(stdin_value.decode(coding)) + coding, _ = tokenize.detect_encoding(fd.readline) + return stdin_value.decode(coding) except (LookupError, SyntaxError, UnicodeError): - return io.StringIO(stdin_value.decode("utf-8")) + return stdin_value.decode("utf-8") -def stdin_get_value(): - # type: () -> str +@lru_cache(maxsize=1) +def stdin_get_value(): # type: () -> str """Get and cache it so plugins can use it.""" - cached_value = getattr(stdin_get_value, "cached_stdin", None) - if cached_value is None: - if sys.version_info < (3, 0): - stdin_value = io.BytesIO(sys.stdin.read()) - else: - stdin_value = _stdin_get_value_py3() - stdin_get_value.cached_stdin = stdin_value # type: ignore - cached_value = stdin_get_value.cached_stdin # type: ignore - return cached_value.getvalue() + if sys.version_info < (3,): + return sys.stdin.read() + else: + return _stdin_get_value_py3() + + +def stdin_get_lines(): # type: () -> List[str] + """Return lines of stdin split according to file splitting.""" + if sys.version_info < (3,): + return list(io.BytesIO(stdin_get_value())) + else: + return list(io.StringIO(stdin_get_value())) def parse_unified_diff(diff=None): diff --git a/tests/integration/test_main.py b/tests/integration/test_main.py index 42ad76c..9193071 100644 --- a/tests/integration/test_main.py +++ b/tests/integration/test_main.py @@ -51,6 +51,29 @@ index d64ac39..7d943de 100644 assert err == '' +def test_form_feed_line_split(tmpdir, capsys): + """Test that form feed is treated the same for stdin.""" + src = 'x=1\n\f\ny=1\n' + expected_out = '''\ +t.py:1:2: E225 missing whitespace around operator +t.py:3:2: E225 missing whitespace around operator +''' + + with tmpdir.as_cwd(): + tmpdir.join('t.py').write(src) + + with mock.patch.object(utils, 'stdin_get_value', return_value=src): + _call_main(['-', '--stdin-display-name=t.py'], retv=1) + out, err = capsys.readouterr() + assert out == expected_out + assert err == '' + + _call_main(['t.py'], retv=1) + out, err = capsys.readouterr() + assert out == expected_out + assert err == '' + + def test_e101_indent_char_does_not_reset(tmpdir, capsys): """Ensure that E101 with an existing indent_char does not reset it.""" t_py_contents = """\ diff --git a/tests/unit/test_file_processor.py b/tests/unit/test_file_processor.py index f38568c..e5367a8 100644 --- a/tests/unit/test_file_processor.py +++ b/tests/unit/test_file_processor.py @@ -89,20 +89,15 @@ def test_should_ignore_file_to_handle_disable_noqa(default_options): @mock.patch('flake8.utils.stdin_get_value') def test_read_lines_from_stdin(stdin_get_value, default_options): """Verify that we use our own utility function to retrieve stdin.""" - stdin_value = mock.Mock() - stdin_value.splitlines.return_value = [] - stdin_get_value.return_value = stdin_value + stdin_get_value.return_value = '' processor.FileProcessor('-', default_options) stdin_get_value.assert_called_once_with() - stdin_value.splitlines.assert_called_once_with(True) @mock.patch('flake8.utils.stdin_get_value') def test_stdin_filename_attribute(stdin_get_value, default_options): """Verify that we update the filename attribute.""" - stdin_value = mock.Mock() - stdin_value.splitlines.return_value = [] - stdin_get_value.return_value = stdin_value + stdin_get_value.return_value = '' file_processor = processor.FileProcessor('-', default_options) assert file_processor.filename == 'stdin' @@ -111,9 +106,7 @@ def test_stdin_filename_attribute(stdin_get_value, default_options): def test_read_lines_uses_display_name(stdin_get_value, default_options): """Verify that when processing stdin we use a display name if present.""" default_options.stdin_display_name = 'display_name.py' - stdin_value = mock.Mock() - stdin_value.splitlines.return_value = [] - stdin_get_value.return_value = stdin_value + stdin_get_value.return_value = '' file_processor = processor.FileProcessor('-', default_options) assert file_processor.filename == 'display_name.py' @@ -123,9 +116,7 @@ def test_read_lines_ignores_empty_display_name( stdin_get_value, default_options, ): """Verify that when processing stdin we use a display name if present.""" - stdin_value = mock.Mock() - stdin_value.splitlines.return_value = [] - stdin_get_value.return_value = stdin_value + stdin_get_value.return_value = '' default_options.stdin_display_name = '' file_processor = processor.FileProcessor('-', default_options) assert file_processor.filename == 'stdin' |
