aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2021-10-17 10:04:16 +0200
committerGitHub <noreply@github.com>2021-10-17 10:04:16 +0200
commitabfad38e1a2acba0bcdda217c8fdbe0382c7268f (patch)
tree0ccaf772e862cfd5ade7fed802380d4bc264ae45
parentb2f57b7e5e49253c69bd7335999b20fea9e3633a (diff)
downloadastroid-abfad38e1a2acba0bcdda217c8fdbe0382c7268f.tar.gz
Fix regression with import resolver (#1211)
* Fix regression with import resolver Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
-rw-r--r--ChangeLog4
-rw-r--r--astroid/nodes/scoped_nodes.py13
-rw-r--r--tests/testdata/python3/data/beyond_top_level_three/double_name/__init__.py0
-rw-r--r--tests/testdata/python3/data/beyond_top_level_three/module/__init__.py0
-rw-r--r--tests/testdata/python3/data/beyond_top_level_three/module/double_name/__init__.py0
-rw-r--r--tests/testdata/python3/data/beyond_top_level_three/module/double_name/function.py0
-rw-r--r--tests/testdata/python3/data/beyond_top_level_three/module/sub_module/__init__.py0
-rw-r--r--tests/testdata/python3/data/beyond_top_level_three/module/sub_module/sub_sub_module/__init__.py0
-rw-r--r--tests/testdata/python3/data/beyond_top_level_three/module/sub_module/sub_sub_module/main.py1
-rw-r--r--tests/unittest_inference.py8
10 files changed, 20 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 7217b824..5e03b77f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -19,6 +19,10 @@ Release date: TBA
Closes PyCQA/pylint#2462
Closes #1208
+* Fix regression with the import resolver
+
+ Closes PyCQA/pylint#5131
+
* Fix crash with invalid dataclass field call
Closes PyCQA/pylint#5153
diff --git a/astroid/nodes/scoped_nodes.py b/astroid/nodes/scoped_nodes.py
index 4559fc55..61bb0794 100644
--- a/astroid/nodes/scoped_nodes.py
+++ b/astroid/nodes/scoped_nodes.py
@@ -708,19 +708,16 @@ class Module(LocalsDictNodeNG):
raise
return AstroidManager().ast_from_module_name(modname)
- def relative_to_absolute_name(self, modname, level):
+ def relative_to_absolute_name(self, modname: str, level: int) -> str:
"""Get the absolute module name for a relative import.
The relative import can be implicit or explicit.
:param modname: The module name to convert.
- :type modname: str
:param level: The level of relative import.
- :type level: int
:returns: The absolute module name.
- :rtype: str
:raises TooManyLevelsError: When the relative import refers to a
module too far above this one.
@@ -734,8 +731,12 @@ class Module(LocalsDictNodeNG):
if self.package:
level = level - 1
package_name = self.name.rsplit(".", level)[0]
- elif not os.path.exists("__init__.py") and os.path.exists(
- modname.split(".")[0]
+ elif (
+ self.path
+ and not os.path.exists(os.path.dirname(self.path[0]) + "/__init__.py")
+ and os.path.exists(
+ os.path.dirname(self.path[0]) + "/" + modname.split(".")[0]
+ )
):
level = level - 1
package_name = ""
diff --git a/tests/testdata/python3/data/beyond_top_level_three/double_name/__init__.py b/tests/testdata/python3/data/beyond_top_level_three/double_name/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/python3/data/beyond_top_level_three/double_name/__init__.py
diff --git a/tests/testdata/python3/data/beyond_top_level_three/module/__init__.py b/tests/testdata/python3/data/beyond_top_level_three/module/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/python3/data/beyond_top_level_three/module/__init__.py
diff --git a/tests/testdata/python3/data/beyond_top_level_three/module/double_name/__init__.py b/tests/testdata/python3/data/beyond_top_level_three/module/double_name/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/python3/data/beyond_top_level_three/module/double_name/__init__.py
diff --git a/tests/testdata/python3/data/beyond_top_level_three/module/double_name/function.py b/tests/testdata/python3/data/beyond_top_level_three/module/double_name/function.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/python3/data/beyond_top_level_three/module/double_name/function.py
diff --git a/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/__init__.py b/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/__init__.py
diff --git a/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/sub_sub_module/__init__.py b/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/sub_sub_module/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/sub_sub_module/__init__.py
diff --git a/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/sub_sub_module/main.py b/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/sub_sub_module/main.py
new file mode 100644
index 00000000..b9cd0bbc
--- /dev/null
+++ b/tests/testdata/python3/data/beyond_top_level_three/module/sub_module/sub_sub_module/main.py
@@ -0,0 +1 @@
+from ...double_name import function
diff --git a/tests/unittest_inference.py b/tests/unittest_inference.py
index f89e8c8a..760cd0fe 100644
--- a/tests/unittest_inference.py
+++ b/tests/unittest_inference.py
@@ -6547,5 +6547,13 @@ def test_namespace_package_same_name() -> None:
resources.build_file("data/beyond_top_level_two/a.py")
+def test_relative_imports_init_package() -> None:
+ """check that relative imports within a package that uses __init__.py
+ still works"""
+ resources.build_file(
+ "data/beyond_top_level_three/module/sub_module/sub_sub_module/main.py"
+ )
+
+
if __name__ == "__main__":
unittest.main()