"""Generate a standalone HTML report from category,amount CSV input.""" import argparse import csv from decimal import Decimal, InvalidOperation from html import escape from pathlib import Path def totals(source): reader = csv.DictReader(source) if not {"category", "amount"}.issubset(reader.fieldnames or []): raise ValueError("CSV requires category and amount columns") result = {} for line, row in enumerate(reader, 2): category = (row.get("category") or "").strip() try: amount = Decimal(row.get("amount") or "") except InvalidOperation as error: raise ValueError(f"Invalid amount on line {line}") from error if not category or not amount.is_finite(): raise ValueError(f"Invalid category or amount on line {line}") result[category] = result.get(category, Decimal(0)) + amount return result def render(values): rows = "".join(f"
| Category | Amount |
|---|---|
| Total | {sum(values.values(), Decimal(0)):,.2f} |