Skip to content

Commit

Permalink
Refactor RichProgressBar to support async iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
glensc committed Jan 6, 2024
1 parent 1d6c9ab commit 55d54cb
Showing 1 changed file with 28 additions and 2 deletions.
30 changes: 28 additions & 2 deletions plextraktsync/rich/RichProgressBar.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,46 @@

class RichProgressBar:
def __init__(self, iterable, total, options=None, desc=""):
self.iter = iter(iterable)
self.options = options or {}
self.desc = desc
self.total = total
self.i = 0

self.iterable_awaitable = False
if iterable is not None:
if hasattr(iterable, "__anext__"):
self.iterable_next = iterable.__anext__
self.iterable_awaitable = True
elif hasattr(iterable, "__next__"):
self.iterable_next = iterable.__next__
else:
self.iterable_next = iter(iterable).__next__

def __iter__(self):
if self.iterable_awaitable:
raise RuntimeError("Iterable must be awaited")

return self

def __next__(self):
res = self.iter.__next__()
res = self.iterable_next()
self.update()
return res

def __aiter__(self):
return self

async def __anext__(self):
try:
if self.iterable_awaitable:
res = await self.iterable_next()
else:
res = self.iterable_next()
self.update()
return res
except StopIteration:
raise StopAsyncIteration

def __enter__(self):
self.progress.__enter__()
return self
Expand Down

0 comments on commit 55d54cb

Please sign in to comment.