class Monitor: def __init__(self, title="Monitor", log=False) -> None: """Monitor allows you to monitor the progress of what is happenening inside your application Args: title (str, optional): The Title of this Monitor (Is the Panels Title). Defaults to "Monitor". progress (bool, optional): Do you want to monitor the progress of assignments and reservations? Defaults to False. """ self.columns = Table.grid(expand=True) self.columns.add_column() self.log = log self.panel = Panel(self.columns, title=title) self.live = Live(self.panel, refresh_per_second=4, console=console) def addRow(self, renderable: ConsoleRenderable): self.columns.add_row(renderable) def __aenter__(self): '''Convenience Method''' return self.__aenter__() def __aexit__(self, *args, **kwargs): self.__exit__(*args, **kwargs) def __enter__(self): current_monitor.set(self) self.live.__enter__() return self def __exit__(self, *args, **kwargs): self.live.__exit__(*args, **kwargs) current_monitor.set(None)
class MultiProgress: """Track progress of multiple processes, plus overall combined progress""" def __init__( self, totals: Dict[str, int], total_progress: Progress = None, job_progress: Progress = None, task_description: str = 'Loading', ): self.total_progress = total_progress or _get_progress() self.total_task = self.total_progress.add_task('[cyan]Total', total=sum( totals.values())) self.job_progress = job_progress or _get_progress() self.job_task = self.job_progress.add_task('[cyan]File ') self.table = Table.grid() self.table.add_row(self.total_progress) self.table.add_row(self.job_progress) self.task_description = task_description self.totals = totals self.live = Live(self.table, refresh_per_second=10) def __enter__(self): self.live.__enter__() return self def __exit__(self, *args): self.total_progress.tasks[0].completed = self.total_progress.tasks[ 0].total self.job_progress.tasks[0].completed = self.job_progress.tasks[0].total self.live.__exit__(*args) def start_job(self, name: PathOrStr): if isinstance(name, Path): name = _fname(name) self.job_progress.update( self.job_task, completed=0, total=self.totals[str(name)], ) self.job_progress.log( f'[cyan]{self.task_description} [white]{name}[cyan]...') def advance(self, advance: int = 1): self.total_progress.advance(self.total_task, advance) self.job_progress.advance(self.job_task, advance)