50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""Saying what each finished world did."""
|
|
|
|
from apworld_tester.core.display.progress import Progress
|
|
from apworld_tester.core.model.verdict import Verdict
|
|
|
|
|
|
class Reporter:
|
|
"""One run's progress callback.
|
|
|
|
Holds its own bar rather than a module variable: two runs in one
|
|
process would otherwise share a bar and a tally.
|
|
"""
|
|
|
|
def __init__(self, config, bar=False):
|
|
self.config = config
|
|
self.wants_bar = bar
|
|
self.bar = None
|
|
|
|
@staticmethod
|
|
def marker(report):
|
|
return ("cached" if report.get("skipped")
|
|
else f"{report.get('elapsed_seconds')}s")
|
|
|
|
def verdicts(self, report):
|
|
text = f"{report['outcome']}"
|
|
multi = report.get("multi_outcome")
|
|
return f"{text} / multi:{multi}" if multi else text
|
|
|
|
def drawn(self, index, total, report):
|
|
if self.bar is None or self.bar.total != total:
|
|
self.bar = Progress(total=total, config=self.config)
|
|
self.bar.update(
|
|
index=index,
|
|
key=report.get("outcome") or "?",
|
|
text=report.get("game") or "",
|
|
fallback_line=(f"[{index}/{total}] {report['game']}: "
|
|
f"{self.verdicts(report)} ({self.marker(report)})"),
|
|
)
|
|
|
|
def printed(self, index, total, report):
|
|
print(f"[{index}/{total}] {report.get('game')}: "
|
|
f"{Verdict(report, self.config).label} ({self.marker(report)})",
|
|
flush=True)
|
|
|
|
def __call__(self, index, total, report):
|
|
if self.wants_bar:
|
|
self.drawn(index, total, report)
|
|
else:
|
|
self.printed(index, total, report)
|