| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 501f9a1 commit cb824a4
5 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -265,8 +265,17 @@ The generator exposes extra listing information as received from the server: | |||
| 265 | 265 | * ``prev_page``: if ``None`` the current page is the first one | |
| 266 | 266 | * ``next_page``: if ``None`` the current page is the last one | |
| 267 | 267 | * ``per_page``: number of items per page | |
| 268 | - * ``total_pages``: total number of pages available | ||
| 269 | - * ``total``: total number of items in the list | ||
| 268 | + * ``total_pages``: total number of pages available. This may be a ``None`` value. | ||
| 269 | + * ``total``: total number of items in the list. This may be a ``None`` value. | ||
| 270 | + | ||
| 271 | + .. note:: | ||
| 272 | + | ||
| 273 | + For performance reasons, if a query returns more than 10,000 records, GitLab | ||
| 274 | + does not return the ``total_pages`` or ``total`` headers. In this case, | ||
| 275 | + ``total_pages`` and ``total`` will have a value of ``None``. | ||
| 276 | + | ||
| 277 | + For more information see: | ||
| 278 | + https://docs.gitlab.com/ee/user/gitlab_com/index.html#pagination-response-headers | ||
| 270 | 279 | ||
| 271 | 280 | Sudo | |
| 272 | 281 | ==== | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -288,12 +288,12 @@ def per_page(self) -> int: | |||
| 288 | 288 | return self._list.per_page | |
| 289 | 289 | ||
| 290 | 290 | @property | |
| 291 | - def total_pages(self) -> int: | ||
| 291 | + def total_pages(self) -> Optional[int]: | ||
| 292 | 292 | """The total number of pages.""" | |
| 293 | 293 | return self._list.total_pages | |
| 294 | 294 | ||
| 295 | 295 | @property | |
| 296 | - def total(self) -> int: | ||
| 296 | + def total(self) -> Optional[int]: | ||
| 297 | 297 | """The total number of items.""" | |
| 298 | 298 | return self._list.total | |
| 299 | 299 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -917,14 +917,12 @@ def _query( | |||
| 917 | 917 | self._next_url = next_url | |
| 918 | 918 | except KeyError: | |
| 919 | 919 | self._next_url = None | |
| 920 | - self._current_page: Optional[Union[str, int]] = result.headers.get("X-Page") | ||
| 921 | - self._prev_page: Optional[Union[str, int]] = result.headers.get("X-Prev-Page") | ||
| 922 | - self._next_page: Optional[Union[str, int]] = result.headers.get("X-Next-Page") | ||
| 923 | - self._per_page: Optional[Union[str, int]] = result.headers.get("X-Per-Page") | ||
| 924 | - self._total_pages: Optional[Union[str, int]] = result.headers.get( | ||
| 925 | - "X-Total-Pages" | ||
| 926 | - ) | ||
| 927 | - self._total: Optional[Union[str, int]] = result.headers.get("X-Total") | ||
| 920 | + self._current_page: Optional[str] = result.headers.get("X-Page") | ||
| 921 | + self._prev_page: Optional[str] = result.headers.get("X-Prev-Page") | ||
| 922 | + self._next_page: Optional[str] = result.headers.get("X-Next-Page") | ||
| 923 | + self._per_page: Optional[str] = result.headers.get("X-Per-Page") | ||
| 924 | + self._total_pages: Optional[str] = result.headers.get("X-Total-Pages") | ||
| 925 | + self._total: Optional[str] = result.headers.get("X-Total") | ||
| 928 | 926 | ||
| 929 | 927 | try: | |
| 930 | 928 | self._data: List[Dict[str, Any]] = result.json() | |
@@ -965,19 +963,22 @@ def per_page(self) -> int: | |||
| 965 | 963 | assert self._per_page is not None | |
| 966 | 964 | return int(self._per_page) | |
| 967 | 965 | ||
| 966 | + # NOTE(jlvillal): When a query returns more than 10,000 items, GitLab doesn't return | ||
| 967 | + # the headers 'x-total-pages' and 'x-total'. In those cases we return None. | ||
| 968 | + # https://docs.gitlab.com/ee/user/gitlab_com/index.html#pagination-response-headers | ||
| 968 | 969 | @property | |
| 969 | - def total_pages(self) -> int: | ||
| 970 | + def total_pages(self) -> Optional[int]: | ||
| 970 | 971 | """The total number of pages.""" | |
| 971 | - if TYPE_CHECKING: | ||
| 972 | - assert self._total_pages is not None | ||
| 973 | - return int(self._total_pages) | ||
| 972 | + if self._total_pages is not None: | ||
| 973 | + return int(self._total_pages) | ||
| 974 | + return None | ||
| 974 | 975 | ||
| 975 | 976 | @property | |
| 976 | - def total(self) -> int: | ||
| 977 | + def total(self) -> Optional[int]: | ||
| 977 | 978 | """The total number of items.""" | |
| 978 | - if TYPE_CHECKING: | ||
| 979 | - assert self._total is not None | ||
| 980 | - return int(self._total) | ||
| 979 | + if self._total is not None: | ||
| 980 | + return int(self._total) | ||
| 981 | + return None | ||
| 981 | 982 | ||
| 982 | 983 | def __iter__(self) -> "GitlabList": | |
| 983 | 984 | return self | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -87,3 +87,6 @@ disable = [ | |||
| 87 | 87 | "useless-object-inheritance", | |
| 88 | 88 | ||
| 89 | 89 | ] | |
| 90 | + | ||
| 91 | + [tool.pytest.ini_options] | ||
| 92 | + xfail_strict = true | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -16,9 +16,9 @@ | |||
| 16 | 16 | # You should have received a copy of the GNU Lesser General Public License | |
| 17 | 17 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 18 | 18 | ||
| 19 | + import copy | ||
| 19 | 20 | import pickle | |
| 20 | 21 | import warnings | |
| 21 | - from copy import deepcopy | ||
| 22 | 22 | ||
| 23 | 23 | import pytest | |
| 24 | 24 | import responses | |
@@ -109,15 +109,14 @@ def _strip_pagination_headers(response): | |||
| 109 | 109 | """ | |
| 110 | 110 | https://docs.gitlab.com/ee/user/gitlab_com/index.html#pagination-response-headers | |
| 111 | 111 | """ | |
| 112 | - stripped = deepcopy(response) | ||
| 112 | + stripped = copy.deepcopy(response) | ||
| 113 | 113 | ||
| 114 | 114 | del stripped["headers"]["X-Total-Pages"] | |
| 115 | 115 | del stripped["headers"]["X-Total"] | |
| 116 | 116 | ||
| 117 | 117 | return stripped | |
| 118 | 118 | ||
| 119 | 119 | ||
| 120 | - @pytest.mark.xfail(reason="See #1686") | ||
| 121 | 120 | @responses.activate | |
| 122 | 121 | def test_gitlab_build_list_missing_headers(gl, resp_page_1, resp_page_2): | |
| 123 | 122 | stripped_page_1 = _strip_pagination_headers(resp_page_1) | |
| Back | FazBrowse Home | New Git URL |
0 commit comments