class _Progress: def __init__(self, show_limit: int = 50): from rich.progress import Progress, BarColumn, TimeRemainingColumn self._progress = Progress( "[progress.description]{task.description}", BarColumn(style="bar.back", complete_style="bar.complete", finished_style="bar.complete"), "[progress.percentage]{task.percentage:>3.0f}%", TimeRemainingColumn(), auto_refresh=False) self._last_update = _datetime.now() self._show_limit = show_limit self._completed = {} self._have_entered = False self._enter_args = None def __enter__(self, *args, **kwargs): self._enter_args = (args, kwargs) return self def __exit__(self, *args, **kwargs): if self._have_entered: self._progress.__exit__(*args, **kwargs) return False def add_task(self, description: str, total: int): if total > self._show_limit: if not self._have_entered: args, kwargs = self._enter_args self._progress.__enter__(*args, **kwargs) self._have_entered = True task_id = self._progress.add_task(description=description, total=total) self._completed[task_id] = 0 return task_id else: return None def update(self, task_id: int, completed: float = None, advance: float = None, force_update: bool = False): if task_id is None: return elif completed is not None: self._completed[task_id] = completed elif advance is not None: self._completed[task_id] += advance else: return now = _datetime.now() if force_update or (now - self._last_update).total_seconds() > 0.1: self._progress.update(task_id=task_id, completed=self._completed[task_id]) self._progress.refresh() self._last_update = now