16
16
# along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
18
18
import importlib
19
+ from typing import Any , Dict , Optional
19
20
21
+ from .client import Gitlab , GitlabList
20
22
21
23
__all__ = [
22
24
"RESTObject" ,
@@ -38,7 +40,7 @@ class RESTObject(object):
38
40
39
41
_id_attr = "id"
40
42
41
- def __init__ (self , manager , attrs ) :
43
+ def __init__ (self , manager : "RESTManager" , attrs : Dict [ str , Any ]) -> None :
42
44
self .__dict__ .update (
43
45
{
44
46
"manager" : manager ,
@@ -50,18 +52,18 @@ def __init__(self, manager, attrs):
50
52
self .__dict__ ["_parent_attrs" ] = self .manager .parent_attrs
51
53
self ._create_managers ()
52
54
53
- def __getstate__ (self ):
55
+ def __getstate__ (self ) -> Dict [ str , Any ] :
54
56
state = self .__dict__ .copy ()
55
57
module = state .pop ("_module" )
56
58
state ["_module_name" ] = module .__name__
57
59
return state
58
60
59
- def __setstate__ (self , state ) :
61
+ def __setstate__ (self , state : Dict [ str , Any ]) -> None :
60
62
module_name = state .pop ("_module_name" )
61
63
self .__dict__ .update (state )
62
64
self .__dict__ ["_module" ] = importlib .import_module (module_name )
63
65
64
- def __getattr__ (self , name ) :
66
+ def __getattr__ (self , name : str ) -> Any :
65
67
try :
66
68
return self .__dict__ ["_updated_attrs" ][name ]
67
69
except KeyError :
@@ -90,15 +92,15 @@ def __getattr__(self, name):
90
92
except KeyError :
91
93
raise AttributeError (name )
92
94
93
- def __setattr__ (self , name , value ):
95
+ def __setattr__ (self , name : str , value ) -> None :
94
96
self .__dict__ ["_updated_attrs" ][name ] = value
95
97
96
- def __str__ (self ):
98
+ def __str__ (self ) -> str :
97
99
data = self ._attrs .copy ()
98
100
data .update (self ._updated_attrs )
99
101
return "%s => %s" % (type (self ), data )
100
102
101
- def __repr__ (self ):
103
+ def __repr__ (self ) -> str :
102
104
if self ._id_attr :
103
105
return "<%s %s:%s>" % (
104
106
self .__class__ .__name__ ,
@@ -108,25 +110,25 @@ def __repr__(self):
108
110
else :
109
111
return "<%s>" % self .__class__ .__name__
110
112
111
- def __eq__ (self , other ):
113
+ def __eq__ (self , other ) -> bool :
112
114
if self .get_id () and other .get_id ():
113
115
return self .get_id () == other .get_id ()
114
116
return super (RESTObject , self ) == other
115
117
116
- def __ne__ (self , other ):
118
+ def __ne__ (self , other ) -> bool :
117
119
if self .get_id () and other .get_id ():
118
120
return self .get_id () != other .get_id ()
119
121
return super (RESTObject , self ) != other
120
122
121
123
def __dir__ (self ):
122
124
return super (RESTObject , self ).__dir__ () + list (self .attributes )
123
125
124
- def __hash__ (self ):
126
+ def __hash__ (self ) -> int :
125
127
if not self .get_id ():
126
128
return super (RESTObject , self ).__hash__ ()
127
129
return hash (self .get_id ())
128
130
129
- def _create_managers (self ):
131
+ def _create_managers (self ) -> None :
130
132
managers = getattr (self , "_managers" , None )
131
133
if managers is None :
132
134
return
@@ -136,7 +138,7 @@ def _create_managers(self):
136
138
manager = cls (self .manager .gitlab , parent = self )
137
139
self .__dict__ [attr ] = manager
138
140
139
- def _update_attrs (self , new_attrs ):
141
+ def _update_attrs (self , new_attrs ) -> None :
140
142
self .__dict__ ["_updated_attrs" ] = {}
141
143
self .__dict__ ["_attrs" ] = new_attrs
142
144
@@ -147,7 +149,7 @@ def get_id(self):
147
149
return getattr (self , self ._id_attr )
148
150
149
151
@property
150
- def attributes (self ):
152
+ def attributes (self ) -> Dict [ str , Any ] :
151
153
d = self .__dict__ ["_updated_attrs" ].copy ()
152
154
d .update (self .__dict__ ["_attrs" ])
153
155
d .update (self .__dict__ ["_parent_attrs" ])
@@ -169,7 +171,7 @@ class RESTObjectList(object):
169
171
_list: A GitlabList object
170
172
"""
171
173
172
- def __init__ (self , manager , obj_cls , _list ) :
174
+ def __init__ (self , manager : "RESTManager" , obj_cls , _list : GitlabList ) -> None :
173
175
"""Creates an objects list from a GitlabList.
174
176
175
177
You should not create objects of this type, but use managers list()
@@ -184,10 +186,10 @@ def __init__(self, manager, obj_cls, _list):
184
186
self ._obj_cls = obj_cls
185
187
self ._list = _list
186
188
187
- def __iter__ (self ):
189
+ def __iter__ (self ) -> "RESTObjectList" :
188
190
return self
189
191
190
- def __len__ (self ):
192
+ def __len__ (self ) -> int :
191
193
return len (self ._list )
192
194
193
195
def __next__ (self ):
@@ -198,38 +200,38 @@ def next(self):
198
200
return self ._obj_cls (self .manager , data )
199
201
200
202
@property
201
- def current_page (self ):
203
+ def current_page (self ) -> int :
202
204
"""The current page number."""
203
205
return self ._list .current_page
204
206
205
207
@property
206
- def prev_page (self ):
208
+ def prev_page (self ) -> int :
207
209
"""The previous page number.
208
210
209
211
If None, the current page is the first.
210
212
"""
211
213
return self ._list .prev_page
212
214
213
215
@property
214
- def next_page (self ):
216
+ def next_page (self ) -> int :
215
217
"""The next page number.
216
218
217
219
If None, the current page is the last.
218
220
"""
219
221
return self ._list .next_page
220
222
221
223
@property
222
- def per_page (self ):
224
+ def per_page (self ) -> int :
223
225
"""The number of items per page."""
224
226
return self ._list .per_page
225
227
226
228
@property
227
- def total_pages (self ):
229
+ def total_pages (self ) -> int :
228
230
"""The total number of pages."""
229
231
return self ._list .total_pages
230
232
231
233
@property
232
- def total (self ):
234
+ def total (self ) -> int :
233
235
"""The total number of items."""
234
236
return self ._list .total
235
237
@@ -243,10 +245,11 @@ class RESTManager(object):
243
245
``_obj_cls``: The class of objects that will be created
244
246
"""
245
247
246
- _path = None
247
- _obj_cls = None
248
+ _path : Optional [str ] = None
249
+ _obj_cls : Optional [Any ] = None
250
+ _from_parent_attrs : Dict [str , Any ] = {}
248
251
249
- def __init__ (self , gl , parent = None ):
252
+ def __init__ (self , gl : Gitlab , parent : Optional [ RESTObject ] = None ) -> None :
250
253
"""REST manager constructor.
251
254
252
255
Args:
@@ -259,23 +262,25 @@ def __init__(self, gl, parent=None):
259
262
self ._computed_path = self ._compute_path ()
260
263
261
264
@property
262
- def parent_attrs (self ):
265
+ def parent_attrs (self ) -> Optional [ Dict [ str , Any ]] :
263
266
return self ._parent_attrs
264
267
265
- def _compute_path (self , path = None ):
268
+ def _compute_path (self , path : Optional [ str ] = None ) -> Optional [ str ] :
266
269
self ._parent_attrs = {}
267
270
if path is None :
268
271
path = self ._path
272
+ if path is None :
273
+ return None
269
274
if self ._parent is None or not hasattr (self , "_from_parent_attrs" ):
270
275
return path
271
276
272
277
data = {
273
278
self_attr : getattr (self ._parent , parent_attr , None )
274
- for self_attr , parent_attr in self ._from_parent_attrs .items ()
279
+ for self_attr , parent_attr in self ._from_parent_attrs .items () # type: ignore
275
280
}
276
281
self ._parent_attrs = data
277
282
return path % data
278
283
279
284
@property
280
- def path (self ):
285
+ def path (self ) -> Optional [ str ] :
281
286
return self ._computed_path
0 commit comments