import datetime as dt import os import sys from pathlib import Path import polars as pl import pytest sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) LIVE = os.environ.get("WP39_LIVE") == "1" live = pytest.mark.skipif(not LIVE, reason="set WP39_LIVE=1 to run live FinData tests") @pytest.fixture def toy_wide(): """Two firms, regular quarterly calendar, filing 40 d after period end.""" rows = [] for e in ("frd:AAA", "frd:BBB"): base = 100.0 if e == "frd:AAA" else 50.0 for i in range(14): pe = dt.date(2015, 3, 31) + dt.timedelta(days=int(91.3 * i)) fd = pe + dt.timedelta(days=40) rows.append({"entity_id": e, "security_id": f"firstrate:stock:{e[4:]}", "fiscal_period_end": pe, "fiscal_year": pe.year, "fiscal_period": f"q{(pe.month - 1) // 3 + 1}", "filing_date": fd, "available_date": fd + dt.timedelta(days=1), "op_inc": base + i + (5 if (i % 4 == 0) else 0), "net_inc": base * 0.7 + i, "cash_op": base * 1.1 + i, "rev": base * 10 + 10 * i, "assets_tot": base * 20, "assets_c": base * 5, "liab_c": base * 3, "roa": 0.02 + 0.001 * i, "intr_cover": 5.0, "shares": 1000.0, "gp": base * 4, "debt": base * 6, "cash": base, "capex": base * 0.2, "research_dev": base * 0.1, "qidx": i}) return pl.DataFrame(rows) @pytest.fixture def toy_events(toy_wide): ev = toy_wide.select(["entity_id", "filing_date"]).with_columns( (pl.col("filing_date") - pl.duration(days=1)).alias("event_date"), pl.lit("after_close").alias("release_time"), pl.lit(None, dtype=pl.Float64).alias("eps_estimate"), pl.lit(None, dtype=pl.Float64).alias("eps_reported")).drop("filing_date") return ev