Skip to content

v2.5.0

Latest

Choose a tag to compare

@Mullassery Mullassery released this 23 Aug 08:54
· 19 commits to main since this release

Fixes

  • 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.