summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2019-09-17 10:39:26 +0200
committerClaudiu Popa <pcmanticore@gmail.com>2019-09-17 10:39:26 +0200
commitee3e16cf83180e5c96cf884392925d18dc671a05 (patch)
tree5e5994ddff13733c10c657a7169cef73be5e2ad8
parent1e1c8cfbd2d2420020d5a167b8640169df68fba1 (diff)
downloadpylint-git-ee3e16cf83180e5c96cf884392925d18dc671a05.tar.gz
Handle ImportFrom for non-top level import checks
-rw-r--r--pylint/checkers/imports.py21
1 files changed, 12 insertions, 9 deletions
diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py
index ea0267181..0d33426b4 100644
--- a/pylint/checkers/imports.py
+++ b/pylint/checkers/imports.py
@@ -415,6 +415,7 @@ class ImportsChecker(BaseChecker):
self._imports_stack = []
self._first_non_import_node = None
self._module_pkg = {} # mapping of modules to the pkg they belong in
+ self._import_outside_toplevel = set()
self.reports = (
("RP0401", "External dependencies", self._report_external_dependencies),
("RP0402", "Modules dependencies graph", self._report_dependencies_graph),
@@ -462,6 +463,7 @@ class ImportsChecker(BaseChecker):
for module in self.config.preferred_modules
if ":" in module
)
+ self._import_outside_toplevel = set(self.config.import_outside_toplevel)
def _import_graph_without_ignored_edges(self):
filtered_graph = copy.deepcopy(self.import_graph)
@@ -484,7 +486,6 @@ class ImportsChecker(BaseChecker):
self._check_import_as_rename(node)
self._check_toplevel(node)
- modnode = node.root()
names = [name for name, _ in node.names]
if len(names) >= 2:
self.add_message("multiple-imports", args=", ".join(names), node=node)
@@ -957,17 +958,19 @@ class ImportsChecker(BaseChecker):
if isinstance(node.scope(), astroid.Module):
return
- # Get the full names of all the imports that are not
- # whitelisted.
- not_whitelisted = [
- name[0]
- for name in node.names
- if name[0] not in self.config.import_outside_toplevel
+ if isinstance(node, astroid.ImportFrom):
+ module_names = [node.modname]
+ else:
+ module_names = [name[0] for name in node.names]
+
+ # Get the full names of all the imports that are not whitelisted.
+ scoped_imports = [
+ name for name in module_names if name not in self._import_outside_toplevel
]
- if not_whitelisted:
+ if scoped_imports:
self.add_message(
- "import-outside-toplevel", args=", ".join(not_whitelisted), node=node
+ "import-outside-toplevel", args=", ".join(scoped_imports), node=node
)