diff --git a/agenda/__init__.py b/agenda/__init__.py index d004bc3..86c755b 100644 --- a/agenda/__init__.py +++ b/agenda/__init__.py @@ -21,6 +21,7 @@ import pytz import requests import yaml from dateutil.easter import easter +from dateutil.relativedelta import FR, relativedelta from agenda import thespacedevs @@ -307,44 +308,21 @@ def get_us_holidays(input_date: date) -> list[Event]: ] -def critical_mass(start_date: date) -> list[Event]: - """ - Return a list of the next 12 dates of the last Friday of the month on or after a given date. - - :param start_date: The date from which to start looking for last Fridays. - :type start_date: date - :return: List of next 12 last Fridays on or after the start_date. - :rtype: List[date] - """ +def critical_mass(start_date: date, limit: int = 12) -> list[Event]: + """Future dates for Critical Mass.""" events: list[Event] = [] + current_date = start_date - # Set current month and year based on the start_date - current_month = start_date.month - current_year = start_date.year - - for _ in range(12): - # Calculate the last day of the current month - if current_month == 12: - last_day_of_month = date(current_year + 1, 1, 1) - timedelta(days=1) - else: - last_day_of_month = date(current_year, current_month + 1, 1) - timedelta( - days=1 - ) - - # Find the last Friday of the current month - last_friday = last_day_of_month - while last_friday.weekday() != 4: # Monday is 0 and Sunday is 6 - last_friday -= timedelta(days=1) + for _ in range(limit): + # Calculate the last Friday of the current month + last_friday = current_date + relativedelta(day=31, weekday=FR(-1)) # Include it in the list only if it's on or after the start_date if last_friday >= start_date: events.append(Event(name="critical_mass", date=last_friday)) # Move to the next month - current_month += 1 - if current_month == 13: - current_month = 1 - current_year += 1 + current_date += relativedelta(months=1) return events