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 :
4244 self .__dict__ .update (
4345 {
4446 "manager" : manager ,
@@ -50,18 +52,18 @@ def __init__(self, manager, attrs):
5052 self .__dict__ ["_parent_attrs" ] = self .manager .parent_attrs
5153 self ._create_managers ()
5254
53- def __getstate__ (self ):
55+ def __getstate__ (self ) -> Dict [ str , Any ] :
5456 state = self .__dict__ .copy ()
5557 module = state .pop ("_module" )
5658 state ["_module_name" ] = module .__name__
5759 return state
5860
59- def __setstate__ (self , state ) :
61+ def __setstate__ (self , state : Dict [ str , Any ]) -> None :
6062 module_name = state .pop ("_module_name" )
6163 self .__dict__ .update (state )
6264 self .__dict__ ["_module" ] = importlib .import_module (module_name )
6365
64- def __getattr__ (self , name ) :
66+ def __getattr__ (self , name : str ) -> Any :
6567 try :
6668 return self .__dict__ ["_updated_attrs" ][name ]
6769 except KeyError :
@@ -90,15 +92,15 @@ def __getattr__(self, name):
9092 except KeyError :
9193 raise AttributeError (name )
9294
93- def __setattr__ (self , name , value ):
95+ def __setattr__ (self , name : str , value ) -> None :
9496 self .__dict__ ["_updated_attrs" ][name ] = value
9597
96- def __str__ (self ):
98+ def __str__ (self ) -> str :
9799 data = self ._attrs .copy ()
98100 data .update (self ._updated_attrs )
99101 return "%s => %s" % (type (self ), data )
100102
101- def __repr__ (self ):
103+ def __repr__ (self ) -> str :
102104 if self ._id_attr :
103105 return "<%s %s:%s>" % (
104106 self .__class__ .__name__ ,
@@ -108,25 +110,25 @@ def __repr__(self):
108110 else :
109111 return "<%s>" % self .__class__ .__name__
110112
111- def __eq__ (self , other ):
113+ def __eq__ (self , other ) -> bool :
112114 if self .get_id () and other .get_id ():
113115 return self .get_id () == other .get_id ()
114116 return super (RESTObject , self ) == other
115117
116- def __ne__ (self , other ):
118+ def __ne__ (self , other ) -> bool :
117119 if self .get_id () and other .get_id ():
118120 return self .get_id () != other .get_id ()
119121 return super (RESTObject , self ) != other
120122
121123 def __dir__ (self ):
122124 return super (RESTObject , self ).__dir__ () + list (self .attributes )
123125
124- def __hash__ (self ):
126+ def __hash__ (self ) -> int :
125127 if not self .get_id ():
126128 return super (RESTObject , self ).__hash__ ()
127129 return hash (self .get_id ())
128130
129- def _create_managers (self ):
131+ def _create_managers (self ) -> None :
130132 managers = getattr (self , "_managers" , None )
131133 if managers is None :
132134 return
@@ -136,7 +138,7 @@ def _create_managers(self):
136138 manager = cls (self .manager .gitlab , parent = self )
137139 self .__dict__ [attr ] = manager
138140
139- def _update_attrs (self , new_attrs ):
141+ def _update_attrs (self , new_attrs ) -> None :
140142 self .__dict__ ["_updated_attrs" ] = {}
141143 self .__dict__ ["_attrs" ] = new_attrs
142144
@@ -147,7 +149,7 @@ def get_id(self):
147149 return getattr (self , self ._id_attr )
148150
149151 @property
150- def attributes (self ):
152+ def attributes (self ) -> Dict [ str , Any ] :
151153 d = self .__dict__ ["_updated_attrs" ].copy ()
152154 d .update (self .__dict__ ["_attrs" ])
153155 d .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):
184186 self ._obj_cls = obj_cls
185187 self ._list = _list
186188
187- def __iter__ (self ):
189+ def __iter__ (self ) -> "RESTObjectList" :
188190 return self
189191
190- def __len__ (self ):
192+ def __len__ (self ) -> int :
191193 return len (self ._list )
192194
193195 def __next__ (self ):
@@ -198,38 +200,38 @@ def next(self):
198200 return 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."""
203205 return 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 """
211213 return 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 """
219221 return 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."""
224226 return self ._list .per_page
225227
226228 @property
227- def total_pages (self ):
229+ def total_pages (self ) -> int :
228230 """The total number of pages."""
229231 return self ._list .total_pages
230232
231233 @property
232- def total (self ):
234+ def total (self ) -> int :
233235 """The total number of items."""
234236 return 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):
259262 self ._computed_path = self ._compute_path ()
260263
261264 @property
262- def parent_attrs (self ):
265+ def parent_attrs (self ) -> Optional [ Dict [ str , Any ]] :
263266 return self ._parent_attrs
264267
265- def _compute_path (self , path = None ):
268+ def _compute_path (self , path : Optional [ str ] = None ) -> Optional [ str ] :
266269 self ._parent_attrs = {}
267270 if path is None :
268271 path = self ._path
272+ if path is None :
273+ return None
269274 if self ._parent is None or not hasattr (self , "_from_parent_attrs" ):
270275 return path
271276
272277 data = {
273278 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
275280 }
276281 self ._parent_attrs = data
277282 return path % data
278283
279284 @property
280- def path (self ):
285+ def path (self ) -> Optional [ str ] :
281286 return self ._computed_path
0 commit comments