@@ -42,6 +42,27 @@ class Frequency(IntEnum):
4242 YEARLY = PBRecurrenceRule .FREQUENCY_YEARLY
4343
4444
45+ _RRULE_FREQ_MAP = {
46+ Frequency .MINUTELY : rrule .MINUTELY ,
47+ Frequency .HOURLY : rrule .HOURLY ,
48+ Frequency .DAILY : rrule .DAILY ,
49+ Frequency .WEEKLY : rrule .WEEKLY ,
50+ Frequency .MONTHLY : rrule .MONTHLY ,
51+ }
52+ """To map from our Frequency enum to the dateutil library enum."""
53+
54+ _RRULE_WEEKDAY_MAP = {
55+ Weekday .MONDAY : rrule .MO ,
56+ Weekday .TUESDAY : rrule .TU ,
57+ Weekday .WEDNESDAY : rrule .WE ,
58+ Weekday .THURSDAY : rrule .TH ,
59+ Weekday .FRIDAY : rrule .FR ,
60+ Weekday .SATURDAY : rrule .SA ,
61+ Weekday .SUNDAY : rrule .SU ,
62+ }
63+ """To map from our Weekday enum to the dateutil library enum."""
64+
65+
4566@dataclass (kw_only = True )
4667class EndCriteria :
4768 """Controls when a recurring dispatch should end."""
@@ -164,3 +185,33 @@ def to_protobuf(self) -> PBRecurrenceRule:
164185 pb_rule .bymonths .extend (self .bymonths )
165186
166187 return pb_rule
188+
189+ def prepare (self , start_time : datetime ) -> rrule .rrule :
190+ """Prepare the rrule object.
191+
192+ Args:
193+ start_time: The start time of the dispatch.
194+
195+ Returns:
196+ The rrule object.
197+ """
198+ count , until = (None , None )
199+ if end := self .end_criteria :
200+ count = end .count
201+ until = end .until
202+
203+ rrule_obj = rrule .rrule (
204+ freq = _RRULE_FREQ_MAP [self .frequency ],
205+ dtstart = start_time ,
206+ count = count ,
207+ until = until ,
208+ byminute = self .byminutes or None ,
209+ byhour = self .byhours or None ,
210+ byweekday = [_RRULE_WEEKDAY_MAP [weekday ] for weekday in self .byweekdays ]
211+ or None ,
212+ bymonthday = self .bymonthdays or None ,
213+ bymonth = self .bymonths or None ,
214+ interval = self .interval ,
215+ )
216+
217+ return rrule_obj
0 commit comments