You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Streaming was fake.StreamingBatcher called a full-file parse inside next_batch(), so pulling N batches re-read and re-parsed the whole file N times with no bound on per-batch memory. Now opens the source once via Polars' mmap-backed batched readers and advances a cursor. New tests/test_streaming.rs proves output parity with whole-file execution, bounded batch size, and cost that doesn't scale with batch count.
Seasonal anomaly detection had a timestamp bug.AdaptiveThresholdDetector.detect_seasonal_anomaly derived each history entry's day-of-week from its list index relative to now, silently wrong unless observations arrived exactly one per day, in order, ending today. Now uses each observation's actual recorded timestamp.
execute_sql()/execute_spark()/execute_cloud() import fix (carried from 2.4.0) — they referenced a nonexistent statguardian._statguard module instead of statguardian._statguardian.
polars/pyarrow compatibility. The polars pin is now >=1.6,<1.32.3 (old ==0.19.12 predated pl.String; 1.32.3+ breaks the compiled extension's pyo3-polars binding). pyarrow>=16.0 is now a base dependency — every execute() call needs it, not just the pandas/spark extras, and the old pyarrow==14.0.1 pin can't decode modern polars' string layout. Verified with clean pip install statguardian and pip install "statguardian[pandas]".
New
statguardian.merge_violations(report, extra_violations) -> MergedReport — combine a ValidationReport with run_custom_validators() output into one pass/fail result. Previously referenced in a docstring but didn't exist.
AdaptiveThresholdDetector.detect_hourly_anomaly — business-hours-vs-off-hours comparison, previously promised by the class docstring but not implemented.
Removed
cli_workflow.py, server_workflow.py — dead code, never imported anywhere.