Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes duplicate-code check with ignore-imports #9147

Merged
Next Next commit
Fix ignoring conditional imports with ignore-imports=y
  • Loading branch information
theirix committed Oct 13, 2023
commit 11a32097f1278f6b5edef72f1de596c90d1db536
17 changes: 13 additions & 4 deletions pylint/checkers/similar.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
from astroid import nodes

from pylint.checkers import BaseChecker, BaseRawFileChecker, table_lines_from_stats
from pylint.checkers.utils import safe_infer
from pylint.reporters.ureports.nodes import Section, Table
from pylint.typing import MessageDefinitionTuple, Options
from pylint.utils import LinterStats, decoding_stream
Expand Down Expand Up @@ -598,10 +599,18 @@ def stripped_lines(
if ignore_imports or ignore_signatures:
tree = astroid.parse("".join(lines))
if ignore_imports:
node_is_import_by_lineno = (
(node.lineno, isinstance(node, (nodes.Import, nodes.ImportFrom)))
for node in tree.body
)

def _get_imports(root: list[nodes.NodeNG]) -> Iterable[tuple[int, bool]]:
"""Find import nodes under given node."""
for node in root:
if isinstance(node, astroid.If) and isinstance(
safe_infer(node.test), nodes.Const
):
# Check for imports in a body of a constant condition
yield from _get_imports(node.body)
yield node.lineno, isinstance(node, (nodes.Import, nodes.ImportFrom))

node_is_import_by_lineno = _get_imports(tree.body)
line_begins_import = {
lineno: all(is_import for _, is_import in node_is_import_group)
for lineno, node_is_import_group in groupby(
jacobtylerwalls marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import typing

if typing.TYPE_CHECKING:
import os
import sys
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import typing

if typing.TYPE_CHECKING:
import os
import sys
8 changes: 8 additions & 0 deletions tests/test_similar.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,3 +264,11 @@ def test_useless_suppression() -> None:
exit=False,
)
assert not runner.linter.stats.by_msg

def test_conditional_imports(self) -> None:
"""Tests enabling ignore-imports with conditional imports works correctly."""
path = join(DATA, "ignore_conditional_imports")
self._runtest(
[path, "-e=duplicate-code", "-d=unused-import,C", "--ignore-imports=y"],
code=0,
)