summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2021-09-21 15:05:43 +0200
committerPierre Sassoulas <pierre.sassoulas@gmail.com>2021-10-17 10:34:19 +0200
commitc81cc531ae12b5d2e000a5eecdad657d5b8c35ea (patch)
treeeb89034df652c4a47336cf38548af390b64af444
parent89cd646ea8c9cdee041c12fa543ef0cad2128b12 (diff)
downloadpylint-git-c81cc531ae12b5d2e000a5eecdad657d5b8c35ea.tar.gz
Fix ``relative-beyond-top-level`` false positive
-rw-r--r--ChangeLog4
-rw-r--r--tests/checkers/unittest_imports.py33
-rw-r--r--tests/regrtest_data/beyond_top_four/double_name/__init__.py0
-rw-r--r--tests/regrtest_data/beyond_top_four/module/__init__.py0
-rw-r--r--tests/regrtest_data/beyond_top_four/module/double_name/__init__.py0
-rw-r--r--tests/regrtest_data/beyond_top_four/module/double_name/function.py0
-rw-r--r--tests/regrtest_data/beyond_top_four/module/sub_module/__init__.py0
-rw-r--r--tests/regrtest_data/beyond_top_four/module/sub_module/sub_sub_module/__init__.py0
-rw-r--r--tests/regrtest_data/beyond_top_four/module/sub_module/sub_sub_module/main.py1
-rw-r--r--tests/regrtest_data/beyond_top_three/__init__.py0
-rw-r--r--tests/regrtest_data/beyond_top_three/a.py7
-rw-r--r--tests/regrtest_data/beyond_top_three/level1/__init__.py2
-rw-r--r--tests/regrtest_data/beyond_top_three/level1/beyond_top_three.py2
-rw-r--r--tests/regrtest_data/beyond_top_two/import_package.py3
-rw-r--r--tests/regrtest_data/beyond_top_two/namespace_package/lower_level/helper_function.py5
-rw-r--r--tests/regrtest_data/beyond_top_two/namespace_package/plugin_api.py2
-rw-r--r--tests/regrtest_data/beyond_top_two/namespace_package/top_level_function.py5
17 files changed, 64 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 99f40212d..333dd722c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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')