fix: validate complete-day monitoring coverage
This commit is contained in:
@@ -9,7 +9,7 @@ Key contracts:
|
||||
- End causes: user_disabled, migrated, unknown_gap
|
||||
"""
|
||||
import sqlite3
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
|
||||
|
||||
def ensure_period_open(conn: sqlite3.Connection, run_time: datetime) -> None:
|
||||
@@ -82,6 +82,46 @@ def is_inside_period(conn: sqlite3.Connection, ts: datetime) -> bool:
|
||||
return cursor.fetchone() is not None
|
||||
|
||||
|
||||
def interval_within_one_monitoring_period(
|
||||
conn: sqlite3.Connection,
|
||||
start: str | datetime,
|
||||
end: str | datetime,
|
||||
) -> bool:
|
||||
"""Return whether one monitoring period contains the full interval.
|
||||
|
||||
Compare timestamps as UTC instants. Malformed timestamps fail closed.
|
||||
"""
|
||||
try:
|
||||
interval_start = as_utc_datetime(start)
|
||||
interval_end = as_utc_datetime(end)
|
||||
except (TypeError, ValueError, OverflowError):
|
||||
return False
|
||||
if interval_end <= interval_start:
|
||||
return False
|
||||
|
||||
for started_at, ended_at in conn.execute(
|
||||
"SELECT started_at, ended_at FROM monitoring_periods"
|
||||
):
|
||||
try:
|
||||
period_start = as_utc_datetime(started_at)
|
||||
period_end = as_utc_datetime(ended_at) if ended_at is not None else None
|
||||
except (TypeError, ValueError, OverflowError):
|
||||
continue
|
||||
if period_start <= interval_start and (
|
||||
period_end is None or interval_end <= period_end
|
||||
):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def as_utc_datetime(value: str | datetime) -> datetime:
|
||||
"""Parse a timestamp and normalize it to an aware UTC datetime."""
|
||||
parsed = value if isinstance(value, datetime) else datetime.fromisoformat(value)
|
||||
if parsed.tzinfo is None:
|
||||
parsed = parsed.replace(tzinfo=timezone.utc)
|
||||
return parsed.astimezone(timezone.utc)
|
||||
|
||||
|
||||
def wall_clock_in_periods(
|
||||
conn: sqlite3.Connection,
|
||||
start: datetime,
|
||||
|
||||
Reference in New Issue
Block a user