diff options
author | Daniƫl van Noord <13665637+DanielNoord@users.noreply.github.com> | 2021-09-21 15:05:43 +0200 |
---|---|---|
committer | Pierre Sassoulas <pierre.sassoulas@gmail.com> | 2021-10-17 10:34:19 +0200 |
commit | c81cc531ae12b5d2e000a5eecdad657d5b8c35ea (patch) | |
tree | eb89034df652c4a47336cf38548af390b64af444 | |
parent | 89cd646ea8c9cdee041c12fa543ef0cad2128b12 (diff) | |
download | pylint-git-c81cc531ae12b5d2e000a5eecdad657d5b8c35ea.tar.gz |
Fix ``relative-beyond-top-level`` false positive
17 files changed, 64 insertions, 0 deletions
@@ -26,6 +26,10 @@ Release date: TBA Closes #5140 +* Fix bug with importing namespace packages with relative imports + + Closes #2967 and #5131 + * Improve and flatten ``unused-wildcard-import`` message Closes #3859 diff --git a/tests/checkers/unittest_imports.py b/tests/checkers/unittest_imports.py index 8d5af7d3f..8f03e5f49 100644 --- a/tests/checkers/unittest_imports.py +++ b/tests/checkers/unittest_imports.py @@ -23,6 +23,7 @@ import os import astroid +from pylint import epylint as lint from pylint.checkers import imports from pylint.interfaces import UNDEFINED from pylint.testutils import CheckerTestCase, MessageTest, set_config @@ -144,6 +145,38 @@ class TestImportsChecker(CheckerTestCase): with self.assertNoMessages(): self.checker.visit_importfrom(module.body[2].body[0]) + @staticmethod + def test_relative_beyond_top_level_two() -> None: + output, errors = lint.py_run( + f"{os.path.join(REGR_DATA, 'beyond_top_two')} -d all -e relative-beyond-top-level", + return_std=True, + ) + output2, errors2 = lint.py_run( + f"{os.path.join(REGR_DATA, 'beyond_top_two/namespace_package/top_level_function.py')} -d all -e relative-beyond-top-level", + return_std=True, + ) + + assert len(output.readlines()) == len(output2.readlines()) + assert errors.readlines() == errors2.readlines() + + @staticmethod + def test_relative_beyond_top_level_three() -> None: + output, errors = lint.py_run( + f"{os.path.join(REGR_DATA, 'beyond_top_three/a.py')} -d all -e relative-beyond-top-level", + return_std=True, + ) + assert len(output.readlines()) == 5 + assert errors.readlines() == [] + + @staticmethod + def test_relative_beyond_top_level_four() -> None: + output, errors = lint.py_run( + f"{os.path.join(REGR_DATA, 'beyond_top_four/module')} -d missing-docstring,unused-import", + return_std=True, + ) + assert len(output.readlines()) == 5 + assert errors.readlines() == [] + def test_wildcard_import_init(self) -> None: module = astroid.MANAGER.ast_from_module_name("init_wildcard", REGR_DATA) import_from = module.body[0] diff --git a/tests/regrtest_data/beyond_top_four/double_name/__init__.py b/tests/regrtest_data/beyond_top_four/double_name/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/regrtest_data/beyond_top_four/double_name/__init__.py diff --git a/tests/regrtest_data/beyond_top_four/module/__init__.py b/tests/regrtest_data/beyond_top_four/module/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/regrtest_data/beyond_top_four/module/__init__.py diff --git a/tests/regrtest_data/beyond_top_four/module/double_name/__init__.py b/tests/regrtest_data/beyond_top_four/module/double_name/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/regrtest_data/beyond_top_four/module/double_name/__init__.py diff --git a/tests/regrtest_data/beyond_top_four/module/double_name/function.py b/tests/regrtest_data/beyond_top_four/module/double_name/function.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/regrtest_data/beyond_top_four/module/double_name/function.py diff --git a/tests/regrtest_data/beyond_top_four/module/sub_module/__init__.py b/tests/regrtest_data/beyond_top_four/module/sub_module/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/regrtest_data/beyond_top_four/module/sub_module/__init__.py diff --git a/tests/regrtest_data/beyond_top_four/module/sub_module/sub_sub_module/__init__.py b/tests/regrtest_data/beyond_top_four/module/sub_module/sub_sub_module/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/regrtest_data/beyond_top_four/module/sub_module/sub_sub_module/__init__.py diff --git a/tests/regrtest_data/beyond_top_four/module/sub_module/sub_sub_module/main.py b/tests/regrtest_data/beyond_top_four/module/sub_module/sub_sub_module/main.py new file mode 100644 index 000000000..b9cd0bbc4 --- /dev/null +++ b/tests/regrtest_data/beyond_top_four/module/sub_module/sub_sub_module/main.py @@ -0,0 +1 @@ +from ...double_name import function diff --git a/tests/regrtest_data/beyond_top_three/__init__.py b/tests/regrtest_data/beyond_top_three/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/regrtest_data/beyond_top_three/__init__.py diff --git a/tests/regrtest_data/beyond_top_three/a.py b/tests/regrtest_data/beyond_top_three/a.py new file mode 100644 index 000000000..f8fec95e0 --- /dev/null +++ b/tests/regrtest_data/beyond_top_three/a.py @@ -0,0 +1,7 @@ +# pylint: disable=missing-docstring + +from .level1.beyond_top_three import func + + +def do_something(var, some_other_var): # error + func(var, some_other_var) diff --git a/tests/regrtest_data/beyond_top_three/level1/__init__.py b/tests/regrtest_data/beyond_top_three/level1/__init__.py new file mode 100644 index 000000000..1a886aa4f --- /dev/null +++ b/tests/regrtest_data/beyond_top_three/level1/__init__.py @@ -0,0 +1,2 @@ +def func(var): + pass diff --git a/tests/regrtest_data/beyond_top_three/level1/beyond_top_three.py b/tests/regrtest_data/beyond_top_three/level1/beyond_top_three.py new file mode 100644 index 000000000..cc28914eb --- /dev/null +++ b/tests/regrtest_data/beyond_top_three/level1/beyond_top_three.py @@ -0,0 +1,2 @@ +def func(var, some_other_var): + pass diff --git a/tests/regrtest_data/beyond_top_two/import_package.py b/tests/regrtest_data/beyond_top_two/import_package.py new file mode 100644 index 000000000..885d4c541 --- /dev/null +++ b/tests/regrtest_data/beyond_top_two/import_package.py @@ -0,0 +1,3 @@ +from namespace_package import top_level_function + +top_level_function.do_something() diff --git a/tests/regrtest_data/beyond_top_two/namespace_package/lower_level/helper_function.py b/tests/regrtest_data/beyond_top_two/namespace_package/lower_level/helper_function.py new file mode 100644 index 000000000..ebec0f6b9 --- /dev/null +++ b/tests/regrtest_data/beyond_top_two/namespace_package/lower_level/helper_function.py @@ -0,0 +1,5 @@ +from ..plugin_api import top_message + + +def plugin_message(msg): + return "plugin_message: %s" % top_message(msg) diff --git a/tests/regrtest_data/beyond_top_two/namespace_package/plugin_api.py b/tests/regrtest_data/beyond_top_two/namespace_package/plugin_api.py new file mode 100644 index 000000000..06bfbe853 --- /dev/null +++ b/tests/regrtest_data/beyond_top_two/namespace_package/plugin_api.py @@ -0,0 +1,2 @@ +def top_message(msg): + return 'top_message: %s' % msg diff --git a/tests/regrtest_data/beyond_top_two/namespace_package/top_level_function.py b/tests/regrtest_data/beyond_top_two/namespace_package/top_level_function.py new file mode 100644 index 000000000..e90fdafa6 --- /dev/null +++ b/tests/regrtest_data/beyond_top_two/namespace_package/top_level_function.py @@ -0,0 +1,5 @@ +from .lower_level.helper_function import plugin_message + + +def do_something(): + return plugin_message('called by do_something') |