summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Sottile <asottile@umich.edu>2020-01-16 14:06:37 -0800
committerAnthony Sottile <asottile@umich.edu>2020-01-16 14:10:33 -0800
commit32c7ebcd7b527a70e96906e3d995ab79a5c39464 (patch)
treed0c64c175a230767361002e651f631da716c2887
parentb56c88fe654af09161a66bf81e00481fa5d2d8c5 (diff)
downloadflake8-32c7ebcd7b527a70e96906e3d995ab79a5c39464.tar.gz
split lines the same when read from stdin
-rw-r--r--src/flake8/processor.py2
-rw-r--r--src/flake8/utils.py34
-rw-r--r--tests/integration/test_main.py23
-rw-r--r--tests/unit/test_file_processor.py17
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'