2
# Copyright 2009-2010 Joshua Roesslein
3
# See LICENSE for details.
5
from tweepy.error import TweepError
8
"""Pagination helper class"""
10
def __init__(self, method, *args, **kargs):
11
if hasattr(method, 'pagination_mode'):
12
if method.pagination_mode == 'cursor':
13
self.iterator = CursorIterator(method, args, kargs)
15
self.iterator = PageIterator(method, args, kargs)
17
raise TweepError('This method does not perform pagination')
19
def pages(self, limit=0):
20
"""Return iterator for pages"""
22
self.iterator.limit = limit
25
def items(self, limit=0):
26
"""Return iterator for items in each page"""
27
i = ItemIterator(self.iterator)
31
class BaseIterator(object):
33
def __init__(self, method, args, kargs):
40
raise NotImplementedError
43
raise NotImplementedError
48
class CursorIterator(BaseIterator):
50
def __init__(self, method, args, kargs):
51
BaseIterator.__init__(self, method, args, kargs)
57
if self.next_cursor == 0 or (self.limit and self.count == self.limit):
59
data, cursors = self.method(
60
cursor=self.next_cursor, *self.args, **self.kargs
62
self.prev_cursor, self.next_cursor = cursors
69
if self.prev_cursor == 0:
70
raise TweepError('Can not page back more, at first page')
71
data, self.next_cursor, self.prev_cursor = self.method(
72
cursor=self.prev_cursor, *self.args, **self.kargs
77
class PageIterator(BaseIterator):
79
def __init__(self, method, args, kargs):
80
BaseIterator.__init__(self, method, args, kargs)
84
self.current_page += 1
85
items = self.method(page=self.current_page, *self.args, **self.kargs)
86
if len(items) == 0 or (self.limit > 0 and self.current_page > self.limit):
91
if (self.current_page == 1):
92
raise TweepError('Can not page back more, at first page')
93
self.current_page -= 1
94
return self.method(page=self.current_page, *self.args, **self.kargs)
96
class ItemIterator(BaseIterator):
98
def __init__(self, page_iterator):
99
self.page_iterator = page_iterator
101
self.current_page = None
106
if self.limit > 0 and self.count == self.limit:
108
if self.current_page is None or self.page_index == len(self.current_page) - 1:
109
# Reached end of current page, get the next page...
110
self.current_page = self.page_iterator.next()
114
return self.current_page[self.page_index]
117
if self.current_page is None:
118
raise TweepError('Can not go back more, at first page')
119
if self.page_index == 0:
120
# At the beginning of the current page, move to next...
121
self.current_page = self.page_iterator.prev()
122
self.page_index = len(self.current_page)
123
if self.page_index == 0:
124
raise TweepError('No more items')
127
return self.current_page[self.page_index]