def test_history(): a = Account('barbara2') h1 = [x['index'] for x in list(a.history())] h2 = [x['index'] for x in list(a.history_reverse())] # pprint(list(zip(h1, h2[::-1]))) # various tests of equality should pass assert len(h1) == len(h2) assert set(h1) == set(h2) == set(range(a.virtual_op_count() + 1)) assert h1 == h2[::-1] == list(range(a.virtual_op_count() + 1))
class Blog: """ Obtain a list of blog posts for an account. Args: account_name (str): Name of the account comments_only (bool): (Default False). Toggle between posts and comments. steemd_instance (Steemd): Steemd instance overload Returns: Generator with Post objects in reverse chronological order. Example: To get all posts, you can use either generator: :: gen1 = Blog('furion') gen2 = b.all() next(gen1) next(gen2) To get some posts, you can call `take()`: :: b = Blog('furion') posts = b.take(5) """ def __init__(self, account_name: str, comments_only: bool = False, steemd_instance=None): self.steem = steemd_instance or shared_steemd_instance() self.comments_only = comments_only self.account = Account(account_name, steemd_instance=steemd_instance) self.history = self.account.history_reverse(filter_by="comment") self.seen_items = set() def take(self, limit=5): """ Take up to n (n = limit) posts/comments at a time. You can call this method as many times as you want. Once there are no more posts to take, it will return []. Returns: List of posts/comments in a batch of size up to `limit`. """ # get main posts only comment_filter = is_comment if self.comments_only else complement( is_comment) hist = filter(comment_filter, self.history) # filter out reblogs hist2 = filter(lambda x: x["author"] == self.account.name, hist) # post edits will re-appear in history # we should therefore filter out already seen posts def ensure_unique(post): if post["permlink"] not in self.seen_items: self.seen_items.add(post["permlink"]) return True unique = filter(ensure_unique, hist2) serialized = filter(bool, map(silent(Post), unique)) batch = take(limit, serialized) return batch def all(self): """A generator that will return ALL of account history.""" while True: chunk = self.take(10) if chunk: yield from iter(chunk) else: break def __iter__(self): return self def __next__(self): next_item = first(self.take(1)) if not next_item: raise StopIteration return next_item