88from ._models import RecurrencePatternType , RecurrenceRangeType , TimeWindowFilterSettings , OccurrenceInfo
99from ._recurrence_validator import validate_settings
1010
11+ DAYS_PER_WEEK = 7
1112
1213def is_match (settings : TimeWindowFilterSettings , now : datetime ) -> bool :
1314 """
@@ -36,8 +37,10 @@ def _get_previous_occurrence(settings: TimeWindowFilterSettings, now: datetime)
3637 pattern_type = settings .recurrence .pattern .type
3738 if pattern_type == RecurrencePatternType .DAILY :
3839 occurrence_info = _get_daily_previous_occurrence (settings , now )
39- else :
40+ elif pattern_type == RecurrencePatternType . WEEKLY :
4041 occurrence_info = _get_weekly_previous_occurrence (settings , now )
42+ else :
43+ raise ValueError (f"Invalid recurrence pattern type: %s" , pattern_type )
4144
4245 recurrence_range = settings .recurrence .range
4346 range_type = recurrence_range .type
@@ -74,16 +77,16 @@ def _get_weekly_previous_occurrence(settings: TimeWindowFilterSettings, now: dat
7477 start = settings .start
7578 first_day_of_first_week = start - timedelta (days = _get_passed_week_days (start .weekday (), pattern .first_day_of_week ))
7679
77- number_of_interval = (now - first_day_of_first_week ).days // (interval * 7 )
80+ number_of_interval = (now - first_day_of_first_week ).days // (interval * DAYS_PER_WEEK )
7881 first_day_of_most_recent_occurring_week = first_day_of_first_week + timedelta (
79- days = number_of_interval * (interval * 7 )
82+ days = number_of_interval * (interval * DAYS_PER_WEEK )
8083 )
8184 sorted_days_of_week = _sort_days_of_week (pattern .days_of_week , pattern .first_day_of_week )
8285 max_day_offset = _get_passed_week_days (sorted_days_of_week [- 1 ], pattern .first_day_of_week )
8386 min_day_offset = _get_passed_week_days (sorted_days_of_week [0 ], pattern .first_day_of_week )
8487 num_of_occurrences = number_of_interval * len (sorted_days_of_week ) - sorted_days_of_week .index (start .weekday ())
8588
86- if now > first_day_of_most_recent_occurring_week + timedelta (days = 7 ):
89+ if now > first_day_of_most_recent_occurring_week + timedelta (days = DAYS_PER_WEEK ):
8790 num_of_occurrences += len (sorted_days_of_week )
8891 most_recent_occurrence = first_day_of_most_recent_occurring_week + timedelta (days = max_day_offset )
8992 return OccurrenceInfo (most_recent_occurrence , num_of_occurrences )
@@ -94,7 +97,7 @@ def _get_weekly_previous_occurrence(settings: TimeWindowFilterSettings, now: dat
9497 day_with_min_offset = start
9598 if now < day_with_min_offset :
9699 most_recent_occurrence = (
97- first_day_of_most_recent_occurring_week - timedelta (days = interval * 7 ) + timedelta (days = max_day_offset )
100+ first_day_of_most_recent_occurring_week - timedelta (days = interval * DAYS_PER_WEEK ) + timedelta (days = max_day_offset )
98101 )
99102 else :
100103 most_recent_occurrence = day_with_min_offset
@@ -113,7 +116,14 @@ def _get_weekly_previous_occurrence(settings: TimeWindowFilterSettings, now: dat
113116
114117
115118def _get_passed_week_days (current_day : int , first_day_of_week : int ) -> int :
116- return (current_day - first_day_of_week + 7 ) % 7
119+ """
120+ Get the number of days passed since the first day of the week.
121+ :param int current_day: The current day of the week (0-6).
122+ :param int first_day_of_week: The first day of the week (0-6).
123+ :return: The number of days passed since the first day of the week.
124+ :rtype: int
125+ """
126+ return (current_day - first_day_of_week + DAYS_PER_WEEK ) % DAYS_PER_WEEK
117127
118128
119129def _sort_days_of_week (days_of_week : List [int ], first_day_of_week : int ) -> List [int ]:
0 commit comments