diff options
-rw-r--r-- | doc/whatsnew/fragments/8453.bugfix | 3 | ||||
-rw-r--r-- | pylint/checkers/imports.py | 10 | ||||
-rw-r--r-- | tests/checkers/unittest_imports.py | 17 |
3 files changed, 29 insertions, 1 deletions
diff --git a/doc/whatsnew/fragments/8453.bugfix b/doc/whatsnew/fragments/8453.bugfix new file mode 100644 index 000000000..6bec2b0b9 --- /dev/null +++ b/doc/whatsnew/fragments/8453.bugfix @@ -0,0 +1,3 @@ +Fix a regression of ``preferred-modules`` where a partial match was used instead of the required full match. + +Closes #8453 diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py index dee12e591..1ed70d958 100644 --- a/pylint/checkers/imports.py +++ b/pylint/checkers/imports.py @@ -922,7 +922,15 @@ class ImportsChecker(DeprecatedMixin, BaseChecker): mod_compare = [f"{node.modname}.{name[0]}" for name in node.names] # find whether there are matches with the import vs preferred_modules keys - matches = [k for k in self.preferred_modules for mod in mod_compare if k in mod] + matches = [ + k + for k in self.preferred_modules + for mod in mod_compare + # exact match + if k == mod + # checks for base module matches + or k in mod.split(".")[0] + ] # if we have matches, add message if matches: diff --git a/tests/checkers/unittest_imports.py b/tests/checkers/unittest_imports.py index 7544e3422..d454c8161 100644 --- a/tests/checkers/unittest_imports.py +++ b/tests/checkers/unittest_imports.py @@ -192,6 +192,23 @@ class TestImportsChecker(CheckerTestCase): # assert there were no errors assert len(errors) == 0 + # Test for challenges with preferred modules indefinite matches + Run( + [ + f"{os.path.join(REGR_DATA, 'preferred_module/unpreferred_submodule.py')}", + "-d all", + "-e preferred-module", + # prefer pathlib instead of random (testing to avoid regression) + # pathlib shouldn't match with path, which is in the test file + "--preferred-modules=random:pathlib", + ], + exit=False, + ) + _, errors = capsys.readouterr() + + # Assert there were no errors + assert len(errors) == 0 + @staticmethod def test_allow_reexport_package(capsys: CaptureFixture[str]) -> None: """Test --allow-reexport-from-package option.""" |