From b68654e4aca0bba2a8ce030b6b2f601d2784cd53 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Tue, 3 Oct 2023 09:27:03 +0100 Subject: [PATCH 1/2] Functions take input_date instead of assuming today --- agenda/__init__.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/agenda/__init__.py b/agenda/__init__.py index 74770dd..98f8a38 100644 --- a/agenda/__init__.py +++ b/agenda/__init__.py @@ -49,9 +49,9 @@ access_key = config.get("exchangerate", "access_key") data_dir = config.get("data", "dir") -def next_uk_mothers_day() -> date: +def next_uk_mothers_day(input_date: date) -> date: """Calculate the date of the next UK Mother's Day from the current date.""" - current_year = date.today().year + current_year = input_date.year easter_date = easter(current_year) @@ -59,23 +59,19 @@ def next_uk_mothers_day() -> date: mothers_day = easter_date + timedelta(weeks=3) # Check if Mother's Day has already passed this year - today = date.today() - if today > mothers_day: + if input_date > mothers_day: # If it has passed, calculate for the next year - current_year += 1 - easter_date = easter(current_year) + easter_date = easter(current_year + 1) mothers_day = easter_date + timedelta(weeks=3) return mothers_day -def next_uk_fathers_day() -> date: +def next_uk_fathers_day(input_date: date) -> date: """Calculate the date of the next UK Father's Day from the current date.""" # Get the current date - today = date.today() - # Calculate the day of the week for the current date (0 = Monday, 6 = Sunday) - current_day_of_week = today.weekday() + current_day_of_week = input_date.weekday() # Calculate the number of days until the next Sunday days_until_sunday = (6 - current_day_of_week) % 7 @@ -238,8 +234,8 @@ def get_data() -> dict[str, str | object]: "stock_markets": stock_markets(), "uk_clock_change": get_next_timezone_transition("Europe/London"), "us_clock_change": get_next_timezone_transition("America/New_York"), - "mothers_day": next_uk_mothers_day(), - "fathers_day": next_uk_fathers_day(), + "mothers_day": next_uk_mothers_day(today), + "fathers_day": next_uk_fathers_day(today), } return reply From 14133f591c2d35389f7ba7fbaf305c2d61db2be6 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Tue, 3 Oct 2023 09:27:14 +0100 Subject: [PATCH 2/2] Economist summer and Christmas double issues Closes: #9 --- agenda/__init__.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/agenda/__init__.py b/agenda/__init__.py index 98f8a38..021fdba 100644 --- a/agenda/__init__.py +++ b/agenda/__init__.py @@ -152,10 +152,33 @@ def get_gbpusd() -> Decimal: return typing.cast(Decimal, 1 / data["quotes"]["USDGBP"]) -def next_economist() -> date: +def next_economist(input_date: date) -> date: """Next date that the Economist is published.""" - # TODO: handle the Christmas double issue correctly - return today + timedelta((3 - today.weekday()) % 7) + # Define the publication day (Thursday) and the day of the week of the input date + publication_day = 3 # Thursday (0 - Monday, 1 - Tuesday, ..., 6 - Sunday) + current_day_of_week = input_date.weekday() + current_week_number = today.isocalendar().week + + # Define the list of weeks when The Economist is not published + non_publication_weeks = [26, 56] + + # Check if the input date is a publication day (Thursday) + if ( + current_day_of_week == publication_day + and current_week_number not in non_publication_weeks + ): + return input_date + + # Calculate the date for the next Thursday after the input date + days_until_next_thursday = (publication_day - current_day_of_week + 7) % 7 + next_thursday_date = input_date + timedelta(days=days_until_next_thursday) + + # Check if the next Thursday falls in a non-publication week + while next_thursday_date.isocalendar().week in non_publication_weeks: + # If it does, add 7 days to find the next Thursday + next_thursday_date += timedelta(days=7) + + return next_thursday_date def timedelta_display(delta: timedelta) -> str: @@ -225,7 +248,7 @@ def get_data() -> dict[str, str | object]: reply = { "now": now, "gbpusd": get_gbpusd(), - "next_economist": next_economist(), + "next_economist": next_economist(today), "bank_holiday": get_next_bank_holiday(), "us_holiday": get_us_holiday(), "next_uk_general_election": next_uk_general_election,