"""Display helpers for Gradio tables.""" from __future__ import annotations import html import pandas as pd from src.formatting import fmt_number def display_dataframe(df: pd.DataFrame | None) -> pd.DataFrame: if df is None or df.empty: return pd.DataFrame([{"—": "No data"}]) out = df.copy().astype(object) return out.where(pd.notnull(out), "—") def _header_cell(col: object, *, wrap: bool) -> str: text = str(col) if wrap and " " in text: left, right = text.split(" ", 1) inner = f"{html.escape(left)}
{html.escape(right)}" else: inner = html.escape(text) return f"{inner}" def _cell_text(value: object) -> str: if value is None or (isinstance(value, float) and pd.isna(value)): return "—" if pd.isna(value): return "—" if isinstance(value, float): return fmt_number(value) if isinstance(value, int) and not isinstance(value, bool): return str(value) return str(value) def dataframe_to_html( df: pd.DataFrame | None, *, empty_note: str = "No data", wrap_headers: bool = False, table_class: str = "", ) -> str: if df is None or df.empty: return f'

{html.escape(empty_note)}

' headers = "".join(_header_cell(col, wrap=wrap_headers) for col in df.columns) body_rows = [] for row in df.itertuples(index=False, name=None): cells = [] for col, value in zip(df.columns, row, strict=True): text = _cell_text(value) css_class = "" if col in {"Success %", "Success"} and text not in {"—", "✓", "✗"}: css_class = ' class="wab-metric-value"' elif col in {"Tasks", "Metric", "Harness", "Input", "Model", "Class", "Task"}: css_class = ' class="wab-mono-cell"' cells.append(f"{html.escape(text)}") body_rows.append(f"{''.join(cells)}") rows = "".join(body_rows) wrap_cls = f" {table_class}" if table_class else "" return ( f'
' f'{headers}' f"{rows}
" )