From 7934f8dce2fc1c5d8da374a3c7435d36f9526b0b Mon Sep 17 00:00:00 2001 From: Leonardo Rochael Almeida Date: Wed, 20 Jul 2016 17:22:49 -0300 Subject: [PATCH] Propagate the stdin_display_name to checker and processor This way plugins like flake8-putty can have access to the correct filename. --- src/flake8/checker.py | 8 ++++---- src/flake8/main/options.py | 2 +- src/flake8/processor.py | 17 ++++++++++------- src/flake8/style_guide.py | 2 -- tests/unit/test_file_processor.py | 7 ++++++- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/flake8/checker.py b/src/flake8/checker.py index d5132ff..7c70ace 100644 --- a/src/flake8/checker.py +++ b/src/flake8/checker.py @@ -398,20 +398,20 @@ class FileChecker(object): :type style_guide: flake8.style_guide.StyleGuide """ - self.filename = filename self.checks = checks self.style_guide = style_guide self.results = [] - self.processor = self._make_processor() + self.processor = self._make_processor(filename) + self.filename = self.processor.filename self.statistics = { 'tokens': 0, 'logical lines': 0, 'physical lines': len(self.processor.lines), } - def _make_processor(self): + def _make_processor(self, filename): try: - return processor.FileProcessor(self.filename, + return processor.FileProcessor(filename, self.style_guide.options) except IOError: # If we can not read the file due to an IOError (e.g., the file diff --git a/src/flake8/main/options.py b/src/flake8/main/options.py index c725c38..dbfdf9b 100644 --- a/src/flake8/main/options.py +++ b/src/flake8/main/options.py @@ -74,7 +74,7 @@ def register_default_options(option_manager): ) add_option( - '--stdin-display-name', default='stdin', + '--stdin-display-name', help='The name used when reporting errors from code passed via stdin.' ' This is useful for editors piping the file contents to flake8.' ' (Default: %default)', diff --git a/src/flake8/processor.py b/src/flake8/processor.py index 76c5512..ae82b50 100644 --- a/src/flake8/processor.py +++ b/src/flake8/processor.py @@ -55,12 +55,13 @@ class FileProcessor(object): :param str filename: Name of the file to process """ + self.options = options self.filename = filename self.lines = lines if lines is None: - self.lines = self.read_lines() + # allow for stdin filename substitution + self.filename, self.lines = self.read_lines(filename) self.strip_utf_bom() - self.options = options # Defaults for public attributes #: Number of preceding blank lines @@ -268,13 +269,15 @@ class FileProcessor(object): self.indent_char = line[0] return line - def read_lines(self): + def read_lines(self, filename): # type: () -> List[str] """Read the lines for this file checker.""" - if self.filename is None or self.filename == '-': - self.filename = 'stdin' - return self.read_lines_from_stdin() - return self.read_lines_from_filename() + if filename is None or filename == '-': + filename = self.options.stdin_display_name or 'stdin' + lines = self.read_lines_from_stdin() + else: + lines = self.read_lines_from_filename() + return (filename, lines) def _readlines_py2(self): # type: () -> List[str] diff --git a/src/flake8/style_guide.py b/src/flake8/style_guide.py index ed1b844..284444d 100644 --- a/src/flake8/style_guide.py +++ b/src/flake8/style_guide.py @@ -260,8 +260,6 @@ class StyleGuide(object): """ error = Error(code, filename, line_number, column_number, text, physical_line) - if error.filename is None or error.filename == '-': - error = error._replace(filename=self.options.stdin_display_name) error_is_selected = (self.should_report_error(error.code) is Decision.Selected) is_not_inline_ignored = self.is_inline_ignored(error) is False diff --git a/tests/unit/test_file_processor.py b/tests/unit/test_file_processor.py index dec1667..8bc0e2d 100644 --- a/tests/unit/test_file_processor.py +++ b/tests/unit/test_file_processor.py @@ -14,6 +14,7 @@ def options_from(**kwargs): kwargs.setdefault('hang_closing', True) kwargs.setdefault('max_line_length', 79) kwargs.setdefault('verbose', False) + kwargs.setdefault('stdin_display_name', None) return optparse.Values(kwargs) @@ -63,13 +64,17 @@ def test_read_lines_from_stdin(stdin_get_value): @mock.patch('flake8.utils.stdin_get_value') -def test_read_lines_sets_filename_attribute(stdin_get_value): +def test_stdin_filename_attribute(stdin_get_value): """Verify that we update the filename attribute.""" stdin_value = mock.Mock() stdin_value.splitlines.return_value = [] stdin_get_value.return_value = stdin_value file_processor = processor.FileProcessor('-', options_from()) assert file_processor.filename == 'stdin' + file_processor = processor.FileProcessor('-', options_from( + stdin_display_name="foo.py" + )) + assert file_processor.filename == 'foo.py' def test_line_for():