Skip to content

Commit e91a674

Browse files
DudeNr33cdce8p
andauthored
Finish typing of pylint.pyreverse.utils (#6549)
Co-authored-by: Marc Mueller <[email protected]>
1 parent 7e1726f commit e91a674

File tree

1 file changed

+29
-35
lines changed

1 file changed

+29
-35
lines changed

pylint/pyreverse/utils.py

+29-35
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,23 @@
1111
import shutil
1212
import subprocess
1313
import sys
14+
from typing import TYPE_CHECKING, Any, Callable, Optional, Tuple, Union
1415

1516
import astroid
1617
from astroid import nodes
1718

19+
if TYPE_CHECKING:
20+
from pylint.pyreverse.diadefslib import DiaDefGenerator
21+
from pylint.pyreverse.diagrams import ClassDiagram, PackageDiagram
22+
from pylint.pyreverse.inspector import Linker
23+
24+
_CallbackT = Callable[
25+
[nodes.NodeNG],
26+
Union[Tuple[ClassDiagram], Tuple[PackageDiagram, ClassDiagram], None],
27+
]
28+
_CallbackTupleT = Tuple[Optional[_CallbackT], Optional[_CallbackT]]
29+
30+
1831
RCFILE = ".pyreverserc"
1932

2033

@@ -46,7 +59,7 @@ def insert_default_options() -> None:
4659
PROTECTED = re.compile(r"^_\w*$")
4760

4861

49-
def get_visibility(name):
62+
def get_visibility(name: str) -> str:
5063
"""Return the visibility from a name: public, protected, private or special."""
5164
if SPECIAL.match(name):
5265
visibility = "special"
@@ -60,37 +73,18 @@ def get_visibility(name):
6073
return visibility
6174

6275

63-
ABSTRACT = re.compile(r"^.*Abstract.*")
64-
FINAL = re.compile(r"^[^\W\da-z]*$")
65-
66-
67-
def is_abstract(node):
68-
"""Return true if the given class node correspond to an abstract class
69-
definition.
70-
"""
71-
return ABSTRACT.match(node.name)
72-
73-
74-
def is_final(node):
75-
"""Return true if the given class/function node correspond to final
76-
definition.
77-
"""
78-
return FINAL.match(node.name)
79-
80-
81-
def is_interface(node):
76+
def is_interface(node: nodes.ClassDef) -> bool:
8277
# bw compatibility
8378
return node.type == "interface"
8479

8580

86-
def is_exception(node):
81+
def is_exception(node: nodes.ClassDef) -> bool:
8782
# bw compatibility
8883
return node.type == "exception"
8984

9085

9186
# Helpers #####################################################################
9287

93-
_CONSTRUCTOR = 1
9488
_SPECIAL = 2
9589
_PROTECTED = 4
9690
_PRIVATE = 8
@@ -111,7 +105,7 @@ def is_exception(node):
111105
class FilterMixIn:
112106
"""Filter nodes according to a mode and nodes' visibility."""
113107

114-
def __init__(self, mode):
108+
def __init__(self, mode: str) -> None:
115109
"""Init filter modes."""
116110
__mode = 0
117111
for nummod in mode.split("+"):
@@ -121,7 +115,7 @@ def __init__(self, mode):
121115
print(f"Unknown filter mode {ex}", file=sys.stderr)
122116
self.__mode = __mode
123117

124-
def show_attr(self, node):
118+
def show_attr(self, node: nodes.NodeNG | str) -> bool:
125119
"""Return true if the node should be treated."""
126120
visibility = get_visibility(getattr(node, "name", node))
127121
return not self.__mode & VIS_MOD[visibility]
@@ -137,11 +131,11 @@ class ASTWalker:
137131
the node in lower case
138132
"""
139133

140-
def __init__(self, handler):
134+
def __init__(self, handler: DiaDefGenerator | Linker | LocalsVisitor) -> None:
141135
self.handler = handler
142-
self._cache = {}
136+
self._cache: dict[type[nodes.NodeNG], _CallbackTupleT] = {}
143137

144-
def walk(self, node, _done=None):
138+
def walk(self, node: nodes.NodeNG, _done: set[nodes.NodeNG] | None = None) -> None:
145139
"""Walk on the tree from <node>, getting callbacks from handler."""
146140
if _done is None:
147141
_done = set()
@@ -155,7 +149,7 @@ def walk(self, node, _done=None):
155149
self.leave(node)
156150
assert node.parent is not node
157151

158-
def get_callbacks(self, node):
152+
def get_callbacks(self, node: nodes.NodeNG) -> _CallbackTupleT:
159153
"""Get callbacks from handler for the visited node."""
160154
klass = node.__class__
161155
methods = self._cache.get(klass)
@@ -173,13 +167,13 @@ def get_callbacks(self, node):
173167
e_method, l_method = methods
174168
return e_method, l_method
175169

176-
def visit(self, node):
170+
def visit(self, node: nodes.NodeNG) -> Any:
177171
"""Walk on the tree from <node>, getting callbacks from handler."""
178172
method = self.get_callbacks(node)[0]
179173
if method is not None:
180174
method(node)
181175

182-
def leave(self, node):
176+
def leave(self, node: nodes.NodeNG) -> None:
183177
"""Walk on the tree from <node>, getting callbacks from handler."""
184178
method = self.get_callbacks(node)[1]
185179
if method is not None:
@@ -189,11 +183,11 @@ def leave(self, node):
189183
class LocalsVisitor(ASTWalker):
190184
"""Visit a project by traversing the locals dictionary."""
191185

192-
def __init__(self):
186+
def __init__(self) -> None:
193187
super().__init__(self)
194-
self._visited = set()
188+
self._visited: set[nodes.NodeNG] = set()
195189

196-
def visit(self, node):
190+
def visit(self, node: nodes.NodeNG) -> Any:
197191
"""Launch the visit starting from the given node."""
198192
if node in self._visited:
199193
return None
@@ -253,7 +247,7 @@ def get_annotation(
253247
return ann
254248

255249

256-
def infer_node(node: nodes.AssignAttr | nodes.AssignName) -> set:
250+
def infer_node(node: nodes.AssignAttr | nodes.AssignName) -> set[Any]:
257251
"""Return a set containing the node annotation if it exists
258252
otherwise return a set of the inferred types using the NodeNG.infer method.
259253
"""
@@ -269,7 +263,7 @@ def infer_node(node: nodes.AssignAttr | nodes.AssignName) -> set:
269263
return {ann} if ann else set()
270264

271265

272-
def check_graphviz_availability():
266+
def check_graphviz_availability() -> None:
273267
"""Check if the ``dot`` command is available on the machine.
274268
275269
This is needed if image output is desired and ``dot`` is used to convert

0 commit comments

Comments
 (0)