You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.2 KiB
46 lines
1.2 KiB
import operator
|
|
|
|
|
|
class Paginator(object):
|
|
"""
|
|
Implements a class which provides paginated iteration over an endpoint.
|
|
"""
|
|
def __init__(self, func, sort_key, *args, **kwargs):
|
|
self.func = func
|
|
self.sort_key = sort_key
|
|
self.args = args
|
|
self.kwargs = kwargs
|
|
|
|
self._key = kwargs.pop('key', operator.attrgetter('id'))
|
|
self._bulk = kwargs.pop('bulk', False)
|
|
self._sort_key_value = kwargs.pop(self.sort_key, None)
|
|
self._buffer = []
|
|
|
|
def fill(self):
|
|
self.kwargs[self.sort_key] = self._sort_key_value
|
|
result = self.func(*self.args, **self.kwargs)
|
|
|
|
if not len(result):
|
|
return 0
|
|
|
|
self._buffer.extend(result)
|
|
self._sort_key_value = self._key(result[-1])
|
|
return len(result)
|
|
|
|
def next(self):
|
|
return self.__next__()
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def __next__(self):
|
|
if not len(self._buffer):
|
|
if not self.fill():
|
|
raise StopIteration
|
|
|
|
if self._bulk:
|
|
res = self._buffer
|
|
self._buffer = []
|
|
return res
|
|
else:
|
|
return self._buffer.pop()
|
|
|