summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/api-usage.rst12
-rw-r--r--gitlab/__init__.py4
-rw-r--r--gitlab/config.py6
-rw-r--r--gitlab/mixins.py4
4 files changed, 26 insertions, 0 deletions
diff --git a/docs/api-usage.rst b/docs/api-usage.rst
index d211e25..5b1bd93 100644
--- a/docs/api-usage.rst
+++ b/docs/api-usage.rst
@@ -219,6 +219,18 @@ You can define the ``per_page`` value globally to avoid passing it to every
gl = gitlab.Gitlab(url, token, per_page=50)
+Gitlab allows to also use keyset pagination. You can supply it to your project listing,
+but you can also do so globally. Be aware that GitLab then also requires you to only use supported
+order options. At the time of writing, only ``order_by="id"`` works.
+
+.. code-block:: python
+
+ gl = gitlab.Gitlab(url, token, pagination="keyset", per_page=100)
+ gl.projects.list(order_by="id")
+
+Reference:
+https://docs.gitlab.com/ce/api/README.html#keyset-based-pagination
+
``list()`` methods can also return a generator object which will handle the
next calls to the API when required. This is the recommended way to iterate
through a large number of items:
diff --git a/gitlab/__init__.py b/gitlab/__init__.py
index 9cb027b..166e00f 100644
--- a/gitlab/__init__.py
+++ b/gitlab/__init__.py
@@ -69,6 +69,7 @@ class Gitlab(object):
http_username (str): Username for HTTP authentication
http_password (str): Password for HTTP authentication
api_version (str): Gitlab API version to use (support for 4 only)
+ pagination (str): Can be set to 'keyset' to use keyset pagination
"""
def __init__(
@@ -84,6 +85,7 @@ class Gitlab(object):
api_version="4",
session=None,
per_page=None,
+ pagination=None,
):
self._api_version = str(api_version)
@@ -109,6 +111,7 @@ class Gitlab(object):
self.session = session or requests.Session()
self.per_page = per_page
+ self.pagination = pagination
objects = importlib.import_module("gitlab.v%s.objects" % self._api_version)
self._objects = objects
@@ -200,6 +203,7 @@ class Gitlab(object):
http_password=config.http_password,
api_version=config.api_version,
per_page=config.per_page,
+ pagination=config.pagination,
)
def auth(self):
diff --git a/gitlab/config.py b/gitlab/config.py
index b2c0dbf..95a1245 100644
--- a/gitlab/config.py
+++ b/gitlab/config.py
@@ -163,3 +163,9 @@ class GitlabConfigParser(object):
pass
if self.per_page is not None and not 0 <= self.per_page <= 100:
raise GitlabDataError("Unsupported per_page number: %s" % self.per_page)
+
+ self.pagination = None
+ try:
+ self.pagination = self._config.get(self.gitlab_id, "pagination")
+ except Exception:
+ pass
diff --git a/gitlab/mixins.py b/gitlab/mixins.py
index c812d66..2437a6f 100644
--- a/gitlab/mixins.py
+++ b/gitlab/mixins.py
@@ -120,6 +120,10 @@ class ListMixin(object):
if self.gitlab.per_page:
data.setdefault("per_page", self.gitlab.per_page)
+ # global keyset pagination
+ if self.gitlab.pagination:
+ data.setdefault("pagination", self.gitlab.pagination)
+
# We get the attributes that need some special transformation
types = getattr(self, "_types", {})
if types: