"""标准库交接契约模拟;不导入或运行Vibe/CoTrading引擎。""" import json from datetime import date from decimal import Decimal as D def adapt(rows): if len({r["currency"] for r in rows}) != 1: raise ValueError("mixed_currency") output = {} for row in rows: symbol, day = row["symbol"], date.fromisoformat(row["date"]) bars = output.setdefault(symbol, {}) if day in bars: raise ValueError("duplicate_date") bar = {k: D(str(row[k])) for k in ("open", "high", "low", "close", "volume")} if not all(v.is_finite() for v in bar.values()): raise ValueError("non_finite") if not (0 < bar["low"] <= min(bar["open"], bar["close"]) <= max(bar["open"], bar["close"]) <= bar["high"]): raise ValueError("invalid_ohlc") if bar["volume"] < 0: raise ValueError("negative_volume") bars[day] = bar return {s: [(d.isoformat(), bars[d]) for d in sorted(bars)] for s, bars in output.items()} rows = [{"symbol": "AAA", "date": d, "open": 10, "high": 12, "low": 9, "close": c, "volume": 1000, "currency": "CNY"} for d, c in [("2026-10-20", 11), ("2026-10-19", 10)]] data_map = adapt(rows) assert len(data_map["AAA"]) == len(rows) == 2 assert data_map["AAA"][0][0] == "2026-10-19" assert [bar["close"] for _, bar in data_map["AAA"]] == [D("10"), D("11")] errors = [] for invalid in [rows + [rows[0]], rows + [{**rows[0], "currency": "USD"}], [{k: v for k, v in rows[0].items() if k != "close"}]]: try: adapt(invalid) except (ValueError, KeyError) as exc: errors.append(str(exc)) assert errors == ["duplicate_date", "mixed_currency", "'close'"] print(json.dumps({"symbols": sorted(data_map), "rows": 2, "start": data_map["AAA"][0][0], "end": data_map["AAA"][-1][0], "blocked": errors}, sort_keys=True))