Coverage for adrs/utils.py: 100%

16 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-08-29 05:07 +0800

1import math 

2from datetime import datetime, timedelta 

3 

4 

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 

12 

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]}") 

16 

17 back = timedelta(days=math.ceil(duration.days * size[0])) 

18 return (start_time, start_time + back, start_time + back, end_time) 

19 

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 ) 

27 

28 return ( 

29 start_time, 

30 end_time - timedelta(days=forward_days), 

31 end_time - timedelta(days=forward_days), 

32 end_time, 

33 ) 

34 

35 raise ValueError( 

36 "Either size or forward_days must be provided to split the time range." 

37 )