обновлен формат генерации датасета

This commit is contained in:
Даниил Грабарь
2026-10-22 10:07:05 +10:00
parent 9e551a2ca9
commit 1059b47978
29 changed files with 2230 additions and 468 deletions
+45
View File
@@ -0,0 +1,45 @@
"""Terminal progress on stderr; dataset statistics remain machine-readable on stdout."""
from rich.console import Console
from rich.progress import (
BarColumn, MofNCompleteColumn, Progress, ProgressColumn,
TaskProgressColumn, TextColumn, TimeElapsedColumn, TimeRemainingColumn,
)
from rich.text import Text
class RateColumn(ProgressColumn):
def render(self, task):
speed = task.finished_speed or task.speed
return Text(f'{speed:.1f} зап/с' if speed is not None else '— зап/с')
class ProgressDisplay:
def __init__(self, label, total, *, initial=0, enabled=True):
self.label = label
self.total = total
self.progress = Progress(
TextColumn('{task.description}'), BarColumn(bar_width=None),
TaskProgressColumn(), MofNCompleteColumn(), RateColumn(),
TextColumn('прошло'), TimeElapsedColumn(),
TextColumn('осталось'), TimeRemainingColumn(),
console=Console(stderr=True), refresh_per_second=4,
redirect_stdout=False, redirect_stderr=False, disable=not enabled,
)
self.task = self.progress.add_task(label, total=total, completed=min(initial, total))
def __enter__(self):
self.progress.start()
return self
def update(self, completed=None, *, status=None):
kwargs = {}
if completed is not None:
kwargs['completed'] = min(completed, self.total)
if status is not None:
kwargs['description'] = f'{self.label}: {status}' if status else self.label
self.progress.update(self.task, **kwargs)
def __exit__(self, exc_type, exc, traceback):
if exc_type is not None:
self.update(status='прервано' if issubclass(exc_type, (KeyboardInterrupt, SystemExit)) else 'ошибка')
self.progress.stop()