"""Catalog reconciliation: documented contract vs observed API.""" from __future__ import annotations from .api_client import FinDataClient EXPECTED_BARS_FIELDS = ["instrument_id", "symbol_as_reported", "venue", "asset_class", "interval", "timestamp_utc", "session_date", "open", "high", "low", "close", "volume", "currency", "trade_count", "vwap", "adjustment_type", "source_id", "ingested_at", "quality_flags", "revision_id"] def probe(client: FinDataClient, contract: dict) -> dict: health = client.health() datasets = {d["id"]: d for d in client.datasets()} schema = client.schema_bars() spec = client.openapi() routes = sorted(f"{m.upper()} {p}" for p, ops in spec["paths"].items() for m in ops) needed = [contract["findata"]["datasets"][k] for k in ("bars_1m", "bars_1m_etf")] report = { "health_status": health.get("status"), "n_datasets": len(datasets), "schema_version": schema.get("schema_version"), "timestamp_convention": schema.get("timestamp_convention"), "bars_fields_ok": [f["name"] for f in schema["fields"]] == EXPECTED_BARS_FIELDS, "required_datasets": {d: {"status": datasets.get(d, {}).get("status"), "rows": datasets.get(d, {}).get("row_count"), "first": datasets.get(d, {}).get("first_session"), "last": datasets.get(d, {}).get("last_session"), "license": datasets.get(d, {}).get("license_class")} for d in needed}, "has_earnings_route": any("/earnings" in r for r in routes), "routes": routes, "lake_free_gb": (health.get("components", {}).get("lake") or {}).get("free_gb"), } return report