def __init__(self, method, args, kargs):
BaseIterator.__init__(self, method, args, kargs)
self.max_id = kargs.get('max_id')
- self.since_id = kargs.get('since_id')
- self.count = 0
+ self.num_tweets = 0
+ self.results = []
+ self.index = 0
def next(self):
"""Fetch a set of items with IDs less than current set."""
if self.limit and self.limit == self.count:
raise StopIteration
- # max_id is inclusive so decrement by one
- # to avoid requesting duplicate items.
- max_id = self.since_id - 1 if self.max_id else None
- data = self.method(max_id = max_id, *self.args, **self.kargs)
+ if self.index >= len(self.results) - 1:
+ data = self.method(max_id=self.max_id, *self.args, **self.kargs)
+ if len(self.results) != 0:
+ self.index += 1
+ self.results.append(data)
+ else:
+ self.index += 1
+ data = self.results[self.index]
+
if len(data) == 0:
raise StopIteration
- self.max_id = data.max_id
- self.since_id = data.since_id
- self.count += 1
+ # TODO: Make this not dependant on the parser making max_id and
+ # since_id available
+ self.max_id = data.max_id
+ self.num_tweets += 1
return data
def prev(self):
if self.limit and self.limit == self.count:
raise StopIteration
- since_id = self.max_id
- data = self.method(since_id = since_id, *self.args, **self.kargs)
- if len(data) == 0:
+ self.index -= 1
+ if self.index < 0:
+ # There's no way to fetch a set of tweets directly 'above' the
+ # current set
raise StopIteration
+
+ data = self.results[self.index]
self.max_id = data.max_id
- self.since_id = data.since_id
- self.count += 1
+ self.num_tweets += 1
return data
class PageIterator(BaseIterator):
if self._max_id:
return self._max_id
ids = self.ids()
- return max(ids) if ids else None
+ # Max_id is always set to the *smallest* id, minus one, in the set
+ return (min(ids) - 1) if ids else None
@property
def since_id(self):
if self._since_id:
return self._since_id
ids = self.ids()
- return min(ids) if ids else None
+ # Since_id is always set to the *greatest* id in the set
+ return max(ids) if ids else None
def ids(self):
return [item.id for item in self if hasattr(item, 'id')]