From d476a8bd2557ec1a075e4a8ac630469700ba753a Mon Sep 17 00:00:00 2001 From: Christoph Blessing <33834216+cblessing24@users.noreply.github.com> Date: Sat, 3 Sep 2022 20:44:32 +0200 Subject: [PATCH] Do not lint ignored file on stdin (#7220) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously pylint would lint a file passed on stdin even if the user meant to ignore the file. This commit fixes that issue. Co-authored-by: Daniƫl van Noord <13665637+DanielNoord@users.noreply.github.com> --- doc/whatsnew/fragments/4354.bugfix | 3 +++ pylint/lint/pylinter.py | 17 +++++++++++------ tests/test_self.py | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 doc/whatsnew/fragments/4354.bugfix diff --git a/doc/whatsnew/fragments/4354.bugfix b/doc/whatsnew/fragments/4354.bugfix new file mode 100644 index 0000000000..09caf8d139 --- /dev/null +++ b/doc/whatsnew/fragments/4354.bugfix @@ -0,0 +1,3 @@ +Fix ignored files being linted when passed on stdin. + +Closes #4354 diff --git a/pylint/lint/pylinter.py b/pylint/lint/pylinter.py index 472b3b0302..8fa47ffe83 100644 --- a/pylint/lint/pylinter.py +++ b/pylint/lint/pylinter.py @@ -660,9 +660,7 @@ def check(self, files_or_modules: Sequence[str] | str) -> None: # 3) Get all FileItems with fix_import_path(files_or_modules): if self.config.from_stdin: - fileitems = iter( - (self._get_file_descr_from_stdin(files_or_modules[0]),) - ) + fileitems = self._get_file_descr_from_stdin(files_or_modules[0]) data: str | None = _read_stdin() else: fileitems = self._iterate_file_descrs(files_or_modules) @@ -817,14 +815,21 @@ def _check_file( for msgid, line, args in spurious_messages: self.add_message(msgid, line, None, args) - @staticmethod - def _get_file_descr_from_stdin(filepath: str) -> FileItem: + def _get_file_descr_from_stdin(self, filepath: str) -> Iterator[FileItem]: """Return file description (tuple of module name, file path, base name) from given file path. This method is used for creating suitable file description for _check_files when the source is standard input. """ + if _is_ignored_file( + filepath, + self.config.ignore, + self.config.ignore_patterns, + self.config.ignore_paths, + ): + return + try: # Note that this function does not really perform an # __import__ but may raise an ImportError exception, which @@ -833,7 +838,7 @@ def _get_file_descr_from_stdin(filepath: str) -> FileItem: except ImportError: modname = os.path.splitext(os.path.basename(filepath))[0] - return FileItem(modname, filepath, filepath) + yield FileItem(modname, filepath, filepath) def _iterate_file_descrs( self, files_or_modules: Sequence[str] diff --git a/tests/test_self.py b/tests/test_self.py index 53c9fb11bc..f2587c5c73 100644 --- a/tests/test_self.py +++ b/tests/test_self.py @@ -1128,6 +1128,20 @@ def test_ignore_pattern_recursive(self, ignore_pattern_value: str) -> None: code=0, ) + def test_ignore_pattern_from_stdin(self) -> None: + """Test if linter ignores standard input if the filename matches the ignore pattern.""" + with mock.patch("pylint.lint.pylinter._read_stdin", return_value="import os\n"): + self._runtest( + [ + "--from-stdin", + "mymodule.py", + "--disable=all", + "--enable=unused-import", + "--ignore-patterns=mymodule.py", + ], + code=0, + ) + @pytest.mark.parametrize("ignore_path_value", [".*ignored.*", ".*failing.*"]) def test_ignore_path_recursive(self, ignore_path_value: str) -> None: """Tests recursive run of linter ignoring directory using --ignore-path parameter.