1616# along with this program. If not, see <http://www.gnu.org/licenses/>.
1717
1818import importlib
19+ from typing import Any ,Dict ,Optional
1920
21+ from .client import Gitlab ,GitlabList
2022
2123__all__ = [
2224"RESTObject" ,
@@ -38,7 +40,7 @@ class RESTObject(object):
3840
3941_id_attr = "id"
4042
41- def __init__ (self ,manager ,attrs ) :
43+ def __init__ (self ,manager : "RESTManager" ,attrs : Dict [ str , Any ]) -> None :
4244self .__dict__ .update (
4345 {
4446"manager" :manager ,
@@ -50,18 +52,18 @@ def __init__(self, manager, attrs):
5052self .__dict__ ["_parent_attrs" ]= self .manager .parent_attrs
5153self ._create_managers ()
5254
53- def __getstate__ (self ):
55+ def __getstate__ (self )-> Dict [ str , Any ] :
5456state = self .__dict__ .copy ()
5557module = state .pop ("_module" )
5658state ["_module_name" ]= module .__name__
5759return state
5860
59- def __setstate__ (self ,state ) :
61+ def __setstate__ (self ,state : Dict [ str , Any ]) -> None :
6062module_name = state .pop ("_module_name" )
6163self .__dict__ .update (state )
6264self .__dict__ ["_module" ]= importlib .import_module (module_name )
6365
64- def __getattr__ (self ,name ) :
66+ def __getattr__ (self ,name : str ) -> Any :
6567try :
6668return self .__dict__ ["_updated_attrs" ][name ]
6769except KeyError :
@@ -90,15 +92,15 @@ def __getattr__(self, name):
9092except KeyError :
9193raise AttributeError (name )
9294
93- def __setattr__ (self ,name ,value ):
95+ def __setattr__ (self ,name : str ,value )-> None :
9496self .__dict__ ["_updated_attrs" ][name ]= value
9597
96- def __str__ (self ):
98+ def __str__ (self )-> str :
9799data = self ._attrs .copy ()
98100data .update (self ._updated_attrs )
99101return "%s => %s" % (type (self ),data )
100102
101- def __repr__ (self ):
103+ def __repr__ (self )-> str :
102104if self ._id_attr :
103105return "<%s %s:%s>" % (
104106self .__class__ .__name__ ,
@@ -108,25 +110,25 @@ def __repr__(self):
108110else :
109111return "<%s>" % self .__class__ .__name__
110112
111- def __eq__ (self ,other ):
113+ def __eq__ (self ,other )-> bool :
112114if self .get_id ()and other .get_id ():
113115return self .get_id ()== other .get_id ()
114116return super (RESTObject ,self )== other
115117
116- def __ne__ (self ,other ):
118+ def __ne__ (self ,other )-> bool :
117119if self .get_id ()and other .get_id ():
118120return self .get_id ()!= other .get_id ()
119121return super (RESTObject ,self )!= other
120122
121123def __dir__ (self ):
122124return super (RESTObject ,self ).__dir__ ()+ list (self .attributes )
123125
124- def __hash__ (self ):
126+ def __hash__ (self )-> int :
125127if not self .get_id ():
126128return super (RESTObject ,self ).__hash__ ()
127129return hash (self .get_id ())
128130
129- def _create_managers (self ):
131+ def _create_managers (self )-> None :
130132managers = getattr (self ,"_managers" ,None )
131133if managers is None :
132134return
@@ -136,7 +138,7 @@ def _create_managers(self):
136138manager = cls (self .manager .gitlab ,parent = self )
137139self .__dict__ [attr ]= manager
138140
139- def _update_attrs (self ,new_attrs ):
141+ def _update_attrs (self ,new_attrs )-> None :
140142self .__dict__ ["_updated_attrs" ]= {}
141143self .__dict__ ["_attrs" ]= new_attrs
142144
@@ -147,7 +149,7 @@ def get_id(self):
147149return getattr (self ,self ._id_attr )
148150
149151@property
150- def attributes (self ):
152+ def attributes (self )-> Dict [ str , Any ] :
151153d = self .__dict__ ["_updated_attrs" ].copy ()
152154d .update (self .__dict__ ["_attrs" ])
153155d .update (self .__dict__ ["_parent_attrs" ])
@@ -169,7 +171,7 @@ class RESTObjectList(object):
169171 _list: A GitlabList object
170172 """
171173
172- def __init__ (self ,manager ,obj_cls ,_list ) :
174+ def __init__ (self ,manager : "RESTManager" ,obj_cls ,_list : GitlabList ) -> None :
173175"""Creates an objects list from a GitlabList.
174176
175177 You should not create objects of this type, but use managers list()
@@ -184,10 +186,10 @@ def __init__(self, manager, obj_cls, _list):
184186self ._obj_cls = obj_cls
185187self ._list = _list
186188
187- def __iter__ (self ):
189+ def __iter__ (self )-> "RESTObjectList" :
188190return self
189191
190- def __len__ (self ):
192+ def __len__ (self )-> int :
191193return len (self ._list )
192194
193195def __next__ (self ):
@@ -198,38 +200,38 @@ def next(self):
198200return self ._obj_cls (self .manager ,data )
199201
200202@property
201- def current_page (self ):
203+ def current_page (self )-> int :
202204"""The current page number."""
203205return self ._list .current_page
204206
205207@property
206- def prev_page (self ):
208+ def prev_page (self )-> int :
207209"""The previous page number.
208210
209211 If None, the current page is the first.
210212 """
211213return self ._list .prev_page
212214
213215@property
214- def next_page (self ):
216+ def next_page (self )-> int :
215217"""The next page number.
216218
217219 If None, the current page is the last.
218220 """
219221return self ._list .next_page
220222
221223@property
222- def per_page (self ):
224+ def per_page (self )-> int :
223225"""The number of items per page."""
224226return self ._list .per_page
225227
226228@property
227- def total_pages (self ):
229+ def total_pages (self )-> int :
228230"""The total number of pages."""
229231return self ._list .total_pages
230232
231233@property
232- def total (self ):
234+ def total (self )-> int :
233235"""The total number of items."""
234236return self ._list .total
235237
@@ -243,10 +245,11 @@ class RESTManager(object):
243245 ``_obj_cls``: The class of objects that will be created
244246 """
245247
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 ]= {}
248251
249- def __init__ (self ,gl ,parent = None ):
252+ def __init__ (self ,gl : Gitlab ,parent : Optional [ RESTObject ] = None )-> None :
250253"""REST manager constructor.
251254
252255 Args:
@@ -259,23 +262,25 @@ def __init__(self, gl, parent=None):
259262self ._computed_path = self ._compute_path ()
260263
261264@property
262- def parent_attrs (self ):
265+ def parent_attrs (self )-> Optional [ Dict [ str , Any ]] :
263266return self ._parent_attrs
264267
265- def _compute_path (self ,path = None ):
268+ def _compute_path (self ,path : Optional [ str ] = None )-> Optional [ str ] :
266269self ._parent_attrs = {}
267270if path is None :
268271path = self ._path
272+ if path is None :
273+ return None
269274if self ._parent is None or not hasattr (self ,"_from_parent_attrs" ):
270275return path
271276
272277data = {
273278self_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
275280 }
276281self ._parent_attrs = data
277282return path % data
278283
279284@property
280- def path (self ):
285+ def path (self )-> Optional [ str ] :
281286return self ._computed_path