Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions loopx/capabilities/periodic_report/goal_configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@ def normalize_configuration(value: Mapping[str, Any]) -> dict[str, Any]:
if not isinstance(enabled, bool):
raise TypeError("periodic_report.enabled must be a boolean")
timezone = str(value.get("timezone") or "UTC").strip()
try:
ZoneInfo(timezone)
except ZoneInfoNotFoundError as exc:
raise ValueError("periodic_report.timezone is unknown") from exc
if timezone != "UTC":
try:
ZoneInfo(timezone)
except ZoneInfoNotFoundError as exc:
raise ValueError("periodic_report.timezone is unknown") from exc
profile_preset = str(value.get("profile_preset") or "").strip()
route_ref = str(value.get("route_ref") or "").strip()
if enabled and (not profile_preset or not route_ref):
Expand Down
21 changes: 12 additions & 9 deletions loopx/capabilities/periodic_report/machine_defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,11 @@ def normalize_periodic_report_machine_defaults(
periodic.get("timezone", "UTC"),
"periodic_report.timezone",
)
try:
ZoneInfo(timezone)
except ZoneInfoNotFoundError as exc:
raise ValueError("periodic_report.timezone is unknown") from exc
if timezone != "UTC":
try:
ZoneInfo(timezone)
except ZoneInfoNotFoundError as exc:
raise ValueError("periodic_report.timezone is unknown") from exc
normalized_periodic: dict[str, Any] = {
"schema_version": PERIODIC_REPORT_MACHINE_DEFAULTS_SCHEMA,
"enabled": enabled,
Expand Down Expand Up @@ -258,10 +259,11 @@ def _normalized_goal_subscription(
timezone_name = _text(
config.get("timezone", "UTC"), "goal periodic_report.timezone"
)
try:
ZoneInfo(timezone_name)
except ZoneInfoNotFoundError as exc:
raise ValueError("goal periodic_report.timezone is unknown") from exc
if timezone_name != "UTC":
try:
ZoneInfo(timezone_name)
except ZoneInfoNotFoundError as exc:
raise ValueError("goal periodic_report.timezone is unknown") from exc
profile_preset = str(config.get("profile_preset") or "").strip() or None
route_ref = str(config.get("route_ref") or "").strip() or None
if enabled:
Expand Down Expand Up @@ -292,7 +294,8 @@ def _invalid_goal_subscription_fields(config: Mapping[str, Any]) -> tuple[str, .
timezone_name = _text(
config.get("timezone", "UTC"), "goal periodic_report.timezone"
)
ZoneInfo(timezone_name)
if timezone_name != "UTC":
ZoneInfo(timezone_name)
except (TypeError, ValueError, ZoneInfoNotFoundError):
invalid.append("timezone")
if enabled is True:
Expand Down
16 changes: 16 additions & 0 deletions tests/capabilities/test_periodic_report_machine_defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import json
from pathlib import Path
from zoneinfo import ZoneInfoNotFoundError

import pytest

from loopx.capabilities.periodic_report import machine_defaults as periodic_defaults
from loopx.capabilities.machine_configuration.builtins import (
build_builtin_machine_configuration_registry,
)
Expand Down Expand Up @@ -88,6 +90,20 @@ def _remove_defaults(runtime_root: Path) -> None:
)


def test_utc_defaults_do_not_require_an_external_timezone_database(
monkeypatch: pytest.MonkeyPatch,
) -> None:
def missing_timezone(_name: str) -> None:
raise ZoneInfoNotFoundError

monkeypatch.setattr(periodic_defaults, "ZoneInfo", missing_timezone)

build_builtin_machine_configuration_registry()
subscription = resolve_goal_periodic_report_subscription(_goal("research"), None)

assert subscription["timezone"] == "UTC"


def test_machine_defaults_require_a_route_when_weekly_reports_are_enabled() -> None:
payload = _defaults()
payload["namespaces"]["periodic_report"].pop("route_ref")
Expand Down