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