summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/how_tos/transform_plugins.rst3
-rw-r--r--pylint/checkers/async.py5
-rw-r--r--pylint/checkers/base.py5
-rw-r--r--pylint/checkers/classes.py30
-rw-r--r--pylint/checkers/design_analysis.py11
-rw-r--r--pylint/checkers/exceptions.py5
-rw-r--r--pylint/checkers/imports.py12
-rw-r--r--pylint/checkers/python3.py9
-rw-r--r--pylint/checkers/refactoring/len_checker.py8
-rw-r--r--pylint/checkers/refactoring/refactoring_checker.py3
-rw-r--r--pylint/checkers/stdlib.py9
-rw-r--r--pylint/checkers/strings.py8
-rw-r--r--pylint/checkers/typecheck.py46
-rw-r--r--pylint/checkers/utils.py15
-rw-r--r--pylint/checkers/variables.py14
-rw-r--r--pylint/constants.py6
-rw-r--r--pylint/lint/pylinter.py15
-rw-r--r--pylint/utils/utils.py1
-rw-r--r--tests/unittest_pyreverse_inspector.py7
19 files changed, 102 insertions, 110 deletions
diff --git a/doc/how_tos/transform_plugins.rst b/doc/how_tos/transform_plugins.rst
index e376e5345..d62f6e70a 100644
--- a/doc/how_tos/transform_plugins.rst
+++ b/doc/how_tos/transform_plugins.rst
@@ -67,7 +67,6 @@ Module, Class, Function etc. In our case we need to transform a class. It can be
.. sourcecode:: python
import astroid
- from astroid import MANAGER
def register(linter):
# Needed for registering the plugin.
@@ -79,7 +78,7 @@ Module, Class, Function etc. In our case we need to transform a class. It can be
for f in warnings.WarningMessage._WARNING_DETAILS:
cls.locals[f] = [astroid.ClassDef(f, None)]
- MANAGER.register_transform(astroid.ClassDef, transform)
+ astroid.MANAGER.register_transform(astroid.ClassDef, transform)
Let's go through the plugin. First, we need to register a class transform, which
is done via the ``register_transform`` function in ``MANAGER``. It takes the node
diff --git a/pylint/checkers/async.py b/pylint/checkers/async.py
index 089c8f5b2..9fde4f551 100644
--- a/pylint/checkers/async.py
+++ b/pylint/checkers/async.py
@@ -11,7 +11,6 @@
import sys
import astroid
-from astroid import bases, exceptions
from pylint import checkers, interfaces, utils
from pylint.checkers import utils as checker_utils
@@ -64,7 +63,7 @@ class AsyncChecker(checkers.BaseChecker):
# with contextlib.asynccontextmanager.
if decorated_with(inferred, self._async_generators):
continue
- elif isinstance(inferred, bases.AsyncGenerator):
+ elif isinstance(inferred, astroid.bases.AsyncGenerator):
# Check if we are dealing with a function decorated
# with contextlib.asynccontextmanager.
if decorated_with(inferred.parent, self._async_generators):
@@ -73,7 +72,7 @@ class AsyncChecker(checkers.BaseChecker):
try:
inferred.getattr("__aenter__")
inferred.getattr("__aexit__")
- except exceptions.NotFoundError:
+ except astroid.exceptions.NotFoundError:
if isinstance(inferred, astroid.Instance):
# If we do not know the bases of this class,
# just skip it.
diff --git a/pylint/checkers/base.py b/pylint/checkers/base.py
index b9dde439b..18dca945e 100644
--- a/pylint/checkers/base.py
+++ b/pylint/checkers/base.py
@@ -65,9 +65,6 @@ import sys
from typing import Pattern
import astroid
-import astroid.bases
-import astroid.scoped_nodes
-from astroid.arguments import CallSite
from pylint import checkers, exceptions, interfaces
from pylint import utils as lint_utils
@@ -1269,7 +1266,7 @@ class BasicChecker(_BasicChecker):
# return something else (but we don't check that, yet).
return
- call_site = CallSite.from_call(call)
+ call_site = astroid.arguments.CallSite.from_call(call)
ordinary_args = list(node.args.args)
new_call_args = list(self._filter_vararg(node, call.args))
if node.args.kwarg:
diff --git a/pylint/checkers/classes.py b/pylint/checkers/classes.py
index c96cce007..0ba382feb 100644
--- a/pylint/checkers/classes.py
+++ b/pylint/checkers/classes.py
@@ -44,10 +44,6 @@ import collections
from itertools import chain, zip_longest
import astroid
-from astroid import decorators, objects
-from astroid.bases import BUILTINS, Generator
-from astroid.exceptions import DuplicateBasesError, InconsistentMroError
-from astroid.scoped_nodes import function_to_method
from pylint.checkers import BaseChecker
from pylint.checkers.utils import (
@@ -403,7 +399,7 @@ def _is_attribute_property(name, klass):
attributes = klass.getattr(name)
except astroid.NotFoundError:
return False
- property_name = f"{BUILTINS}.property"
+ property_name = f"{astroid.bases.BUILTINS}.property"
for attr in attributes:
if attr is astroid.Uninferable:
continue
@@ -774,11 +770,11 @@ a metaclass class method.",
self._first_attrs = []
self._meth_could_be_func = None
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _dummy_rgx(self):
return get_global_option(self, "dummy-variables-rgx", default=None)
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _ignore_mixin(self):
return get_global_option(self, "ignore-mixin-members", default=True)
@@ -811,9 +807,9 @@ a metaclass class method.",
"""Detect that a class has a consistent mro or duplicate bases."""
try:
node.mro()
- except InconsistentMroError:
+ except astroid.InconsistentMroError:
self.add_message("inconsistent-mro", args=node.name, node=node)
- except DuplicateBasesError:
+ except astroid.DuplicateBasesError:
self.add_message("duplicate-bases", args=node.name, node=node)
except NotImplementedError:
# Old style class, there's no mro so don't do anything.
@@ -829,7 +825,7 @@ a metaclass class method.",
if not ancestor:
continue
if isinstance(ancestor, astroid.Instance) and ancestor.is_subtype_of(
- f"{BUILTINS}.type"
+ f"{astroid.bases.BUILTINS}.type"
):
continue
@@ -1056,7 +1052,7 @@ a metaclass class method.",
except astroid.InferenceError:
return
else:
- if not isinstance(super_call, objects.Super):
+ if not isinstance(super_call, astroid.objects.Super):
return
# The name should be the same.
@@ -1673,7 +1669,7 @@ a metaclass class method.",
and klass._proxied.name == "super"
):
return
- if isinstance(klass, objects.Super):
+ if isinstance(klass, astroid.objects.Super):
return
try:
del not_called_yet[klass]
@@ -1704,8 +1700,8 @@ a metaclass class method.",
return
instance = cls.instantiate_class()
- method1 = function_to_method(method1, instance)
- refmethod = function_to_method(refmethod, instance)
+ method1 = astroid.scoped_nodes.function_to_method(method1, instance)
+ refmethod = astroid.scoped_nodes.function_to_method(refmethod, instance)
# Don't care about functions with unknown argument (builtins).
if method1.args.args is None or refmethod.args.args is None:
@@ -1900,7 +1896,7 @@ class SpecialMethodsChecker(BaseChecker):
# by no-method-argument.
return
- if decorated_with(node, [BUILTINS + ".staticmethod"]):
+ if decorated_with(node, [astroid.bases.BUILTINS + ".staticmethod"]):
# We expect to not take in consideration self.
all_args = node.args.args
else:
@@ -1991,8 +1987,8 @@ class SpecialMethodsChecker(BaseChecker):
if node is astroid.Uninferable:
# Just ignore Uninferable objects.
return True
- if isinstance(node, Generator):
- # Generators can be itered.
+ if isinstance(node, astroid.bases.Generator):
+ # Generators can be iterated.
return True
if isinstance(node, astroid.Instance):
diff --git a/pylint/checkers/design_analysis.py b/pylint/checkers/design_analysis.py
index 9fc864aca..cf1edca3e 100644
--- a/pylint/checkers/design_analysis.py
+++ b/pylint/checkers/design_analysis.py
@@ -25,7 +25,6 @@ import re
from collections import defaultdict
import astroid
-from astroid import BoolOp, If, decorators
from pylint import utils
from pylint.checkers import BaseChecker
@@ -137,7 +136,7 @@ def _count_boolean_expressions(bool_op):
"""
nb_bool_expr = 0
for bool_expr in bool_op.get_children():
- if isinstance(bool_expr, BoolOp):
+ if isinstance(bool_expr, astroid.BoolOp):
nb_bool_expr += _count_boolean_expressions(bool_expr)
else:
nb_bool_expr += 1
@@ -284,7 +283,7 @@ class MisdesignChecker(BaseChecker):
for i in range(len(self._stmts)):
self._stmts[i] += amount
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _ignored_argument_names(self):
return utils.get_global_option(self, "ignored-argument-names", default=None)
@@ -460,7 +459,9 @@ class MisdesignChecker(BaseChecker):
self._check_boolean_expressions(node)
branches = 1
# don't double count If nodes coming from some 'elif'
- if node.orelse and (len(node.orelse) > 1 or not isinstance(node.orelse[0], If)):
+ if node.orelse and (
+ len(node.orelse) > 1 or not isinstance(node.orelse[0], astroid.If)
+ ):
branches += 1
self._inc_branch(node, branches)
self._inc_all_stmts(branches)
@@ -471,7 +472,7 @@ class MisdesignChecker(BaseChecker):
if the "if" node test is a BoolOp node
"""
condition = node.test
- if not isinstance(condition, BoolOp):
+ if not isinstance(condition, astroid.BoolOp):
return
nb_bool_expr = _count_boolean_expressions(condition)
if nb_bool_expr > self.config.max_bool_expr:
diff --git a/pylint/checkers/exceptions.py b/pylint/checkers/exceptions.py
index 980dab318..2a59c9511 100644
--- a/pylint/checkers/exceptions.py
+++ b/pylint/checkers/exceptions.py
@@ -36,7 +36,6 @@ import inspect
import typing
import astroid
-from astroid.node_classes import NodeNG
from pylint import checkers, interfaces
from pylint.checkers import utils
@@ -433,8 +432,8 @@ class ExceptionsChecker(checkers.BaseChecker):
def _check_try_except_raise(self, node):
def gather_exceptions_from_handler(
handler,
- ) -> typing.Optional[typing.List[NodeNG]]:
- exceptions = [] # type: typing.List[NodeNG]
+ ) -> typing.Optional[typing.List[astroid.node_classes.NodeNG]]:
+ exceptions = [] # type: typing.List[astroid.node_classes.NodeNG]
if handler.type:
exceptions_in_handler = utils.safe_infer(handler.type)
if isinstance(exceptions_in_handler, astroid.Tuple):
diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py
index ba14108c4..9d4e60e6f 100644
--- a/pylint/checkers/imports.py
+++ b/pylint/checkers/imports.py
@@ -46,8 +46,6 @@ import sys
from distutils import sysconfig
import astroid
-from astroid import modutils
-from astroid.decorators import cached
from pylint.checkers import BaseChecker, DeprecatedMixin
from pylint.checkers.utils import (
@@ -810,14 +808,16 @@ class ImportsChecker(DeprecatedMixin, BaseChecker):
base = os.path.splitext(os.path.basename(module_file))[0]
try:
- importedmodname = modutils.get_module_part(importedmodname, module_file)
+ importedmodname = astroid.modutils.get_module_part(
+ importedmodname, module_file
+ )
except ImportError:
pass
if context_name == importedmodname:
self.add_message("import-self", node=node)
- elif not modutils.is_standard_module(importedmodname):
+ elif not astroid.modutils.is_standard_module(importedmodname):
# if this is not a package __init__ module
if base != "__init__" and context_name not in self._module_pkg:
# record the module's parent, or the module itself if this is
@@ -921,14 +921,14 @@ class ImportsChecker(DeprecatedMixin, BaseChecker):
graph[importee].add(importer)
return graph
- @cached
+ @astroid.decorators.cached
def _external_dependencies_info(self):
"""return cached external dependencies information or build and
cache them
"""
return self._filter_dependencies_graph(internal=False)
- @cached
+ @astroid.decorators.cached
def _internal_dependencies_info(self):
"""return cached internal dependencies information or build and
cache them
diff --git a/pylint/checkers/python3.py b/pylint/checkers/python3.py
index d3943ad37..fdc6590b0 100644
--- a/pylint/checkers/python3.py
+++ b/pylint/checkers/python3.py
@@ -43,7 +43,6 @@ import tokenize
from collections import namedtuple
import astroid
-from astroid import bases
from pylint import checkers, interfaces
from pylint.checkers import utils
@@ -978,7 +977,9 @@ class Python3Checker(checkers.BaseChecker):
# classmethod 1 argument should cause a failure, if it is a
# staticmethod 0 arguments should cause a failure.
failing_arg_count = 1
- if utils.decorated_with(node, [bases.BUILTINS + ".staticmethod"]):
+ if utils.decorated_with(
+ node, [astroid.bases.BUILTINS + ".staticmethod"]
+ ):
failing_arg_count = 0
if len(node.args.args) == failing_arg_count:
self.add_message("next-method-defined", node=node)
@@ -1116,7 +1117,7 @@ class Python3Checker(checkers.BaseChecker):
if not inferred:
return
- builtins_list = f"{bases.BUILTINS}.list"
+ builtins_list = f"{astroid.bases.BUILTINS}.list"
if isinstance(inferred, astroid.List) or inferred.qname() == builtins_list:
kwargs = node.keywords
@@ -1125,7 +1126,7 @@ class Python3Checker(checkers.BaseChecker):
if not inferred:
return
- builtins_sorted = f"{bases.BUILTINS}.sorted"
+ builtins_sorted = f"{astroid.bases.BUILTINS}.sorted"
if inferred.qname() == builtins_sorted:
kwargs = node.keywords
diff --git a/pylint/checkers/refactoring/len_checker.py b/pylint/checkers/refactoring/len_checker.py
index c11d74b30..a5897915c 100644
--- a/pylint/checkers/refactoring/len_checker.py
+++ b/pylint/checkers/refactoring/len_checker.py
@@ -3,7 +3,6 @@
from typing import List
import astroid
-from astroid import DictComp, GeneratorExp, ListComp, SetComp
from pylint import checkers, interfaces
from pylint.checkers import utils
@@ -68,7 +67,12 @@ class LenChecker(checkers.BaseChecker):
if not utils.is_test_condition(node, parent):
return
len_arg = node.args[0]
- generator_or_comprehension = (ListComp, SetComp, DictComp, GeneratorExp)
+ generator_or_comprehension = (
+ astroid.ListComp,
+ astroid.SetComp,
+ astroid.DictComp,
+ astroid.GeneratorExp,
+ )
if isinstance(len_arg, generator_or_comprehension):
# The node is a generator or comprehension as in len([x for x in ...])
self.add_message("len-as-condition", node=node)
diff --git a/pylint/checkers/refactoring/refactoring_checker.py b/pylint/checkers/refactoring/refactoring_checker.py
index c22e26163..a84b995e2 100644
--- a/pylint/checkers/refactoring/refactoring_checker.py
+++ b/pylint/checkers/refactoring/refactoring_checker.py
@@ -9,7 +9,6 @@ from functools import reduce
from typing import List
import astroid
-from astroid import decorators
from pylint import checkers, interfaces
from pylint import utils as lint_utils
@@ -335,7 +334,7 @@ class RefactoringChecker(checkers.BaseTokenChecker):
# do this in open since config not fully initialized in __init__
self._never_returning_functions = set(self.config.never_returning_functions)
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _dummy_rgx(self):
return lint_utils.get_global_option(self, "dummy-variables-rgx", default=None)
diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py
index fe5b30c18..ce5ec09a1 100644
--- a/pylint/checkers/stdlib.py
+++ b/pylint/checkers/stdlib.py
@@ -36,8 +36,6 @@
import sys
import astroid
-from astroid.bases import Instance
-from astroid.node_classes import Const
from pylint.checkers import BaseChecker, DeprecatedMixin, utils
from pylint.interfaces import IAstroidChecker
@@ -382,7 +380,10 @@ class StdlibChecker(DeprecatedMixin, BaseChecker):
inferred = next(node.infer())
except astroid.InferenceError:
return
- if isinstance(inferred, Instance) and inferred.qname() == "datetime.time":
+ if (
+ isinstance(inferred, astroid.Instance)
+ and inferred.qname() == "datetime.time"
+ ):
self.add_message("boolean-datetime", node=node)
def _check_open_mode(self, node):
@@ -442,7 +443,7 @@ class StdlibChecker(DeprecatedMixin, BaseChecker):
return
name = infer.qname()
- if isinstance(call_arg, Const):
+ if isinstance(call_arg, astroid.Const):
emit = False
if call_arg.value is None:
emit = not allow_none
diff --git a/pylint/checkers/strings.py b/pylint/checkers/strings.py
index d82efacc4..0b36bc7e0 100644
--- a/pylint/checkers/strings.py
+++ b/pylint/checkers/strings.py
@@ -41,8 +41,6 @@ import typing
from typing import Iterable
import astroid
-from astroid.arguments import CallSite
-from astroid.node_classes import Const
from pylint.checkers import BaseChecker, BaseTokenChecker, utils
from pylint.checkers.utils import check_messages
@@ -467,7 +465,7 @@ class StringFormatChecker(BaseChecker):
if not (isinstance(strnode, astroid.Const) and isinstance(strnode.value, str)):
return
try:
- call_site = CallSite.from_call(node)
+ call_site = astroid.arguments.CallSite.from_call(node)
except astroid.InferenceError:
return
@@ -776,7 +774,9 @@ class StringConstantChecker(BaseTokenChecker):
def check_for_concatenated_strings(self, elements, iterable_type):
for elt in elements:
- if not (isinstance(elt, Const) and elt.pytype() in _AST_NODE_STR_TYPES):
+ if not (
+ isinstance(elt, astroid.Const) and elt.pytype() in _AST_NODE_STR_TYPES
+ ):
continue
if elt.col_offset < 0:
# This can happen in case of escaped newlines
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py
index fa3be9338..476897f28 100644
--- a/pylint/checkers/typecheck.py
+++ b/pylint/checkers/typecheck.py
@@ -65,11 +65,6 @@ from functools import singledispatch
from typing import Pattern, Tuple
import astroid
-import astroid.arguments
-import astroid.context
-import astroid.nodes
-from astroid import bases, decorators, exceptions, helpers, modutils, objects
-from astroid.interpreter import dunder_lookup
from pylint.checkers import BaseChecker, utils
from pylint.checkers.utils import (
@@ -469,7 +464,7 @@ def _emit_no_member(node, owner, owner_name, ignored_mixins=True, ignored_none=T
# invoked at this point.
try:
metaclass = owner.metaclass()
- except exceptions.MroError:
+ except astroid.MroError:
return False
if metaclass:
return metaclass.qname() == "enum.EnumMeta"
@@ -481,14 +476,14 @@ def _emit_no_member(node, owner, owner_name, ignored_mixins=True, ignored_none=T
# at some point during the runtime of the program.
if utils.is_attribute_typed_annotation(owner, node.attrname):
return False
- if isinstance(owner, objects.Super):
+ if isinstance(owner, astroid.objects.Super):
# Verify if we are dealing with an invalid Super object.
# If it is invalid, then there's no point in checking that
# it has the required attribute. Also, don't fail if the
# MRO is invalid.
try:
owner.super_mro()
- except (exceptions.MroError, exceptions.SuperError):
+ except (astroid.MroError, astroid.SuperError):
return False
if not all(map(has_known_bases, owner.type.mro())):
return False
@@ -544,7 +539,7 @@ def _determine_callable(callable_obj):
try:
# Use the last definition of __new__.
new = callable_obj.local_attr("__new__")[-1]
- except exceptions.NotFoundError:
+ except astroid.NotFoundError:
new = None
from_object = new and new.parent.scope().name == "object"
@@ -554,7 +549,7 @@ def _determine_callable(callable_obj):
try:
# Use the last definition of __init__.
callable_obj = callable_obj.local_attr("__init__")[-1]
- except exceptions.NotFoundError as e:
+ except astroid.NotFoundError as e:
# do nothing, covered by no-init.
raise ValueError from e
else:
@@ -703,7 +698,7 @@ def _infer_from_metaclass_constructor(cls, func):
def _is_c_extension(module_node):
return (
- not modutils.is_standard_module(module_node.name)
+ not astroid.modutils.is_standard_module(module_node.name)
and not module_node.fully_defined()
)
@@ -865,11 +860,11 @@ accessed. Python regular expressions are accepted.",
),
)
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _suggestion_mode(self):
return get_global_option(self, "suggestion-mode", default=True)
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _compiled_generated_members(self) -> Tuple[Pattern, ...]:
# do this lazily since config not fully initialized in __init__
# generated_members may contain regular expressions
@@ -945,7 +940,7 @@ accessed. Python regular expressions are accepted.",
try:
inferred = list(node.expr.infer())
- except exceptions.InferenceError:
+ except astroid.InferenceError:
return
# list of (node, nodename) which are missing the attribute
@@ -988,7 +983,7 @@ accessed. Python regular expressions are accepted.",
continue
except AttributeError:
continue
- except exceptions.NotFoundError:
+ except astroid.NotFoundError:
# This can't be moved before the actual .getattr call,
# because there can be more values inferred and we are
# stopping after the first one which has the attribute in question.
@@ -1159,7 +1154,7 @@ accessed. Python regular expressions are accepted.",
try:
attrs = klass._proxied.getattr(node.func.attrname)
- except exceptions.NotFoundError:
+ except astroid.NotFoundError:
return
for attr in attrs:
@@ -1472,17 +1467,16 @@ accessed. Python regular expressions are accepted.",
# type. This way we catch subclasses of sequence types but skip classes
# that override __getitem__ and which may allow non-integer indices.
try:
- methods = dunder_lookup.lookup(parent_type, methodname)
+ methods = astroid.interpreter.dunder_lookup.lookup(parent_type, methodname)
if methods is astroid.Uninferable:
return None
itemmethod = methods[0]
except (
- exceptions.NotFoundError,
- exceptions.AttributeInferenceError,
+ astroid.NotFoundError,
+ astroid.AttributeInferenceError,
IndexError,
):
return None
-
if (
not isinstance(itemmethod, astroid.FunctionDef)
or itemmethod.root().name != BUILTINS
@@ -1511,7 +1505,7 @@ accessed. Python regular expressions are accepted.",
try:
index_type.getattr("__index__")
return None
- except exceptions.NotFoundError:
+ except astroid.NotFoundError:
pass
elif isinstance(index_type, astroid.Slice):
# A slice can be present
@@ -1555,7 +1549,7 @@ accessed. Python regular expressions are accepted.",
try:
index_type.getattr("__index__")
return
- except exceptions.NotFoundError:
+ except astroid.NotFoundError:
pass
invalid_slices += 1
@@ -1593,7 +1587,7 @@ accessed. Python regular expressions are accepted.",
if inferred is None or inferred is astroid.Uninferable:
continue
- if isinstance(inferred, bases.Generator):
+ if isinstance(inferred, astroid.bases.Generator):
# Check if we are dealing with a function decorated
# with contextlib.contextmanager.
if decorated_with(
@@ -1632,7 +1626,7 @@ accessed. Python regular expressions are accepted.",
try:
inferred.getattr("__enter__")
inferred.getattr("__exit__")
- except exceptions.NotFoundError:
+ except astroid.NotFoundError:
if isinstance(inferred, astroid.Instance):
# If we do not know the bases of this class,
# just skip it.
@@ -1705,7 +1699,7 @@ accessed. Python regular expressions are accepted.",
"""Check if left or right node is of type `type`."""
msg = msg = "unsupported operand type(s) for |"
for n in (node.left, node.right):
- n = helpers.object_type(n)
+ n = astroid.helpers.object_type(n)
if isinstance(n, astroid.ClassDef) and is_classdef_type(n):
self.add_message("unsupported-binary-operation", args=msg, node=node)
break
@@ -1806,7 +1800,7 @@ accessed. Python regular expressions are accepted.",
return
if getattr(inferred, "decorators", None):
- first_decorator = helpers.safe_infer(inferred.decorators.nodes[0])
+ first_decorator = astroid.helpers.safe_infer(inferred.decorators.nodes[0])
if isinstance(first_decorator, astroid.ClassDef):
inferred = first_decorator.instantiate_class()
else:
diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py
index ef9ff68d2..7d9548154 100644
--- a/pylint/checkers/utils.py
+++ b/pylint/checkers/utils.py
@@ -69,9 +69,6 @@ from typing import (
import _string
import astroid
-from astroid import bases as _bases
-from astroid import helpers, scoped_nodes
-from astroid.exceptions import _NonDeducibleTypeHierarchy
from pylint.constants import PY310_PLUS
@@ -460,7 +457,11 @@ def is_func_decorator(node: astroid.node_classes.NodeNG) -> bool:
return True
if parent.is_statement or isinstance(
parent,
- (astroid.Lambda, scoped_nodes.ComprehensionScope, scoped_nodes.ListComp),
+ (
+ astroid.Lambda,
+ astroid.scoped_nodes.ComprehensionScope,
+ astroid.scoped_nodes.ListComp,
+ ),
):
break
parent = parent.parent
@@ -1137,7 +1138,7 @@ def _supports_protocol(
return True
if (
- isinstance(value, _bases.Proxy)
+ isinstance(value, astroid.bases.Proxy)
and isinstance(value._proxied, astroid.BaseInstance)
and has_known_bases(value._proxied)
):
@@ -1370,9 +1371,9 @@ def is_subclass_of(child: astroid.ClassDef, parent: astroid.ClassDef) -> bool:
for ancestor in child.ancestors():
try:
- if helpers.is_subtype(ancestor, parent):
+ if astroid.helpers.is_subtype(ancestor, parent):
return True
- except _NonDeducibleTypeHierarchy:
+ except astroid.exceptions._NonDeducibleTypeHierarchy:
continue
return False
diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py
index f9c1f0fe4..875257155 100644
--- a/pylint/checkers/variables.py
+++ b/pylint/checkers/variables.py
@@ -54,8 +54,6 @@ import re
from functools import lru_cache
import astroid
-from astroid import decorators, modutils, objects
-from astroid.context import InferenceContext
from pylint.checkers import BaseChecker, utils
from pylint.checkers.utils import is_postponed_evaluation_enabled
@@ -253,7 +251,7 @@ def _detect_global_scope(node, frame, defframe):
def _infer_name_module(node, name):
- context = InferenceContext()
+ context = astroid.context.InferenceContext()
context.lookupname = name
return node.infer(context, asname=False)
@@ -1243,15 +1241,15 @@ class VariablesChecker(BaseChecker):
self._store_type_annotation_node(annotation)
# Relying on other checker's options, which might not have been initialized yet.
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _analyse_fallback_blocks(self):
return get_global_option(self, "analyse-fallback-blocks", default=False)
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _ignored_modules(self):
return get_global_option(self, "ignored-modules", default=[])
- @decorators.cachedproperty
+ @astroid.decorators.cachedproperty
def _allow_global_unused_variables(self):
return get_global_option(self, "allow-global-unused-variables", default=True)
@@ -1608,7 +1606,7 @@ class VariablesChecker(BaseChecker):
astroid.Tuple,
astroid.Dict,
astroid.Set,
- objects.FrozenSet,
+ astroid.objects.FrozenSet,
)
if not isinstance(inferred, sequences):
self.add_message("undefined-loop-variable", args=name, node=node)
@@ -1978,7 +1976,7 @@ class VariablesChecker(BaseChecker):
if os.path.basename(basename) == "__init__":
name = node.name + "." + elt_name
try:
- modutils.file_from_modpath(name.split("."))
+ astroid.modutils.file_from_modpath(name.split("."))
except ImportError:
self.add_message(
"undefined-all-variable", args=(elt_name,), node=elt
diff --git a/pylint/constants.py b/pylint/constants.py
index 7181cb355..2124a2020 100644
--- a/pylint/constants.py
+++ b/pylint/constants.py
@@ -3,7 +3,7 @@
import sys
-from astroid.__pkginfo__ import version as astroid_version
+import astroid
from pylint.__pkginfo__ import version as pylint_version
@@ -46,5 +46,5 @@ class WarningScope:
full_version = f"""pylint {pylint_version}
-astroid {astroid_version}
-Python { sys.version}"""
+astroid {astroid.__version__}
+Python {sys.version}"""
diff --git a/pylint/lint/pylinter.py b/pylint/lint/pylinter.py
index 1f7b528a5..5a662a079 100644
--- a/pylint/lint/pylinter.py
+++ b/pylint/lint/pylinter.py
@@ -13,8 +13,6 @@ import warnings
from io import TextIOWrapper
import astroid
-from astroid import modutils
-from astroid.builder import AstroidBuilder
from pylint import checkers, config, exceptions, interfaces, reporters
from pylint.constants import MAIN_CHECKER_NAME, MSG_TYPES
@@ -502,7 +500,7 @@ class PyLinter(
if modname in self._dynamic_plugins:
continue
self._dynamic_plugins.add(modname)
- module = modutils.load_module_from_name(modname)
+ module = astroid.modutils.load_module_from_name(modname)
module.register(self)
def load_plugin_configuration(self):
@@ -513,7 +511,7 @@ class PyLinter(
settings.
"""
for modname in self._dynamic_plugins:
- module = modutils.load_module_from_name(modname)
+ module = astroid.modutils.load_module_from_name(modname)
if hasattr(module, "load_configuration"):
module.load_configuration(self)
@@ -531,7 +529,8 @@ class PyLinter(
def _load_reporter_class(self):
qname = self._reporter_name
- module = modutils.load_module_from_name(modutils.get_module_part(qname))
+ module_part = astroid.modutils.get_module_part(qname)
+ module = astroid.modutils.load_module_from_name(module_part)
class_name = qname.split(".")[-1]
reporter_class = getattr(module, class_name)
return reporter_class
@@ -953,7 +952,7 @@ class PyLinter(
# Note that this function does not really perform an
# __import__ but may raise an ImportError exception, which
# we want to catch here.
- modname = ".".join(modutils.modpath_from_file(filepath))
+ modname = ".".join(astroid.modutils.modpath_from_file(filepath))
except ImportError:
modname = os.path.splitext(os.path.basename(filepath))[0]
@@ -1043,7 +1042,9 @@ class PyLinter(
try:
if data is None:
return MANAGER.ast_from_file(filepath, modname, source=True)
- return AstroidBuilder(MANAGER).string_build(data, modname, filepath)
+ return astroid.builder.AstroidBuilder(MANAGER).string_build(
+ data, modname, filepath
+ )
except astroid.AstroidSyntaxError as ex:
# pylint: disable=no-member
self.add_message(
diff --git a/pylint/utils/utils.py b/pylint/utils/utils.py
index 0b4351722..b06cf3026 100644
--- a/pylint/utils/utils.py
+++ b/pylint/utils/utils.py
@@ -1,6 +1,7 @@
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/master/COPYING
+
try:
import isort.api
diff --git a/tests/unittest_pyreverse_inspector.py b/tests/unittest_pyreverse_inspector.py
index 7871fdb33..add2910d2 100644
--- a/tests/unittest_pyreverse_inspector.py
+++ b/tests/unittest_pyreverse_inspector.py
@@ -17,7 +17,6 @@ import os
import astroid
import pytest
-from astroid import bases, nodes
from unittest_pyreverse_writer import get_project
from pylint.pyreverse import inspector
@@ -35,7 +34,7 @@ def test_class_implements(project):
klass = project.get_module("data.clientmodule_test")["Ancestor"]
assert hasattr(klass, "implements")
assert len(klass.implements) == 1
- assert isinstance(klass.implements[0], nodes.ClassDef)
+ assert isinstance(klass.implements[0], astroid.nodes.ClassDef)
assert klass.implements[0].name == "Interface"
@@ -65,7 +64,9 @@ def test_instance_attrs_resolution(project):
assert len(type_dict) == 2
keys = sorted(type_dict.keys())
assert keys == ["_id", "relation"]
- assert isinstance(type_dict["relation"][0], bases.Instance), type_dict["relation"]
+ assert isinstance(type_dict["relation"][0], astroid.bases.Instance), type_dict[
+ "relation"
+ ]
assert type_dict["relation"][0].name == "DoNothing"
assert type_dict["_id"][0] is astroid.Uninferable