Adjust astroid import in pylint plugin (#72841)

* import nodes from astroid

* Update remaining pylint plugins

Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
This commit is contained in:
epenet 2022-06-02 07:48:59 +02:00 committed by GitHub
parent f79e5e002b
commit 999b3a4f7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 35 deletions

View File

@ -1,5 +1,7 @@
"""Plugin for constructor definitions."""
from astroid import Const, FunctionDef
from __future__ import annotations
from astroid import nodes
from pylint.checkers import BaseChecker
from pylint.interfaces import IAstroidChecker
from pylint.lint import PyLinter
@ -22,7 +24,7 @@ class HassConstructorFormatChecker(BaseChecker): # type: ignore[misc]
}
options = ()
def visit_functiondef(self, node: FunctionDef) -> None:
def visit_functiondef(self, node: nodes.FunctionDef) -> None:
"""Called when a FunctionDef node is visited."""
if not node.is_method() or node.name != "__init__":
return
@ -43,7 +45,7 @@ class HassConstructorFormatChecker(BaseChecker): # type: ignore[misc]
return
# Check that return type is specified and it is "None".
if not isinstance(node.returns, Const) or node.returns.value is not None:
if not isinstance(node.returns, nodes.Const) or node.returns.value is not None:
self.add_message("hass-constructor-return", node=node)

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from dataclasses import dataclass
import re
import astroid
from astroid import nodes
from pylint.checkers import BaseChecker
from pylint.interfaces import IAstroidChecker
from pylint.lint import PyLinter
@ -437,7 +437,7 @@ _CLASS_MATCH: dict[str, list[ClassTypeHintMatch]] = {
def _is_valid_type(
expected_type: list[str] | str | None | object, node: astroid.NodeNG
expected_type: list[str] | str | None | object, node: nodes.NodeNG
) -> bool:
"""Check the argument node against the expected type."""
if expected_type is UNDEFINED:
@ -451,18 +451,18 @@ def _is_valid_type(
# Const occurs when the type is None
if expected_type is None or expected_type == "None":
return isinstance(node, astroid.Const) and node.value is None
return isinstance(node, nodes.Const) and node.value is None
assert isinstance(expected_type, str)
# Const occurs when the type is an Ellipsis
if expected_type == "...":
return isinstance(node, astroid.Const) and node.value == Ellipsis
return isinstance(node, nodes.Const) and node.value == Ellipsis
# Special case for `xxx | yyy`
if match := _TYPE_HINT_MATCHERS["a_or_b"].match(expected_type):
return (
isinstance(node, astroid.BinOp)
isinstance(node, nodes.BinOp)
and _is_valid_type(match.group(1), node.left)
and _is_valid_type(match.group(2), node.right)
)
@ -470,11 +470,11 @@ def _is_valid_type(
# Special case for xxx[yyy[zzz, aaa]]`
if match := _TYPE_HINT_MATCHERS["x_of_y_of_z_comma_a"].match(expected_type):
return (
isinstance(node, astroid.Subscript)
isinstance(node, nodes.Subscript)
and _is_valid_type(match.group(1), node.value)
and isinstance(subnode := node.slice, astroid.Subscript)
and isinstance(subnode := node.slice, nodes.Subscript)
and _is_valid_type(match.group(2), subnode.value)
and isinstance(subnode.slice, astroid.Tuple)
and isinstance(subnode.slice, nodes.Tuple)
and _is_valid_type(match.group(3), subnode.slice.elts[0])
and _is_valid_type(match.group(4), subnode.slice.elts[1])
)
@ -482,9 +482,9 @@ def _is_valid_type(
# Special case for xxx[yyy, zzz]`
if match := _TYPE_HINT_MATCHERS["x_of_y_comma_z"].match(expected_type):
return (
isinstance(node, astroid.Subscript)
isinstance(node, nodes.Subscript)
and _is_valid_type(match.group(1), node.value)
and isinstance(node.slice, astroid.Tuple)
and isinstance(node.slice, nodes.Tuple)
and _is_valid_type(match.group(2), node.slice.elts[0])
and _is_valid_type(match.group(3), node.slice.elts[1])
)
@ -492,22 +492,22 @@ def _is_valid_type(
# Special case for xxx[yyy]`
if match := _TYPE_HINT_MATCHERS["x_of_y"].match(expected_type):
return (
isinstance(node, astroid.Subscript)
isinstance(node, nodes.Subscript)
and _is_valid_type(match.group(1), node.value)
and _is_valid_type(match.group(2), node.slice)
)
# Name occurs when a namespace is not used, eg. "HomeAssistant"
if isinstance(node, astroid.Name) and node.name == expected_type:
if isinstance(node, nodes.Name) and node.name == expected_type:
return True
# Attribute occurs when a namespace is used, eg. "core.HomeAssistant"
return isinstance(node, astroid.Attribute) and node.attrname == expected_type
return isinstance(node, nodes.Attribute) and node.attrname == expected_type
def _get_all_annotations(node: astroid.FunctionDef) -> list[astroid.NodeNG | None]:
def _get_all_annotations(node: nodes.FunctionDef) -> list[nodes.NodeNG | None]:
args = node.args
annotations: list[astroid.NodeNG | None] = (
annotations: list[nodes.NodeNG | None] = (
args.posonlyargs_annotations + args.annotations + args.kwonlyargs_annotations
)
if args.vararg is not None:
@ -518,7 +518,7 @@ def _get_all_annotations(node: astroid.FunctionDef) -> list[astroid.NodeNG | Non
def _has_valid_annotations(
annotations: list[astroid.NodeNG | None],
annotations: list[nodes.NodeNG | None],
) -> bool:
for annotation in annotations:
if annotation is not None:
@ -563,7 +563,7 @@ class HassTypeHintChecker(BaseChecker): # type: ignore[misc]
self._function_matchers: list[TypeHintMatch] = []
self._class_matchers: list[ClassTypeHintMatch] = []
def visit_module(self, node: astroid.Module) -> None:
def visit_module(self, node: nodes.Module) -> None:
"""Called when a Module node is visited."""
self._function_matchers = []
self._class_matchers = []
@ -580,16 +580,16 @@ class HassTypeHintChecker(BaseChecker): # type: ignore[misc]
if class_matches := _CLASS_MATCH.get(module_platform):
self._class_matchers = class_matches
def visit_classdef(self, node: astroid.ClassDef) -> None:
def visit_classdef(self, node: nodes.ClassDef) -> None:
"""Called when a ClassDef node is visited."""
ancestor: astroid.ClassDef
ancestor: nodes.ClassDef
for ancestor in node.ancestors():
for class_matches in self._class_matchers:
if ancestor.name == class_matches.base_class:
self._visit_class_functions(node, class_matches.matches)
def _visit_class_functions(
self, node: astroid.ClassDef, matches: list[TypeHintMatch]
self, node: nodes.ClassDef, matches: list[TypeHintMatch]
) -> None:
for match in matches:
for function_node in node.mymethods():
@ -597,7 +597,7 @@ class HassTypeHintChecker(BaseChecker): # type: ignore[misc]
if match.function_name == function_name:
self._check_function(function_node, match)
def visit_functiondef(self, node: astroid.FunctionDef) -> None:
def visit_functiondef(self, node: nodes.FunctionDef) -> None:
"""Called when a FunctionDef node is visited."""
for match in self._function_matchers:
if node.name != match.function_name or node.is_method():
@ -606,7 +606,7 @@ class HassTypeHintChecker(BaseChecker): # type: ignore[misc]
visit_asyncfunctiondef = visit_functiondef
def _check_function(self, node: astroid.FunctionDef, match: TypeHintMatch) -> None:
def _check_function(self, node: nodes.FunctionDef, match: TypeHintMatch) -> None:
# Check that at least one argument is annotated.
annotations = _get_all_annotations(node)
if node.returns is None and not _has_valid_annotations(annotations):

View File

@ -4,7 +4,7 @@ from __future__ import annotations
from dataclasses import dataclass
import re
from astroid import Import, ImportFrom, Module
from astroid import nodes
from pylint.checkers import BaseChecker
from pylint.interfaces import IAstroidChecker
from pylint.lint import PyLinter
@ -14,7 +14,7 @@ from pylint.lint import PyLinter
class ObsoleteImportMatch:
"""Class for pattern matching."""
constant: re.Pattern
constant: re.Pattern[str]
reason: str
@ -255,7 +255,7 @@ class HassImportsFormatChecker(BaseChecker): # type: ignore[misc]
super().__init__(linter)
self.current_package: str | None = None
def visit_module(self, node: Module) -> None:
def visit_module(self, node: nodes.Module) -> None:
"""Called when a Module node is visited."""
if node.package:
self.current_package = node.name
@ -263,13 +263,13 @@ class HassImportsFormatChecker(BaseChecker): # type: ignore[misc]
# Strip name of the current module
self.current_package = node.name[: node.name.rfind(".")]
def visit_import(self, node: Import) -> None:
def visit_import(self, node: nodes.Import) -> None:
"""Called when a Import node is visited."""
for module, _alias in node.names:
if module.startswith(f"{self.current_package}."):
self.add_message("hass-relative-import", node=node)
def visit_importfrom(self, node: ImportFrom) -> None:
def visit_importfrom(self, node: nodes.ImportFrom) -> None:
"""Called when a ImportFrom node is visited."""
if node.level is not None:
return

View File

@ -1,5 +1,7 @@
"""Plugin for logger invocations."""
import astroid
from __future__ import annotations
from astroid import nodes
from pylint.checkers import BaseChecker
from pylint.interfaces import IAstroidChecker
from pylint.lint import PyLinter
@ -29,10 +31,10 @@ class HassLoggerFormatChecker(BaseChecker): # type: ignore[misc]
}
options = ()
def visit_call(self, node: astroid.Call) -> None:
def visit_call(self, node: nodes.Call) -> None:
"""Called when a Call node is visited."""
if not isinstance(node.func, astroid.Attribute) or not isinstance(
node.func.expr, astroid.Name
if not isinstance(node.func, nodes.Attribute) or not isinstance(
node.func.expr, nodes.Name
):
return
@ -44,7 +46,7 @@ class HassLoggerFormatChecker(BaseChecker): # type: ignore[misc]
first_arg = node.args[0]
if not isinstance(first_arg, astroid.Const) or not first_arg.value:
if not isinstance(first_arg, nodes.Const) or not first_arg.value:
return
log_message = first_arg.value