# Created by AG on 23-12-2025 from __future__ import annotations from typing import List, Any from core.runner import Record from rich.table import Table from rich.console import Console def _as_bool(string: Any) -> bool: if isinstance(string, bool): return string if isinstance(string, str): return string.strip().lower() in {"true", "1", "yes", "y"} if isinstance(string, int): return string != 0 return False def summary(records: List[Record]) -> None: console = Console(width=140) # console.print(type(records[0].ok), records[0].ok) # good_count = sum(1 for record in records if _as_bool(record.ok)) # bad_count = len(records) - good_count good_count = sum(1 for record in records if (record.expected or "").strip().lower() == "pass") bad_count = sum(1 for record in records if (record.expected or "").strip().lower() == "fail") table = Table(title="Schema Test Result", expand=True) table.add_column("record", width=6, no_wrap=True) table.add_column("is_valid", width=8, no_wrap=True) table.add_column("pass/fail", width=9, no_wrap=True) table.add_column("status code", width=11, no_wrap=True) table.add_column("time (ms)", justify="right", width=10, no_wrap=True) table.add_column("api response", overflow="fold") for record in records: status = "-" if record.status_code is None else str(record.status_code) response_snippet = (record.error or record.response or "")[:300] table.add_row( record.id, "yes" if _as_bool(record.is_valid) else "no", record.expected, status, f"{record.elapsed_time_ms:.1f}", response_snippet, ) console.print(table) console.print(f"Total: {len(records)} Good: {good_count} Bad: {bad_count}")