Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit de3a1b6

Browse files
committed
Previous patch
1 parent ae7d3b0 commit de3a1b6

File tree

7 files changed

+57
-49
lines changed

7 files changed

+57
-49
lines changed

gitlab/base.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import pprint
2020
import textwrap
2121
from types import ModuleType
22-
from typing import Any, Dict, Iterable, Optional, Type, Union
22+
from typing import Any, Dict, Generic, Iterable, Iterator, Optional, Collection, Type, TypeVar, Union
2323

2424
import gitlab
2525
from gitlab import types as g_types
@@ -245,8 +245,9 @@ def attributes(self) -> Dict[str, Any]:
245245
d.update(self.__dict__["_parent_attrs"])
246246
return d
247247

248+
T = TypeVar("T", bound=RESTObject)
248249

249-
class RESTObjectList:
250+
class RESTObjectList(Generic[T], Iterable[T]):
250251
"""Generator object representing a list of RESTObject's.
251252
252253
This generator uses the Gitlab pagination system to fetch new data when
@@ -262,7 +263,7 @@ class RESTObjectList:
262263
"""
263264

264265
def __init__(
265-
self, manager: "RESTManager", obj_cls: Type[RESTObject], _list: GitlabList
266+
self, manager: "RESTManager", obj_cls: Type[T], _list: GitlabList
266267
) -> None:
267268
"""Creates an objects list from a GitlabList.
268269
@@ -278,16 +279,16 @@ def __init__(
278279
self._obj_cls = obj_cls
279280
self._list = _list
280281

281-
def __iter__(self) -> "RESTObjectList":
282+
def __iter__(self) -> Iterator[T]:
282283
return self
283284

284285
def __len__(self) -> int:
285286
return len(self._list)
286287

287-
def __next__(self) -> RESTObject:
288+
def __next__(self) -> T:
288289
return self.next()
289290

290-
def next(self) -> RESTObject:
291+
def next(self) -> T:
291292
data = self._list.next()
292293
return self._obj_cls(self.manager, data, created_from_list=True)
293294

gitlab/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ def http_list(
815815
as_list: Optional[bool] = None, # Deprecated in favor of `iterator`
816816
iterator: Optional[bool] = None,
817817
**kwargs: Any,
818-
) -> Union["GitlabList", List[Dict[str, Any]]]:
818+
) -> Union[GitlabList, List[Dict[str, int]]]:
819819
"""Make a GET request to the Gitlab server for list-oriented queries.
820820
821821
Args:

gitlab/mixins.py

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020
Any,
2121
Callable,
2222
Dict,
23+
Generic,
2324
List,
2425
Optional,
26+
Iterable,
2527
Tuple,
2628
Type,
29+
TypeVar,
2730
TYPE_CHECKING,
2831
Union,
2932
)
@@ -67,21 +70,24 @@
6770
_RestManagerBase = object
6871
_RestObjectBase = object
6972

73+
T1 = TypeVar("T1", bound=base.RESTObject)
74+
T2 = TypeVar("T2", bound=base.RESTObject)
7075

71-
class GetMixin(_RestManagerBase):
76+
77+
class GetMixin(_RestManagerBase, Generic[T1, T2]):
7278
_computed_path: Optional[str]
7379
_from_parent_attrs: Dict[str, Any]
74-
_obj_cls: Optional[Type[base.RESTObject]]
80+
_obj_cls: Type[T1]
7581
_optional_get_attrs: Tuple[str, ...] = ()
76-
_parent: Optional[base.RESTObject]
82+
_parent: Optional[T2]
7783
_parent_attrs: Dict[str, Any]
7884
_path: Optional[str]
7985
gitlab: gitlab.Gitlab
8086

8187
@exc.on_http_error(exc.GitlabGetError)
8288
def get(
8389
self, id: Union[str, int], lazy: bool = False, **kwargs: Any
84-
) -> base.RESTObject:
90+
) -> T1:
8591
"""Retrieve a single object.
8692
8793
Args:
@@ -113,12 +119,12 @@ def get(
113119
return self._obj_cls(self, server_data)
114120

115121

116-
class GetWithoutIdMixin(_RestManagerBase):
122+
class GetWithoutIdMixin(_RestManagerBase, Generic[T1, T2]):
117123
_computed_path: Optional[str]
118124
_from_parent_attrs: Dict[str, Any]
119-
_obj_cls: Optional[Type[base.RESTObject]]
125+
_obj_cls: Type[T1]
120126
_optional_get_attrs: Tuple[str, ...] = ()
121-
_parent: Optional[base.RESTObject]
127+
_parent: Optional[T2]
122128
_parent_attrs: Dict[str, Any]
123129
_path: Optional[str]
124130
gitlab: gitlab.Gitlab
@@ -181,18 +187,18 @@ def refresh(self, **kwargs: Any) -> None:
181187
self._update_attrs(server_data)
182188

183189

184-
class ListMixin(_RestManagerBase):
190+
class ListMixin(_RestManagerBase, Generic[T1, T2]):
185191
_computed_path: Optional[str]
186192
_from_parent_attrs: Dict[str, Any]
187193
_list_filters: Tuple[str, ...] = ()
188-
_obj_cls: Optional[Type[base.RESTObject]]
189-
_parent: Optional[base.RESTObject]
194+
_obj_cls: Type[T1]
195+
_parent: Optional[T2]
190196
_parent_attrs: Dict[str, Any]
191197
_path: Optional[str]
192198
gitlab: gitlab.Gitlab
193199

194200
@exc.on_http_error(exc.GitlabListError)
195-
def list(self, **kwargs: Any) -> Union[base.RESTObjectList, List[base.RESTObject]]:
201+
def list(self, **kwargs: Any) -> Iterable[T1]:
196202
"""Retrieve a list of objects.
197203
198204
Args:
@@ -234,21 +240,21 @@ def list(self, **kwargs: Any) -> Union[base.RESTObjectList, List[base.RESTObject
234240
return base.RESTObjectList(self, self._obj_cls, obj)
235241

236242

237-
class RetrieveMixin(ListMixin, GetMixin):
243+
class RetrieveMixin(ListMixin, GetMixin, Generic[T1, T2]):
238244
_computed_path: Optional[str]
239245
_from_parent_attrs: Dict[str, Any]
240-
_obj_cls: Optional[Type[base.RESTObject]]
241-
_parent: Optional[base.RESTObject]
246+
_obj_cls: Type[T1]
247+
_parent: Optional[T2]
242248
_parent_attrs: Dict[str, Any]
243249
_path: Optional[str]
244250
gitlab: gitlab.Gitlab
245251

246252

247-
class CreateMixin(_RestManagerBase):
253+
class CreateMixin(_RestManagerBase, Generic[T1, T2]):
248254
_computed_path: Optional[str]
249255
_from_parent_attrs: Dict[str, Any]
250-
_obj_cls: Optional[Type[base.RESTObject]]
251-
_parent: Optional[base.RESTObject]
256+
_obj_cls: Type[T1]
257+
_parent: Optional[T2]
252258
_parent_attrs: Dict[str, Any]
253259
_path: Optional[str]
254260
gitlab: gitlab.Gitlab
@@ -287,11 +293,11 @@ def create(
287293
return self._obj_cls(self, server_data)
288294

289295

290-
class UpdateMixin(_RestManagerBase):
296+
class UpdateMixin(_RestManagerBase, Generic[T1, T2]):
291297
_computed_path: Optional[str]
292298
_from_parent_attrs: Dict[str, Any]
293-
_obj_cls: Optional[Type[base.RESTObject]]
294-
_parent: Optional[base.RESTObject]
299+
_obj_cls: Type[T1]
300+
_parent: Optional[T2]
295301
_parent_attrs: Dict[str, Any]
296302
_path: Optional[str]
297303
_update_uses_post: bool = False
@@ -352,11 +358,11 @@ def update(
352358
return result
353359

354360

355-
class SetMixin(_RestManagerBase):
361+
class SetMixin(_RestManagerBase, Generic[T1, T2]):
356362
_computed_path: Optional[str]
357363
_from_parent_attrs: Dict[str, Any]
358-
_obj_cls: Optional[Type[base.RESTObject]]
359-
_parent: Optional[base.RESTObject]
364+
_obj_cls: Type[T1]
365+
_parent: Optional[T2]
360366
_parent_attrs: Dict[str, Any]
361367
_path: Optional[str]
362368
gitlab: gitlab.Gitlab
@@ -386,11 +392,11 @@ def set(self, key: str, value: str, **kwargs: Any) -> base.RESTObject:
386392
return self._obj_cls(self, server_data)
387393

388394

389-
class DeleteMixin(_RestManagerBase):
395+
class DeleteMixin(_RestManagerBase, Generic[T1, T2]):
390396
_computed_path: Optional[str]
391397
_from_parent_attrs: Dict[str, Any]
392-
_obj_cls: Optional[Type[base.RESTObject]]
393-
_parent: Optional[base.RESTObject]
398+
_obj_cls: Type[T1]
399+
_parent: Optional[T2]
394400
_parent_attrs: Dict[str, Any]
395401
_path: Optional[str]
396402
gitlab: gitlab.Gitlab
@@ -417,21 +423,21 @@ def delete(self, id: Optional[Union[str, int]] = None, **kwargs: Any) -> None:
417423
self.gitlab.http_delete(path, **kwargs)
418424

419425

420-
class CRUDMixin(GetMixin, ListMixin, CreateMixin, UpdateMixin, DeleteMixin):
426+
class CRUDMixin(GetMixin, ListMixin, CreateMixin, UpdateMixin, DeleteMixin, Generic[T1, T2]):
421427
_computed_path: Optional[str]
422428
_from_parent_attrs: Dict[str, Any]
423-
_obj_cls: Optional[Type[base.RESTObject]]
424-
_parent: Optional[base.RESTObject]
429+
_obj_cls: Type[T1]
430+
_parent: Optional[T2]
425431
_parent_attrs: Dict[str, Any]
426432
_path: Optional[str]
427433
gitlab: gitlab.Gitlab
428434

429435

430-
class NoUpdateMixin(GetMixin, ListMixin, CreateMixin, DeleteMixin):
436+
class NoUpdateMixin(GetMixin, ListMixin, CreateMixin, DeleteMixin, Generic[T1, T2]):
431437
_computed_path: Optional[str]
432438
_from_parent_attrs: Dict[str, Any]
433-
_obj_cls: Optional[Type[base.RESTObject]]
434-
_parent: Optional[base.RESTObject]
439+
_obj_cls: Type[T1]
440+
_parent: T2
435441
_parent_attrs: Dict[str, Any]
436442
_path: Optional[str]
437443
gitlab: gitlab.Gitlab

gitlab/v4/cli.py

100644100755
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import argparse
2020
import operator
2121
import sys
22-
from typing import Any, Dict, List, Optional, Type, TYPE_CHECKING, Union
22+
from typing import Any, Dict, Iterable, List, Optional, Type, TYPE_CHECKING, Union
2323

2424
import gitlab
2525
import gitlab.base
@@ -143,7 +143,7 @@ def do_create(self) -> gitlab.base.RESTObject:
143143

144144
def do_list(
145145
self,
146-
) -> Union[gitlab.base.RESTObjectList, List[gitlab.base.RESTObject]]:
146+
) -> Iterable[gitlab.base.RESTObjectList]:
147147
if TYPE_CHECKING:
148148
assert isinstance(self.mgr, gitlab.mixins.ListMixin)
149149
try:

gitlab/v4/objects/milestones.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from gitlab import cli
44
from gitlab import exceptions as exc
55
from gitlab import types
6+
from gitlab.client import GitlabList
67
from gitlab.base import RESTManager, RESTObject, RESTObjectList
78
from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, PromoteMixin, SaveMixin
89
from gitlab.types import RequiredOptional
@@ -47,7 +48,7 @@ def issues(self, **kwargs: Any) -> RESTObjectList:
4748
path = f"{self.manager.path}/{self.encoded_id}/issues"
4849
data_list = self.manager.gitlab.http_list(path, iterator=True, **kwargs)
4950
if TYPE_CHECKING:
50-
assert isinstance(data_list, RESTObjectList)
51+
assert isinstance(data_list, GitlabList)
5152
manager = GroupIssueManager(self.manager.gitlab, parent=self.manager._parent)
5253
# FIXME(gpocentek): the computed manager path is not correct
5354
return RESTObjectList(manager, GroupIssue, data_list)
@@ -73,7 +74,7 @@ def merge_requests(self, **kwargs: Any) -> RESTObjectList:
7374
path = f"{self.manager.path}/{self.encoded_id}/merge_requests"
7475
data_list = self.manager.gitlab.http_list(path, iterator=True, **kwargs)
7576
if TYPE_CHECKING:
76-
assert isinstance(data_list, RESTObjectList)
77+
assert isinstance(data_list, GitlabList)
7778
manager = GroupIssueManager(self.manager.gitlab, parent=self.manager._parent)
7879
# FIXME(gpocentek): the computed manager path is not correct
7980
return RESTObjectList(manager, GroupMergeRequest, data_list)
@@ -124,7 +125,7 @@ def issues(self, **kwargs: Any) -> RESTObjectList:
124125
path = f"{self.manager.path}/{self.encoded_id}/issues"
125126
data_list = self.manager.gitlab.http_list(path, iterator=True, **kwargs)
126127
if TYPE_CHECKING:
127-
assert isinstance(data_list, RESTObjectList)
128+
assert isinstance(data_list, GitlabList)
128129
manager = ProjectIssueManager(self.manager.gitlab, parent=self.manager._parent)
129130
# FIXME(gpocentek): the computed manager path is not correct
130131
return RESTObjectList(manager, ProjectIssue, data_list)
@@ -150,7 +151,7 @@ def merge_requests(self, **kwargs: Any) -> RESTObjectList:
150151
path = f"{self.manager.path}/{self.encoded_id}/merge_requests"
151152
data_list = self.manager.gitlab.http_list(path, iterator=True, **kwargs)
152153
if TYPE_CHECKING:
153-
assert isinstance(data_list, RESTObjectList)
154+
assert isinstance(data_list, GitlabList)
154155
manager = ProjectMergeRequestManager(
155156
self.manager.gitlab, parent=self.manager._parent
156157
)

gitlab/v4/objects/snippets.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any, Callable, cast, List, Optional, TYPE_CHECKING, Union
1+
from typing import Any, Callable, cast, Iterable, List, Optional, TYPE_CHECKING, Union
22

33
import requests
44

@@ -71,7 +71,7 @@ class SnippetManager(CRUDMixin, RESTManager):
7171
)
7272

7373
@cli.register_custom_action("SnippetManager")
74-
def public(self, **kwargs: Any) -> Union[RESTObjectList, List[RESTObject]]:
74+
def public(self, **kwargs: Any) -> Iterable[Snippet]:
7575
"""List all the public snippets.
7676
7777
Args:

gitlab/v4/objects/users.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
https://docs.gitlab.com/ee/api/users.html
44
https://docs.gitlab.com/ee/api/projects.html#list-projects-starred-by-a-user
55
"""
6-
from typing import Any, cast, Dict, List, Optional, Union
6+
from typing import Any, cast, Dict, Iterable, List, Optional, Union
77

88
import requests
99

@@ -532,7 +532,7 @@ class UserProjectManager(ListMixin, CreateMixin, RESTManager):
532532
"id_before",
533533
)
534534

535-
def list(self, **kwargs: Any) -> Union[RESTObjectList, List[RESTObject]]:
535+
def list(self, **kwargs: Any) -> Iterable[UserProject]:
536536
"""Retrieve a list of objects.
537537
538538
Args:

0 commit comments

Comments
 (0)