diff options
author | John L. Villalovos <john@sodarock.com> | 2021-12-30 12:34:50 -0800 |
---|---|---|
committer | John L. Villalovos <john@sodarock.com> | 2021-12-30 12:34:50 -0800 |
commit | cb824a49af9b0d155b89fe66a4cfebefe52beb7a (patch) | |
tree | e2227ebe783649de4c4b8a1b45ac4a9bc9e18a6a /gitlab/client.py | |
parent | 501f9a1588db90e6d2c235723ba62c09a669b5d2 (diff) | |
download | gitlab-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.py | 33 |
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 |