29
29
import uuid
30
30
from collections import defaultdict
31
31
from warnings import warn
32
+ from typing import cast , Any , Optional , Union
32
33
33
34
from .exceptions import NodePropertyError
34
35
from .misc import deprecated
@@ -43,11 +44,17 @@ class Node(object):
43
44
#: Mode constants for routine `update_fpointer()`.
44
45
(ADD , DELETE , INSERT , REPLACE ) = list (range (4 ))
45
46
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 :
47
54
"""Create a new Node object to be placed inside a Tree object"""
48
55
49
56
#: if given as a parameter, must be unique
50
- self ._identifier = None
57
+ self ._identifier : Optional [ str ] = None
51
58
self ._set_identifier (identifier )
52
59
53
60
#: None or something else
@@ -61,24 +68,24 @@ def __init__(self, tag=None, identifier=None, expanded=True, data=None):
61
68
self .expanded = expanded
62
69
63
70
#: identifier of the parent's node :
64
- self ._predecessor = {}
71
+ self ._predecessor : dict = {}
65
72
#: identifier(s) of the soons' node(s) :
66
- self ._successors = defaultdict (list )
73
+ self ._successors : dict = defaultdict (list )
67
74
68
75
#: User payload associated with this node.
69
76
self .data = data
70
77
71
78
# for retro-compatibility on bpointer/fpointer
72
- self ._initial_tree_id = None
79
+ self ._initial_tree_id : Optional [ str ] = None
73
80
74
- def __lt__ (self , other ):
81
+ def __lt__ (self , other ) -> bool :
75
82
return self .tag < other .tag
76
83
77
- def set_initial_tree_id (self , tree_id ) :
84
+ def set_initial_tree_id (self , tree_id : str ) -> None :
78
85
if self ._initial_tree_id is None :
79
86
self ._initial_tree_id = tree_id
80
87
81
- def _set_identifier (self , nid ) :
88
+ def _set_identifier (self , nid : Optional [ str ]) -> None :
82
89
"""Initialize self._set_identifier"""
83
90
if nid is None :
84
91
self ._identifier = str (uuid .uuid1 ())
@@ -98,11 +105,11 @@ def bpointer(self):
98
105
99
106
@bpointer .setter
100
107
@deprecated (alias = "node.set_predecessor" )
101
- def bpointer (self , value ):
108
+ def bpointer (self , value ) -> None :
102
109
self .set_predecessor (value , self ._initial_tree_id )
103
110
104
111
@deprecated (alias = "node.set_predecessor" )
105
- def update_bpointer (self , nid ):
112
+ def update_bpointer (self , nid ) -> None :
106
113
self .set_predecessor (nid , self ._initial_tree_id )
107
114
108
115
@property
@@ -118,7 +125,7 @@ def fpointer(self):
118
125
119
126
@fpointer .setter
120
127
@deprecated (alias = "node.update_successors" )
121
- def fpointer (self , value ) :
128
+ def fpointer (self , value : Union [ None , list , dict , set ]) -> None :
122
129
self .set_successors (value , tree_id = self ._initial_tree_id )
123
130
124
131
@deprecated (alias = "node.update_successors" )
@@ -132,11 +139,11 @@ def predecessor(self, tree_id):
132
139
"""
133
140
return self ._predecessor [tree_id ]
134
141
135
- def set_predecessor (self , nid , tree_id ) :
142
+ def set_predecessor (self , nid : Optional [ str ] , tree_id : Optional [ str ]) -> None :
136
143
"""Set the value of `_predecessor`."""
137
144
self ._predecessor [tree_id ] = nid
138
145
139
- def successors (self , tree_id ) :
146
+ def successors (self , tree_id : Optional [ str ]) -> list [ str ] :
140
147
"""
141
148
With a getting operator, a list of IDs of node's children is obtained. With
142
149
a setting operator, the value can be list, set, or dict. For list or set,
@@ -145,7 +152,9 @@ def successors(self, tree_id):
145
152
"""
146
153
return self ._successors [tree_id ]
147
154
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 :
149
158
"""Set the value of `_successors`."""
150
159
setter_lookup = {
151
160
"NoneType" : lambda x : list (),
@@ -161,31 +170,37 @@ def set_successors(self, value, tree_id=None):
161
170
else :
162
171
raise NotImplementedError ("Unsupported value type %s" % t )
163
172
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 :
165
180
"""
166
181
Update the children list with different modes: addition (Node.ADD or
167
182
Node.INSERT) and deletion (Node.DELETE).
168
183
"""
169
184
if nid is None :
170
185
return
171
186
172
- def _manipulator_append ():
187
+ def _manipulator_append () -> None :
173
188
self .successors (tree_id ).append (nid )
174
189
175
- def _manipulator_delete ():
190
+ def _manipulator_delete () -> None :
176
191
if nid in self .successors (tree_id ):
177
192
self .successors (tree_id ).remove (nid )
178
193
else :
179
194
warn ("Nid %s wasn't present in fpointer" % nid )
180
195
181
- def _manipulator_insert ():
196
+ def _manipulator_insert () -> None :
182
197
warn ("WARNING: INSERT is deprecated to ADD mode" )
183
198
self .update_successors (nid , tree_id = tree_id )
184
199
185
- def _manipulator_replace ():
200
+ def _manipulator_replace () -> None :
186
201
if replace is None :
187
202
raise NodePropertyError (
188
- 'Argument "repalce " should be provided when mode is {}' .format (mode )
203
+ 'Argument "replace " should be provided when mode is {}' .format (mode )
189
204
)
190
205
ind = self .successors (tree_id ).index (nid )
191
206
self .successors (tree_id )[ind ] = replace
@@ -200,38 +215,38 @@ def _manipulator_replace():
200
215
if mode not in manipulator_lookup :
201
216
raise NotImplementedError ("Unsupported node updating mode %s" % str (mode ))
202
217
203
- f_name = manipulator_lookup .get (mode )
218
+ f_name = cast ( str , manipulator_lookup .get (mode ) )
204
219
f = locals ()[f_name ]
205
220
return f ()
206
221
207
222
@property
208
- def identifier (self ):
223
+ def identifier (self ) -> str :
209
224
"""
210
225
The unique ID of a node within the scope of a tree. This attribute can be
211
226
accessed and modified with ``.`` and ``=`` operator respectively.
212
227
"""
213
- return self ._identifier
228
+ return cast ( str , self ._identifier )
214
229
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 :
216
231
former_bpointer = self .predecessor (former_tree_id )
217
232
self .set_predecessor (former_bpointer , new_tree_id )
218
233
former_fpointer = self .successors (former_tree_id )
219
234
# fpointer is a list and would be copied by reference without deepcopy
220
235
self .set_successors (copy .deepcopy (former_fpointer ), tree_id = new_tree_id )
221
236
222
- def reset_pointers (self , tree_id ):
237
+ def reset_pointers (self , tree_id ) -> None :
223
238
self .set_predecessor (None , tree_id )
224
239
self .set_successors ([], tree_id = tree_id )
225
240
226
- @identifier .setter
227
- def identifier (self , value ) :
241
+ @identifier .setter # type: ignore
242
+ def identifier (self , value : str ) -> None :
228
243
"""Set the value of `_identifier`."""
229
244
if value is None :
230
245
print ("WARNING: node ID can not be None" )
231
246
else :
232
247
self ._set_identifier (value )
233
248
234
- def is_leaf (self , tree_id = None ):
249
+ def is_leaf (self , tree_id : Optional [ str ] = None ) -> bool :
235
250
"""Return true if current node has no children."""
236
251
if tree_id is None :
237
252
# for retro-compatilibity
@@ -245,7 +260,7 @@ def is_leaf(self, tree_id=None):
245
260
else :
246
261
return False
247
262
248
- def is_root (self , tree_id = None ):
263
+ def is_root (self , tree_id : Optional [ str ] = None ) -> bool :
249
264
"""Return true if self has no parent, i.e. as root."""
250
265
if tree_id is None :
251
266
# for retro-compatilibity
@@ -257,19 +272,19 @@ def is_root(self, tree_id=None):
257
272
return self .predecessor (tree_id ) is None
258
273
259
274
@property
260
- def tag (self ):
275
+ def tag (self ) -> str :
261
276
"""
262
277
The readable node name for human. This attribute can be accessed and
263
278
modified with ``.`` and ``=`` operator respectively.
264
279
"""
265
- return self ._tag
280
+ return cast ( str , self ._tag )
266
281
267
282
@tag .setter
268
- def tag (self , value ) :
283
+ def tag (self , value : Optional [ str ]) -> None :
269
284
"""Set the value of `_tag`."""
270
285
self ._tag = value if value is not None else None
271
286
272
- def __repr__ (self ):
287
+ def __repr__ (self ) -> str :
273
288
name = self .__class__ .__name__
274
289
kwargs = [
275
290
"tag={0}" .format (self .tag ),
0 commit comments