diff options
author | Daniƫl van Noord <13665637+DanielNoord@users.noreply.github.com> | 2021-10-17 10:04:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-17 10:04:16 +0200 |
commit | abfad38e1a2acba0bcdda217c8fdbe0382c7268f (patch) | |
tree | 0ccaf772e862cfd5ade7fed802380d4bc264ae45 | |
parent | b2f57b7e5e49253c69bd7335999b20fea9e3633a (diff) | |
download | astroid-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>
10 files changed, 20 insertions, 6 deletions
@@ -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() |