|
2 | 2 |
|
3 | 3 | from __future__ import annotations
|
4 | 4 |
|
5 |
| -from math import inf |
| 5 | +from datetime import time |
6 | 6 | from functools import singledispatch
|
7 | 7 | from json import dump, load
|
| 8 | +from math import inf |
8 | 9 | from os import makedirs, replace
|
9 | 10 | from os.path import basename, dirname, exists, expanduser, join
|
10 | 11 | from typing import Callable, TypeAlias, cast
|
| 12 | +from zoneinfo import ZoneInfo |
11 | 13 |
|
| 14 | +from datetype import Time, aware |
12 | 15 | from fritter.boundaries import Scheduler
|
13 | 16 | from fritter.drivers.memory import MemoryDriver
|
14 | 17 | from fritter.scheduler import schedulerFromDriver
|
15 | 18 |
|
16 | 19 | from pomodouroboros.model.intervals import Idle
|
| 20 | +from pomodouroboros.model.schema import SavedRule, SavedTime |
| 21 | +from pomodouroboros.model.sessions import DailySessionRule, Weekday |
17 | 22 |
|
18 | 23 | from .boundaries import EvaluationResult, IntervalType, UserInterfaceFactory
|
19 | 24 | from .intention import Estimate, Intention
|
@@ -114,6 +119,22 @@ def loadInterval(savedInterval: SavedInterval) -> AnyStreakInterval:
|
114 | 119 | loadInterval(interval) for interval in saved["currentStreak"]
|
115 | 120 | ]
|
116 | 121 |
|
| 122 | + def loadRule(savedRule: SavedRule) -> DailySessionRule: |
| 123 | + |
| 124 | + def loadOneTime(savedTime: SavedTime) -> Time[ZoneInfo]: |
| 125 | + return aware( |
| 126 | + time.fromisoformat(savedTime["time"]).replace( |
| 127 | + tzinfo=ZoneInfo(savedTime["zone"]) |
| 128 | + ), |
| 129 | + ZoneInfo, |
| 130 | + ) |
| 131 | + |
| 132 | + return DailySessionRule( |
| 133 | + dailyStart=loadOneTime(savedRule["dailyStart"]), |
| 134 | + dailyEnd=loadOneTime(savedRule["dailyEnd"]), |
| 135 | + days={Weekday(each) for each in savedRule["days"]}, |
| 136 | + ) |
| 137 | + |
117 | 138 | lastUpdateTime = saved["lastUpdateTime"]
|
118 | 139 | scheduler: Scheduler[float, Callable[[], None], int] = schedulerFromDriver(
|
119 | 140 | driver := MemoryDriver()
|
@@ -148,6 +169,7 @@ def loadInterval(savedInterval: SavedInterval) -> AnyStreakInterval:
|
148 | 169 | _interfaceFactory=userInterfaceFactory,
|
149 | 170 | _lastUpdateTime=lastUpdateTime,
|
150 | 171 | _liveInterval=Idle(0, inf),
|
| 172 | + _sessionRules=[loadRule(rule) for rule in saved["sessionRules"]], |
151 | 173 | )
|
152 | 174 | return nexus
|
153 | 175 |
|
@@ -250,6 +272,20 @@ def saveStartPrompt(interval: StartPrompt) -> SavedStartPrompt:
|
250 | 272 | }
|
251 | 273 | for session in nexus._sessions
|
252 | 274 | ],
|
| 275 | + "sessionRules": [ |
| 276 | + { |
| 277 | + "dailyStart": { |
| 278 | + "time": rule.dailyStart.isoformat(), |
| 279 | + "zone": rule.dailyStart.tzinfo.key, |
| 280 | + }, |
| 281 | + "dailyEnd": { |
| 282 | + "time": rule.dailyEnd.isoformat(), |
| 283 | + "zone": rule.dailyEnd.tzinfo.key, |
| 284 | + }, |
| 285 | + "days": [day.value for day in rule.days], |
| 286 | + } |
| 287 | + for rule in nexus._sessionRules |
| 288 | + ], |
253 | 289 | }
|
254 | 290 |
|
255 | 291 |
|
|
0 commit comments