| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent beb2f24 commit 6eee494
8 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -881,18 +881,16 @@ def http_list( | |||
| 881 | 881 | ||
| 882 | 882 | page = kwargs.get("page") | |
| 883 | 883 | ||
| 884 | - if iterator and page is not None: | ||
| 885 | - arg_used_message = f"iterator={iterator}" | ||
| 886 | - utils.warn( | ||
| 887 | - message=( | ||
| 888 | - f"`{arg_used_message}` and `page={page}` were both specified. " | ||
| 889 | - f"`{arg_used_message}` will be ignored and a `list` will be " | ||
| 890 | - f"returned." | ||
| 891 | - ), | ||
| 892 | - category=UserWarning, | ||
| 893 | - ) | ||
| 884 | + if iterator: | ||
| 885 | + if page is not None: | ||
| 886 | + utils.warn( | ||
| 887 | + message=( | ||
| 888 | + f"`{iterator=}` and `{page=}` were both specified. " | ||
| 889 | + f"`{page=}` will be ignored." | ||
| 890 | + ), | ||
| 891 | + category=UserWarning, | ||
| 892 | + ) | ||
| 894 | 893 | ||
| 895 | - if iterator and page is None: | ||
| 896 | 894 | # Generator requested | |
| 897 | 895 | return GitlabList(self, url, query_data, **kwargs) | |
| 898 | 896 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -161,9 +161,24 @@ def refresh(self, **kwargs: Any) -> None: | |||
| 161 | 161 | class ListMixin(HeadMixin[base.TObjCls]): | |
| 162 | 162 | _list_filters: tuple[str, ...] = () | |
| 163 | 163 | ||
| 164 | + @overload | ||
| 165 | + def list( | ||
| 166 | + self, *, iterator: Literal[False] = False, **kwargs: Any | ||
| 167 | + ) -> list[base.TObjCls]: ... | ||
| 168 | + | ||
| 169 | + @overload | ||
| 170 | + def list( | ||
| 171 | + self, *, iterator: Literal[True] = True, **kwargs: Any | ||
| 172 | + ) -> base.RESTObjectList[base.TObjCls]: ... | ||
| 173 | + | ||
| 174 | + @overload | ||
| 175 | + def list( | ||
| 176 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 177 | + ) -> base.RESTObjectList[base.TObjCls] | list[base.TObjCls]: ... | ||
| 178 | + | ||
| 164 | 179 | @exc.on_http_error(exc.GitlabListError) | |
| 165 | 180 | def list( | |
| 166 | - self, **kwargs: Any | ||
| 181 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 167 | 182 | ) -> base.RESTObjectList[base.TObjCls] | list[base.TObjCls]: | |
| 168 | 183 | """Retrieve a list of objects. | |
| 169 | 184 | ||
@@ -203,7 +218,7 @@ def list( | |||
| 203 | 218 | # Allow to overwrite the path, handy for custom listings | |
| 204 | 219 | path = data.pop("path", self.path) | |
| 205 | 220 | ||
| 206 | - obj = self.gitlab.http_list(path, **data) | ||
| 221 | + obj = self.gitlab.http_list(path, iterator=iterator, **data) | ||
| 207 | 222 | if isinstance(obj, list): | |
| 208 | 223 | return [self._obj_cls(self, item, created_from_list=True) for item in obj] | |
| 209 | 224 | return base.RESTObjectList(self, self._obj_cls, obj) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -133,12 +133,7 @@ def do_create(self) -> gitlab.base.RESTObject: | |||
| 133 | 133 | cli.die("Impossible to create object", e) | |
| 134 | 134 | return result | |
| 135 | 135 | ||
| 136 | - def do_list( | ||
| 137 | - self, | ||
| 138 | - ) -> ( | ||
| 139 | - gitlab.base.RESTObjectList[gitlab.base.RESTObject] | ||
| 140 | - | list[gitlab.base.RESTObject] | ||
| 141 | - ): | ||
| 136 | + def do_list(self) -> list[gitlab.base.RESTObject]: | ||
| 142 | 137 | if TYPE_CHECKING: | |
| 143 | 138 | assert isinstance(self.mgr, gitlab.mixins.ListMixin) | |
| 144 | 139 | message_details = gitlab.utils.WarnMessageData( | |
@@ -150,7 +145,9 @@ def do_list( | |||
| 150 | 145 | ) | |
| 151 | 146 | ||
| 152 | 147 | try: | |
| 153 | - result = self.mgr.list(**self.args, message_details=message_details) | ||
| 148 | + result = self.mgr.list( | ||
| 149 | + **self.args, message_details=message_details, iterator=False | ||
| 150 | + ) | ||
| 154 | 151 | except Exception as e: # pragma: no cover, cli.die is unit-tested | |
| 155 | 152 | cli.die("Impossible to list objects", e) | |
| 156 | 153 | return result | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,6 +1,6 @@ | |||
| 1 | 1 | from __future__ import annotations | |
| 2 | 2 | ||
| 3 | - from typing import Any | ||
| 3 | + from typing import Any, Literal, overload | ||
| 4 | 4 | ||
| 5 | 5 | from gitlab import exceptions as exc | |
| 6 | 6 | from gitlab.base import RESTManager, RESTObject, RESTObjectList | |
@@ -17,8 +17,25 @@ class LDAPGroupManager(RESTManager[LDAPGroup]): | |||
| 17 | 17 | _obj_cls = LDAPGroup | |
| 18 | 18 | _list_filters = ("search", "provider") | |
| 19 | 19 | ||
| 20 | + @overload | ||
| 21 | + def list( | ||
| 22 | + self, *, iterator: Literal[False] = False, **kwargs: Any | ||
| 23 | + ) -> list[LDAPGroup]: ... | ||
| 24 | + | ||
| 25 | + @overload | ||
| 26 | + def list( | ||
| 27 | + self, *, iterator: Literal[True] = True, **kwargs: Any | ||
| 28 | + ) -> RESTObjectList[LDAPGroup]: ... | ||
| 29 | + | ||
| 30 | + @overload | ||
| 31 | + def list( | ||
| 32 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 33 | + ) -> list[LDAPGroup] | RESTObjectList[LDAPGroup]: ... | ||
| 34 | + | ||
| 20 | 35 | @exc.on_http_error(exc.GitlabListError) | |
| 21 | - def list(self, **kwargs: Any) -> list[LDAPGroup] | RESTObjectList[LDAPGroup]: | ||
| 36 | + def list( | ||
| 37 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 38 | + ) -> list[LDAPGroup] | RESTObjectList[LDAPGroup]: | ||
| 22 | 39 | """Retrieve a list of objects. | |
| 23 | 40 | ||
| 24 | 41 | Args: | |
@@ -45,7 +62,7 @@ def list(self, **kwargs: Any) -> list[LDAPGroup] | RESTObjectList[LDAPGroup]: | |||
| 45 | 62 | else: | |
| 46 | 63 | path = self._path | |
| 47 | 64 | ||
| 48 | - obj = self.gitlab.http_list(path, **data) | ||
| 65 | + obj = self.gitlab.http_list(path, iterator=iterator, **data) | ||
| 49 | 66 | if isinstance(obj, list): | |
| 50 | 67 | return [self._obj_cls(self, item) for item in obj] | |
| 51 | 68 | return RESTObjectList(self, self._obj_cls, obj) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -108,8 +108,25 @@ class SnippetManager(CRUDMixin[Snippet]): | |||
| 108 | 108 | optional=("title", "files", "file_name", "content", "visibility", "description") | |
| 109 | 109 | ) | |
| 110 | 110 | ||
| 111 | + @overload | ||
| 112 | + def list_public( | ||
| 113 | + self, *, iterator: Literal[False] = False, **kwargs: Any | ||
| 114 | + ) -> list[Snippet]: ... | ||
| 115 | + | ||
| 116 | + @overload | ||
| 117 | + def list_public( | ||
| 118 | + self, *, iterator: Literal[True] = True, **kwargs: Any | ||
| 119 | + ) -> RESTObjectList[Snippet]: ... | ||
| 120 | + | ||
| 121 | + @overload | ||
| 122 | + def list_public( | ||
| 123 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 124 | + ) -> RESTObjectList[Snippet] | list[Snippet]: ... | ||
| 125 | + | ||
| 111 | 126 | @cli.register_custom_action(cls_names="SnippetManager") | |
| 112 | - def list_public(self, **kwargs: Any) -> RESTObjectList[Snippet] | list[Snippet]: | ||
| 127 | + def list_public( | ||
| 128 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 129 | + ) -> RESTObjectList[Snippet] | list[Snippet]: | ||
| 113 | 130 | """List all public snippets. | |
| 114 | 131 | ||
| 115 | 132 | Args: | |
@@ -126,10 +143,27 @@ def list_public(self, **kwargs: Any) -> RESTObjectList[Snippet] | list[Snippet]: | |||
| 126 | 143 | Returns: | |
| 127 | 144 | The list of snippets, or a generator if `iterator` is True | |
| 128 | 145 | """ | |
| 129 | - return self.list(path="/snippets/public", **kwargs) | ||
| 146 | + return self.list(path="/snippets/public", iterator=iterator, **kwargs) | ||
| 147 | + | ||
| 148 | + @overload | ||
| 149 | + def list_all( | ||
| 150 | + self, *, iterator: Literal[False] = False, **kwargs: Any | ||
| 151 | + ) -> list[Snippet]: ... | ||
| 152 | + | ||
| 153 | + @overload | ||
| 154 | + def list_all( | ||
| 155 | + self, *, iterator: Literal[True] = True, **kwargs: Any | ||
| 156 | + ) -> RESTObjectList[Snippet]: ... | ||
| 157 | + | ||
| 158 | + @overload | ||
| 159 | + def list_all( | ||
| 160 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 161 | + ) -> RESTObjectList[Snippet] | list[Snippet]: ... | ||
| 130 | 162 | ||
| 131 | 163 | @cli.register_custom_action(cls_names="SnippetManager") | |
| 132 | - def list_all(self, **kwargs: Any) -> RESTObjectList[Snippet] | list[Snippet]: | ||
| 164 | + def list_all( | ||
| 165 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 166 | + ) -> RESTObjectList[Snippet] | list[Snippet]: | ||
| 133 | 167 | """List all snippets. | |
| 134 | 168 | ||
| 135 | 169 | Args: | |
@@ -146,9 +180,30 @@ def list_all(self, **kwargs: Any) -> RESTObjectList[Snippet] | list[Snippet]: | |||
| 146 | 180 | Returns: | |
| 147 | 181 | A generator for the snippets list | |
| 148 | 182 | """ | |
| 149 | - return self.list(path="/snippets/all", **kwargs) | ||
| 183 | + return self.list(path="/snippets/all", iterator=iterator, **kwargs) | ||
| 184 | + | ||
| 185 | + @overload | ||
| 186 | + def public( | ||
| 187 | + self, | ||
| 188 | + *, | ||
| 189 | + iterator: Literal[False] = False, | ||
| 190 | + page: int | None = None, | ||
| 191 | + **kwargs: Any, | ||
| 192 | + ) -> list[Snippet]: ... | ||
| 193 | + | ||
| 194 | + @overload | ||
| 195 | + def public( | ||
| 196 | + self, *, iterator: Literal[True] = True, **kwargs: Any | ||
| 197 | + ) -> RESTObjectList[Snippet]: ... | ||
| 198 | + | ||
| 199 | + @overload | ||
| 200 | + def public( | ||
| 201 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 202 | + ) -> RESTObjectList[Snippet] | list[Snippet]: ... | ||
| 150 | 203 | ||
| 151 | - def public(self, **kwargs: Any) -> RESTObjectList[Snippet] | list[Snippet]: | ||
| 204 | + def public( | ||
| 205 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 206 | + ) -> RESTObjectList[Snippet] | list[Snippet]: | ||
| 152 | 207 | """List all public snippets. | |
| 153 | 208 | ||
| 154 | 209 | Args: | |
@@ -172,7 +227,7 @@ def public(self, **kwargs: Any) -> RESTObjectList[Snippet] | list[Snippet]: | |||
| 172 | 227 | ), | |
| 173 | 228 | category=DeprecationWarning, | |
| 174 | 229 | ) | |
| 175 | - return self.list(path="/snippets/public", **kwargs) | ||
| 230 | + return self.list(path="/snippets/public", iterator=iterator, **kwargs) | ||
| 176 | 231 | ||
| 177 | 232 | ||
| 178 | 233 | class ProjectSnippet(UserAgentDetailMixin, SaveMixin, ObjectDeleteMixin, RESTObject): | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6,7 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | 7 | from __future__ import annotations | |
| 8 | 8 | ||
| 9 | - from typing import Any, cast, Optional | ||
| 9 | + from typing import Any, cast, Literal, Optional, overload | ||
| 10 | 10 | ||
| 11 | 11 | import requests | |
| 12 | 12 | ||
@@ -623,7 +623,24 @@ class UserProjectManager(ListMixin[UserProject], CreateMixin[UserProject]): | |||
| 623 | 623 | "id_before", | |
| 624 | 624 | ) | |
| 625 | 625 | ||
| 626 | - def list(self, **kwargs: Any) -> RESTObjectList[UserProject] | list[UserProject]: | ||
| 626 | + @overload | ||
| 627 | + def list( | ||
| 628 | + self, *, iterator: Literal[False] = False, **kwargs: Any | ||
| 629 | + ) -> list[UserProject]: ... | ||
| 630 | + | ||
| 631 | + @overload | ||
| 632 | + def list( | ||
| 633 | + self, *, iterator: Literal[True] = True, **kwargs: Any | ||
| 634 | + ) -> RESTObjectList[UserProject]: ... | ||
| 635 | + | ||
| 636 | + @overload | ||
| 637 | + def list( | ||
| 638 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 639 | + ) -> RESTObjectList[UserProject] | list[UserProject]: ... | ||
| 640 | + | ||
| 641 | + def list( | ||
| 642 | + self, *, iterator: bool = False, **kwargs: Any | ||
| 643 | + ) -> RESTObjectList[UserProject] | list[UserProject]: | ||
| 627 | 644 | """Retrieve a list of objects. | |
| 628 | 645 | ||
| 629 | 646 | Args: | |
@@ -645,7 +662,7 @@ def list(self, **kwargs: Any) -> RESTObjectList[UserProject] | list[UserProject] | |||
| 645 | 662 | path = f"/users/{self._parent.id}/projects" | |
| 646 | 663 | else: | |
| 647 | 664 | path = f"/users/{self._from_parent_attrs['user_id']}/projects" | |
| 648 | - return super().list(path=path, **kwargs) | ||
| 665 | + return super().list(path=path, iterator=iterator, **kwargs) | ||
| 649 | 666 | ||
| 650 | 667 | ||
| 651 | 668 | class StarredProject(RESTObject): | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -177,7 +177,7 @@ def test_merge_request_reset_approvals(gitlab_url, project): | |||
| 177 | 177 | # Pause to let GL catch up (happens on hosted too, sometimes takes a while for server to be ready to merge) | |
| 178 | 178 | time.sleep(5) | |
| 179 | 179 | ||
| 180 | - mr = bot_project.mergerequests.list()[0] # type: ignore[index] | ||
| 180 | + mr = bot_project.mergerequests.list()[0] | ||
| 181 | 181 | ||
| 182 | 182 | assert mr.reset_approvals() | |
| 183 | 183 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -567,8 +567,8 @@ def test_list_request_page_and_iterator(gl): | |||
| 567 | 567 | UserWarning, match="`iterator=True` and `page=1` were both specified" | |
| 568 | 568 | ): | |
| 569 | 569 | result = gl.http_list("/projects", iterator=True, page=1) | |
| 570 | - assert isinstance(result, list) | ||
| 571 | - assert len(result) == 20 | ||
| 570 | + assert isinstance(result, GitlabList) | ||
| 571 | + assert len(list(result)) == 20 | ||
| 572 | 572 | assert len(responses.calls) == 1 | |
| 573 | 573 | ||
| 574 | 574 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments