Skip to content

Commit

Permalink
Fix relative-beyond-top-level false positive (pylint-dev#1186)
Browse files Browse the repository at this point in the history
* Fix ``relative-beyond-top-level`` false positive
  • Loading branch information
DanielNoord committed Oct 5, 2021
1 parent 1419ac5 commit 1437e73
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 2 deletions.
4 changes: 4 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ Release date: TBA

* Improve brain for ``typing.Callable`` and ``typing.Type``.

* Fix bug with importing namespace packages with relative imports

Closes PyCQA/pylint#5059


What's New in astroid 2.8.0?
============================
Expand Down
12 changes: 10 additions & 2 deletions astroid/nodes/scoped_nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import builtins
import io
import itertools
import os
import typing
from typing import List, Optional, TypeVar

Expand Down Expand Up @@ -732,10 +733,17 @@ def relative_to_absolute_name(self, modname, level):
if level:
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]
):
level = level - 1
package_name = ""
else:
package_name = self.name.rsplit(".", level)[0]
if level and self.name.count(".") < level:
raise TooManyLevelsError(level=level, name=self.name)

package_name = self.name.rsplit(".", level)[0]
elif self.package:
package_name = self.name
else:
Expand All @@ -744,7 +752,7 @@ def relative_to_absolute_name(self, modname, level):
if package_name:
if not modname:
return package_name
return f"{package_name}.{modname}"
return f"{package_name}.{modname.split('.')[0]}"
return modname

def wildcard_import_names(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from namespace_package import top_level_function

top_level_function.do_something()
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from ..plugin_api import top_message


def plugin_message(msg):
return "plugin_message: %s" % top_message(msg)
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
def top_message(msg):
return "top_message: %s" % msg
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .lower_level.helper_function import plugin_message


def do_something():
return plugin_message("called by do_something")
5 changes: 5 additions & 0 deletions tests/unittest_inference.py
Original file line number Diff line number Diff line change
Expand Up @@ -6535,5 +6535,10 @@ def play():
assert next(node.infer()).pytype() == ".B"


def test_namespace_package() -> None:
"""check that a file using namespace packages and relative imports is parseable"""
resources.build_file("data/beyond_top_level/import_package.py")


if __name__ == "__main__":
unittest.main()

0 comments on commit 1437e73

Please sign in to comment.