Coverage for src / bioimageio / spec / _internal / progress.py: 100%
25 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-15 08:44 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-15 08:44 +0000
1from abc import abstractmethod
2from typing import Any, Optional, Protocol
4from rich.progress import Progress
7class ProgressbarLike(Protocol):
8 """Progressbar protocol modeled after tqdm"""
10 total: Optional[int]
12 @abstractmethod
13 def update(self, increment: int, /) -> Any: ...
15 @abstractmethod
16 def reset(self): ...
18 @abstractmethod
19 def close(self): ...
21 @abstractmethod
22 def set_description(self, description: str, /, refresh: bool = True): ...
25class RichTaskBar(ProgressbarLike):
26 def __init__(self, description: str, *, parent: Progress, total: Optional[int]):
27 super().__init__()
28 self.task_id = parent.add_task(description, total=total)
29 self.parent = parent
30 self.total = total
32 def update(self, increment: int, /):
33 self.parent.advance(self.task_id, increment)
35 def reset(self):
36 self.parent.reset(self.task_id)
38 def close(self):
39 self.parent.remove_task(self.task_id)
41 def set_description(self, description: str, /, refresh: bool = True):
42 self.parent.update(self.task_id, description=description, refresh=refresh)
45class RichOverallProgress:
46 def __init__(self):
47 super().__init__()
48 self.progress = Progress()
50 def __call__(self, description: str = "", *, total: Optional[int] = None):
51 return RichTaskBar(description, parent=self.progress, total=total)