import re from datetime import date, timedelta from typing import Optional def day_of_time_table_change(year: int): """The yearly public transport timetable change is taking effect beginning of the 2nd Sunday in December according to https://mobilitaetsverbuende.atlassian.net/wiki/spaces/GEO/pages/181272612/Liniennetz. This function returns the first date of the new timetable for a given 4 digit year.""" first_of_december = date(year, 12, 1) weekday_of_first_december = first_of_december.weekday() # Monday 0 ... Sunday 6 days_until_first_sunday_in_december = 6 - weekday_of_first_december return date(year, 12, 1 + days_until_first_sunday_in_december + 7) def default_query_date(today: date) -> date: """Calculates a work_day after the date given, but before the schedule change on the second Sunday of December.""" change_date = day_of_time_table_change(today.year) query_date = change_date - timedelta(days=2) if query_date.day == 8: query_date -= timedelta(days=1) if query_date < today: return default_query_date(today + timedelta(days=14)) return query_date def vao_ext_id_to_ifopt_stop_id(vao_ext_id: str) -> Optional[str]: """Converts a VAO EXT ID like "476164600" to the IFOPT stop ID like "at:47:61646". In case the vao_ext_id cannot be converted, None is returned.""" if match := re.match(r'(4[1-9])(\d{5})00$', vao_ext_id): g1, g2 = match.groups() g2 = int(g2) return f"at:{g1}:{g2}" return None