summaryrefslogtreecommitdiff
path: root/gitlab/client.py
diff options
context:
space:
mode:
authorJohn L. Villalovos <john@sodarock.com>2021-12-30 12:34:50 -0800
committerJohn L. Villalovos <john@sodarock.com>2021-12-30 12:34:50 -0800
commitcb824a49af9b0d155b89fe66a4cfebefe52beb7a (patch)
treee2227ebe783649de4c4b8a1b45ac4a9bc9e18a6a /gitlab/client.py
parent501f9a1588db90e6d2c235723ba62c09a669b5d2 (diff)
downloadgitlab-jlvillal/pagination.tar.gz
fix: handle situation where GitLab does not return valuesjlvillal/pagination
If a query returns more than 10,000 records than the following values are NOT returned: x.total_pages x.total Modify the code to allow no value to be set for these values. If there is not a value returned the functions will now return None. Update unit test so no longer `xfail` https://docs.gitlab.com/ee/user/gitlab_com/index.html#pagination-response-headers Closes #1686
Diffstat (limited to 'gitlab/client.py')
-rw-r--r--gitlab/client.py33
1 files changed, 17 insertions, 16 deletions
diff --git a/gitlab/client.py b/gitlab/client.py
index 84fd40f..c1e0825 100644
--- a/gitlab/client.py
+++ b/gitlab/client.py
@@ -917,14 +917,12 @@ class GitlabList(object):
self._next_url = next_url
except KeyError:
self._next_url = None
- self._current_page: Optional[Union[str, int]] = result.headers.get("X-Page")
- self._prev_page: Optional[Union[str, int]] = result.headers.get("X-Prev-Page")
- self._next_page: Optional[Union[str, int]] = result.headers.get("X-Next-Page")
- self._per_page: Optional[Union[str, int]] = result.headers.get("X-Per-Page")
- self._total_pages: Optional[Union[str, int]] = result.headers.get(
- "X-Total-Pages"
- )
- self._total: Optional[Union[str, int]] = result.headers.get("X-Total")
+ self._current_page: Optional[str] = result.headers.get("X-Page")
+ self._prev_page: Optional[str] = result.headers.get("X-Prev-Page")
+ self._next_page: Optional[str] = result.headers.get("X-Next-Page")
+ self._per_page: Optional[str] = result.headers.get("X-Per-Page")
+ self._total_pages: Optional[str] = result.headers.get("X-Total-Pages")
+ self._total: Optional[str] = result.headers.get("X-Total")
try:
self._data: List[Dict[str, Any]] = result.json()
@@ -965,19 +963,22 @@ class GitlabList(object):
assert self._per_page is not None
return int(self._per_page)
+ # NOTE(jlvillal): When a query returns more than 10,000 items, GitLab doesn't return
+ # the headers 'x-total-pages' and 'x-total'. In those cases we return None.
+ # https://docs.gitlab.com/ee/user/gitlab_com/index.html#pagination-response-headers
@property
- def total_pages(self) -> int:
+ def total_pages(self) -> Optional[int]:
"""The total number of pages."""
- if TYPE_CHECKING:
- assert self._total_pages is not None
- return int(self._total_pages)
+ if self._total_pages is not None:
+ return int(self._total_pages)
+ return None
@property
- def total(self) -> int:
+ def total(self) -> Optional[int]:
"""The total number of items."""
- if TYPE_CHECKING:
- assert self._total is not None
- return int(self._total)
+ if self._total is not None:
+ return int(self._total)
+ return None
def __iter__(self) -> "GitlabList":
return self