From 5861fcc5a10e3383f9f9e78a730793e2907ab0ff Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Fri, 17 Jul 2026 03:46:52 +0200 Subject: [PATCH 1/2] Validate skipped update diagnostics state --- src/pyrecest/filters/update_diagnostics.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/pyrecest/filters/update_diagnostics.py b/src/pyrecest/filters/update_diagnostics.py index 7d88a66a8..3a27ac82f 100644 --- a/src/pyrecest/filters/update_diagnostics.py +++ b/src/pyrecest/filters/update_diagnostics.py @@ -53,7 +53,12 @@ def __post_init__(self): "active_measurement_indices must be smaller than measurement_count" ) object.__setattr__(self, "measurement_count", measurement_count) - object.__setattr__(self, "skipped_reason", _normalize_skipped_reason(self.skipped_reason)) + skipped_reason = _normalize_skipped_reason(self.skipped_reason) + if skipped_reason is not None and indices: + raise ValueError( + "skipped diagnostics must not contain active_measurement_indices" + ) + object.__setattr__(self, "skipped_reason", skipped_reason) object.__setattr__(self, "metadata", _normalize_metadata(self.metadata)) @property @@ -114,8 +119,8 @@ def _normalize_skipped_reason(skipped_reason: str | None) -> str | None: return None if not isinstance(skipped_reason, str): raise ValueError("skipped_reason must be a string or None") - if not skipped_reason: - raise ValueError("skipped_reason must not be empty") + if not skipped_reason.strip(): + raise ValueError("skipped_reason must not be empty or whitespace-only") return skipped_reason From dbe99752b64781242079598605953d807560f0c0 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Fri, 17 Jul 2026 03:47:02 +0200 Subject: [PATCH 2/2] Test skipped diagnostics consistency --- .../test_update_diagnostics_skipped_reason.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/filters/test_update_diagnostics_skipped_reason.py b/tests/filters/test_update_diagnostics_skipped_reason.py index 48b8eee87..0a73f55d4 100644 --- a/tests/filters/test_update_diagnostics_skipped_reason.py +++ b/tests/filters/test_update_diagnostics_skipped_reason.py @@ -3,12 +3,24 @@ from pyrecest.filters.update_diagnostics import MeasurementUpdateDiagnostics -@pytest.mark.parametrize("skipped_reason", ["", 0, object()]) +@pytest.mark.parametrize("skipped_reason", ["", " ", 0, object()]) def test_skipped_reason_rejects_non_text_or_empty_values(skipped_reason): with pytest.raises(ValueError, match="skipped_reason"): MeasurementUpdateDiagnostics(skipped_reason=skipped_reason) +def test_skipped_reason_rejects_active_measurements(): + with pytest.raises( + ValueError, + match="skipped diagnostics must not contain active_measurement_indices", + ): + MeasurementUpdateDiagnostics( + active_measurement_indices=[0], + measurement_count=1, + skipped_reason="gated", + ) + + def test_skipped_constructor_accepts_non_empty_reason(): diagnostics = MeasurementUpdateDiagnostics.skipped("gated")