Skip to content

Commit de9a4a9

Browse files
Use static typing for mypy stubs. (#232)
1 parent 37ca441 commit de9a4a9

File tree

4 files changed

+185
-118
lines changed

4 files changed

+185
-118
lines changed

setup.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
packages=["treelib"],
1616
keywords=["data structure", "tree", "tools"],
1717
install_requires=["six"],
18+
include_package_data=True,
19+
package_data={"": ["py.typed"]},
1820
classifiers=[
1921
"Development Status :: 5 - Production/Stable",
2022
"Environment :: Console",

treelib/node.py

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import uuid
3030
from collections import defaultdict
3131
from warnings import warn
32+
from typing import cast, Any, Optional, Union
3233

3334
from .exceptions import NodePropertyError
3435
from .misc import deprecated
@@ -43,11 +44,17 @@ class Node(object):
4344
#: Mode constants for routine `update_fpointer()`.
4445
(ADD, DELETE, INSERT, REPLACE) = list(range(4))
4546

46-
def __init__(self, tag=None, identifier=None, expanded=True, data=None):
47+
def __init__(
48+
self,
49+
tag: Optional[str] = None,
50+
identifier: Optional[str] = None,
51+
expanded: bool = True,
52+
data: Any = None,
53+
) -> None:
4754
"""Create a new Node object to be placed inside a Tree object"""
4855

4956
#: if given as a parameter, must be unique
50-
self._identifier = None
57+
self._identifier: Optional[str] = None
5158
self._set_identifier(identifier)
5259

5360
#: None or something else
@@ -61,24 +68,24 @@ def __init__(self, tag=None, identifier=None, expanded=True, data=None):
6168
self.expanded = expanded
6269

6370
#: identifier of the parent's node :
64-
self._predecessor = {}
71+
self._predecessor: dict = {}
6572
#: identifier(s) of the soons' node(s) :
66-
self._successors = defaultdict(list)
73+
self._successors: dict = defaultdict(list)
6774

6875
#: User payload associated with this node.
6976
self.data = data
7077

7178
# for retro-compatibility on bpointer/fpointer
72-
self._initial_tree_id = None
79+
self._initial_tree_id: Optional[str] = None
7380

74-
def __lt__(self, other):
81+
def __lt__(self, other) -> bool:
7582
return self.tag < other.tag
7683

77-
def set_initial_tree_id(self, tree_id):
84+
def set_initial_tree_id(self, tree_id: str) -> None:
7885
if self._initial_tree_id is None:
7986
self._initial_tree_id = tree_id
8087

81-
def _set_identifier(self, nid):
88+
def _set_identifier(self, nid: Optional[str]) -> None:
8289
"""Initialize self._set_identifier"""
8390
if nid is None:
8491
self._identifier = str(uuid.uuid1())
@@ -98,11 +105,11 @@ def bpointer(self):
98105

99106
@bpointer.setter
100107
@deprecated(alias="node.set_predecessor")
101-
def bpointer(self, value):
108+
def bpointer(self, value) -> None:
102109
self.set_predecessor(value, self._initial_tree_id)
103110

104111
@deprecated(alias="node.set_predecessor")
105-
def update_bpointer(self, nid):
112+
def update_bpointer(self, nid) -> None:
106113
self.set_predecessor(nid, self._initial_tree_id)
107114

108115
@property
@@ -118,7 +125,7 @@ def fpointer(self):
118125

119126
@fpointer.setter
120127
@deprecated(alias="node.update_successors")
121-
def fpointer(self, value):
128+
def fpointer(self, value: Union[None, list, dict, set]) -> None:
122129
self.set_successors(value, tree_id=self._initial_tree_id)
123130

124131
@deprecated(alias="node.update_successors")
@@ -132,11 +139,11 @@ def predecessor(self, tree_id):
132139
"""
133140
return self._predecessor[tree_id]
134141

135-
def set_predecessor(self, nid, tree_id):
142+
def set_predecessor(self, nid: Optional[str], tree_id: Optional[str]) -> None:
136143
"""Set the value of `_predecessor`."""
137144
self._predecessor[tree_id] = nid
138145

139-
def successors(self, tree_id):
146+
def successors(self, tree_id: Optional[str]) -> list[str]:
140147
"""
141148
With a getting operator, a list of IDs of node's children is obtained. With
142149
a setting operator, the value can be list, set, or dict. For list or set,
@@ -145,7 +152,9 @@ def successors(self, tree_id):
145152
"""
146153
return self._successors[tree_id]
147154

148-
def set_successors(self, value, tree_id=None):
155+
def set_successors(
156+
self, value: Union[None, list, dict, set], tree_id: Optional[str] = None
157+
) -> None:
149158
"""Set the value of `_successors`."""
150159
setter_lookup = {
151160
"NoneType": lambda x: list(),
@@ -161,31 +170,37 @@ def set_successors(self, value, tree_id=None):
161170
else:
162171
raise NotImplementedError("Unsupported value type %s" % t)
163172

164-
def update_successors(self, nid, mode=ADD, replace=None, tree_id=None):
173+
def update_successors(
174+
self,
175+
nid: Optional[str],
176+
mode: int = ADD,
177+
replace: Optional[str] = None,
178+
tree_id: Optional[str] = None,
179+
) -> None:
165180
"""
166181
Update the children list with different modes: addition (Node.ADD or
167182
Node.INSERT) and deletion (Node.DELETE).
168183
"""
169184
if nid is None:
170185
return
171186

172-
def _manipulator_append():
187+
def _manipulator_append() -> None:
173188
self.successors(tree_id).append(nid)
174189

175-
def _manipulator_delete():
190+
def _manipulator_delete() -> None:
176191
if nid in self.successors(tree_id):
177192
self.successors(tree_id).remove(nid)
178193
else:
179194
warn("Nid %s wasn't present in fpointer" % nid)
180195

181-
def _manipulator_insert():
196+
def _manipulator_insert() -> None:
182197
warn("WARNING: INSERT is deprecated to ADD mode")
183198
self.update_successors(nid, tree_id=tree_id)
184199

185-
def _manipulator_replace():
200+
def _manipulator_replace() -> None:
186201
if replace is None:
187202
raise NodePropertyError(
188-
'Argument "repalce" should be provided when mode is {}'.format(mode)
203+
'Argument "replace" should be provided when mode is {}'.format(mode)
189204
)
190205
ind = self.successors(tree_id).index(nid)
191206
self.successors(tree_id)[ind] = replace
@@ -200,38 +215,38 @@ def _manipulator_replace():
200215
if mode not in manipulator_lookup:
201216
raise NotImplementedError("Unsupported node updating mode %s" % str(mode))
202217

203-
f_name = manipulator_lookup.get(mode)
218+
f_name = cast(str, manipulator_lookup.get(mode))
204219
f = locals()[f_name]
205220
return f()
206221

207222
@property
208-
def identifier(self):
223+
def identifier(self) -> str:
209224
"""
210225
The unique ID of a node within the scope of a tree. This attribute can be
211226
accessed and modified with ``.`` and ``=`` operator respectively.
212227
"""
213-
return self._identifier
228+
return cast(str, self._identifier)
214229

215-
def clone_pointers(self, former_tree_id, new_tree_id):
230+
def clone_pointers(self, former_tree_id: str, new_tree_id: str) -> None:
216231
former_bpointer = self.predecessor(former_tree_id)
217232
self.set_predecessor(former_bpointer, new_tree_id)
218233
former_fpointer = self.successors(former_tree_id)
219234
# fpointer is a list and would be copied by reference without deepcopy
220235
self.set_successors(copy.deepcopy(former_fpointer), tree_id=new_tree_id)
221236

222-
def reset_pointers(self, tree_id):
237+
def reset_pointers(self, tree_id) -> None:
223238
self.set_predecessor(None, tree_id)
224239
self.set_successors([], tree_id=tree_id)
225240

226-
@identifier.setter
227-
def identifier(self, value):
241+
@identifier.setter # type: ignore
242+
def identifier(self, value: str) -> None:
228243
"""Set the value of `_identifier`."""
229244
if value is None:
230245
print("WARNING: node ID can not be None")
231246
else:
232247
self._set_identifier(value)
233248

234-
def is_leaf(self, tree_id=None):
249+
def is_leaf(self, tree_id: Optional[str] = None) -> bool:
235250
"""Return true if current node has no children."""
236251
if tree_id is None:
237252
# for retro-compatilibity
@@ -245,7 +260,7 @@ def is_leaf(self, tree_id=None):
245260
else:
246261
return False
247262

248-
def is_root(self, tree_id=None):
263+
def is_root(self, tree_id: Optional[str] = None) -> bool:
249264
"""Return true if self has no parent, i.e. as root."""
250265
if tree_id is None:
251266
# for retro-compatilibity
@@ -257,19 +272,19 @@ def is_root(self, tree_id=None):
257272
return self.predecessor(tree_id) is None
258273

259274
@property
260-
def tag(self):
275+
def tag(self) -> str:
261276
"""
262277
The readable node name for human. This attribute can be accessed and
263278
modified with ``.`` and ``=`` operator respectively.
264279
"""
265-
return self._tag
280+
return cast(str, self._tag)
266281

267282
@tag.setter
268-
def tag(self, value):
283+
def tag(self, value: Optional[str]) -> None:
269284
"""Set the value of `_tag`."""
270285
self._tag = value if value is not None else None
271286

272-
def __repr__(self):
287+
def __repr__(self) -> str:
273288
name = self.__class__.__name__
274289
kwargs = [
275290
"tag={0}".format(self.tag),

treelib/py.typed

Whitespace-only changes.

0 commit comments

Comments
 (0)