Coverage for adrs/utils.py: 100%
16 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-29 05:07 +0800
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-29 05:07 +0800
1import math
2from datetime import datetime, timedelta
5def backforward_split(
6 start_time: datetime,
7 end_time: datetime,
8 size: tuple[float, float] | None = None,
9 forward_days: int | None = None,
10) -> tuple[datetime, datetime, datetime, datetime]:
11 duration = end_time - start_time
13 if size is not None:
14 if size[0] + size[1] != 1.0:
15 raise ValueError(f"Size must sum to 1.0, not {size[0] + size[1]}")
17 back = timedelta(days=math.ceil(duration.days * size[0]))
18 return (start_time, start_time + back, start_time + back, end_time)
20 if forward_days is not None:
21 if forward_days < 0:
22 raise ValueError("forward_days must be non-negative")
23 if forward_days > duration.days:
24 raise ValueError(
25 f"forward_days ({forward_days}) cannot be greater than the total duration ({duration.days} days)"
26 )
28 return (
29 start_time,
30 end_time - timedelta(days=forward_days),
31 end_time - timedelta(days=forward_days),
32 end_time,
33 )
35 raise ValueError(
36 "Either size or forward_days must be provided to split the time range."
37 )