summaryrefslogtreecommitdiff
path: root/pylint/pyreverse
diff options
context:
space:
mode:
authorAndreas Finkler <3929834+DudeNr33@users.noreply.github.com>2022-05-11 21:34:01 +0200
committerGitHub <noreply@github.com>2022-05-11 21:34:01 +0200
commite91a674b9e67c5f99382a621e28958656fa6c1f9 (patch)
tree444acc2e1fd9fb0de2c893297d6feccb7c739897 /pylint/pyreverse
parent7e1726f79730c838ce75ab0f9c7c275245d89356 (diff)
downloadpylint-git-e91a674b9e67c5f99382a621e28958656fa6c1f9.tar.gz
Finish typing of `pylint.pyreverse.utils` (#6549)
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
Diffstat (limited to 'pylint/pyreverse')
-rw-r--r--pylint/pyreverse/utils.py64
1 files changed, 29 insertions, 35 deletions
diff --git a/pylint/pyreverse/utils.py b/pylint/pyreverse/utils.py
index 28e7c6e35..c4c1c619a 100644
--- a/pylint/pyreverse/utils.py
+++ b/pylint/pyreverse/utils.py
@@ -11,10 +11,23 @@ import re
import shutil
import subprocess
import sys
+from typing import TYPE_CHECKING, Any, Callable, Optional, Tuple, Union
import astroid
from astroid import nodes
+if TYPE_CHECKING:
+ from pylint.pyreverse.diadefslib import DiaDefGenerator
+ from pylint.pyreverse.diagrams import ClassDiagram, PackageDiagram
+ from pylint.pyreverse.inspector import Linker
+
+ _CallbackT = Callable[
+ [nodes.NodeNG],
+ Union[Tuple[ClassDiagram], Tuple[PackageDiagram, ClassDiagram], None],
+ ]
+ _CallbackTupleT = Tuple[Optional[_CallbackT], Optional[_CallbackT]]
+
+
RCFILE = ".pyreverserc"
@@ -46,7 +59,7 @@ PRIVATE = re.compile(r"^__(_*[^\W_])+_?$")
PROTECTED = re.compile(r"^_\w*$")
-def get_visibility(name):
+def get_visibility(name: str) -> str:
"""Return the visibility from a name: public, protected, private or special."""
if SPECIAL.match(name):
visibility = "special"
@@ -60,37 +73,18 @@ def get_visibility(name):
return visibility
-ABSTRACT = re.compile(r"^.*Abstract.*")
-FINAL = re.compile(r"^[^\W\da-z]*$")
-
-
-def is_abstract(node):
- """Return true if the given class node correspond to an abstract class
- definition.
- """
- return ABSTRACT.match(node.name)
-
-
-def is_final(node):
- """Return true if the given class/function node correspond to final
- definition.
- """
- return FINAL.match(node.name)
-
-
-def is_interface(node):
+def is_interface(node: nodes.ClassDef) -> bool:
# bw compatibility
return node.type == "interface"
-def is_exception(node):
+def is_exception(node: nodes.ClassDef) -> bool:
# bw compatibility
return node.type == "exception"
# Helpers #####################################################################
-_CONSTRUCTOR = 1
_SPECIAL = 2
_PROTECTED = 4
_PRIVATE = 8
@@ -111,7 +105,7 @@ VIS_MOD = {
class FilterMixIn:
"""Filter nodes according to a mode and nodes' visibility."""
- def __init__(self, mode):
+ def __init__(self, mode: str) -> None:
"""Init filter modes."""
__mode = 0
for nummod in mode.split("+"):
@@ -121,7 +115,7 @@ class FilterMixIn:
print(f"Unknown filter mode {ex}", file=sys.stderr)
self.__mode = __mode
- def show_attr(self, node):
+ def show_attr(self, node: nodes.NodeNG | str) -> bool:
"""Return true if the node should be treated."""
visibility = get_visibility(getattr(node, "name", node))
return not self.__mode & VIS_MOD[visibility]
@@ -137,11 +131,11 @@ class ASTWalker:
the node in lower case
"""
- def __init__(self, handler):
+ def __init__(self, handler: DiaDefGenerator | Linker | LocalsVisitor) -> None:
self.handler = handler
- self._cache = {}
+ self._cache: dict[type[nodes.NodeNG], _CallbackTupleT] = {}
- def walk(self, node, _done=None):
+ def walk(self, node: nodes.NodeNG, _done: set[nodes.NodeNG] | None = None) -> None:
"""Walk on the tree from <node>, getting callbacks from handler."""
if _done is None:
_done = set()
@@ -155,7 +149,7 @@ class ASTWalker:
self.leave(node)
assert node.parent is not node
- def get_callbacks(self, node):
+ def get_callbacks(self, node: nodes.NodeNG) -> _CallbackTupleT:
"""Get callbacks from handler for the visited node."""
klass = node.__class__
methods = self._cache.get(klass)
@@ -173,13 +167,13 @@ class ASTWalker:
e_method, l_method = methods
return e_method, l_method
- def visit(self, node):
+ def visit(self, node: nodes.NodeNG) -> Any:
"""Walk on the tree from <node>, getting callbacks from handler."""
method = self.get_callbacks(node)[0]
if method is not None:
method(node)
- def leave(self, node):
+ def leave(self, node: nodes.NodeNG) -> None:
"""Walk on the tree from <node>, getting callbacks from handler."""
method = self.get_callbacks(node)[1]
if method is not None:
@@ -189,11 +183,11 @@ class ASTWalker:
class LocalsVisitor(ASTWalker):
"""Visit a project by traversing the locals dictionary."""
- def __init__(self):
+ def __init__(self) -> None:
super().__init__(self)
- self._visited = set()
+ self._visited: set[nodes.NodeNG] = set()
- def visit(self, node):
+ def visit(self, node: nodes.NodeNG) -> Any:
"""Launch the visit starting from the given node."""
if node in self._visited:
return None
@@ -253,7 +247,7 @@ def get_annotation(
return ann
-def infer_node(node: nodes.AssignAttr | nodes.AssignName) -> set:
+def infer_node(node: nodes.AssignAttr | nodes.AssignName) -> set[Any]:
"""Return a set containing the node annotation if it exists
otherwise return a set of the inferred types using the NodeNG.infer method.
"""
@@ -269,7 +263,7 @@ def infer_node(node: nodes.AssignAttr | nodes.AssignName) -> set:
return {ann} if ann else set()
-def check_graphviz_availability():
+def check_graphviz_availability() -> None:
"""Check if the ``dot`` command is available on the machine.
This is needed if image output is desired and ``dot`` is used to convert