Skip to content

Commit 3bf0e40

Browse files
committed
fix: add set_quiet_hours method and quiet hours persistence
- Add set_quiet_hours() method and quiet_hours_enabled property to ClockService - Add quiet hours save/restore to app.py _load_config() and save_config() - Add tests for new method and property Fixes #18
1 parent a11fdba commit 3bf0e40

3 files changed

Lines changed: 72 additions & 0 deletions

File tree

src/accessiclock/app.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,18 @@ def _load_config(self) -> None:
157157
self.chime_half_hour = self.config.get("chime_half_hour", False)
158158
self.chime_quarter_hour = self.config.get("chime_quarter_hour", False)
159159

160+
# Restore quiet hours
161+
if self.config.get("quiet_hours_enabled", False) and self.clock_service:
162+
from datetime import time as dt_time
163+
try:
164+
sh, sm = map(int, self.config["quiet_start"].split(":"))
165+
eh, em = map(int, self.config["quiet_end"].split(":"))
166+
self.clock_service.set_quiet_hours(dt_time(sh, sm), dt_time(eh, em))
167+
except (KeyError, ValueError) as e:
168+
logger.warning(f"Failed to restore quiet hours: {e}")
169+
elif self.clock_service:
170+
self.clock_service.quiet_hours_enabled = False
171+
160172
logger.info(f"Configuration loaded from {config_file}")
161173
except Exception as e:
162174
logger.warning(f"Failed to load config: {e}")
@@ -165,13 +177,24 @@ def save_config(self) -> None:
165177
"""Save configuration to file."""
166178
import json
167179

180+
quiet_config = {}
181+
if self.clock_service and self.clock_service.quiet_hours_enabled:
182+
quiet_config = {
183+
"quiet_hours_enabled": True,
184+
"quiet_start": self.clock_service.quiet_start.strftime("%H:%M"),
185+
"quiet_end": self.clock_service.quiet_end.strftime("%H:%M"),
186+
}
187+
else:
188+
quiet_config = {"quiet_hours_enabled": False}
189+
168190
self.config.update(
169191
{
170192
"volume": self.current_volume,
171193
"clock": self.selected_clock,
172194
"chime_hourly": self.chime_hourly,
173195
"chime_half_hour": self.chime_half_hour,
174196
"chime_quarter_hour": self.chime_quarter_hour,
197+
**quiet_config,
175198
}
176199
)
177200

src/accessiclock/services/clock_service.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,29 @@ def _is_quiet_time(self, current_time: time) -> bool:
121121
# Quiet hours within same day
122122
return self.quiet_start <= current_time < self.quiet_end
123123

124+
@property
125+
def quiet_hours_enabled(self) -> bool:
126+
"""Return whether quiet hours are currently enabled."""
127+
return self.quiet_start is not None and self.quiet_end is not None
128+
129+
@quiet_hours_enabled.setter
130+
def quiet_hours_enabled(self, value: bool) -> None:
131+
"""Enable or disable quiet hours. Disabling clears start/end times."""
132+
if not value:
133+
self.quiet_start = None
134+
self.quiet_end = None
135+
136+
def set_quiet_hours(self, start: time, end: time) -> None:
137+
"""
138+
Set quiet hours range.
139+
140+
Args:
141+
start: Start time for quiet hours.
142+
end: End time for quiet hours.
143+
"""
144+
self.quiet_start = start
145+
self.quiet_end = end
146+
124147
def reset_chime_tracking(self) -> None:
125148
"""Reset the chime tracking (e.g., after settings change)."""
126149
self._last_chime_minute = None

tests/test_clock_service.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,29 @@ def test_overnight_quiet_hours_boundaries(self):
255255
assert service.should_chime_now(time(23, 0, 0)) is None
256256
# Exactly at end - outside quiet hours
257257
assert service.should_chime_now(time(7, 0, 0)) == "hour"
258+
259+
def test_set_quiet_hours_method(self):
260+
"""set_quiet_hours should configure start and end times."""
261+
from accessiclock.services.clock_service import ClockService
262+
263+
service = ClockService()
264+
service.set_quiet_hours(time(22, 0), time(6, 0))
265+
266+
assert service.quiet_start == time(22, 0)
267+
assert service.quiet_end == time(6, 0)
268+
assert service.quiet_hours_enabled is True
269+
270+
def test_quiet_hours_enabled_property(self):
271+
"""quiet_hours_enabled should reflect whether quiet hours are set."""
272+
from accessiclock.services.clock_service import ClockService
273+
274+
service = ClockService()
275+
assert service.quiet_hours_enabled is False
276+
277+
service.set_quiet_hours(time(22, 0), time(6, 0))
278+
assert service.quiet_hours_enabled is True
279+
280+
service.quiet_hours_enabled = False
281+
assert service.quiet_hours_enabled is False
282+
assert service.quiet_start is None
283+
assert service.quiet_end is None

0 commit comments

Comments
 (0)