"""The interface for timezone implementations.""" from __future__ import annotations from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Optional if TYPE_CHECKING: from datetime import datetime, tzinfo from dateutil.rrule import rrule from icalendar import prop class TZProvider(ABC): """Interface for timezone implementations.""" @property @abstractmethod def name(self) -> str: """The name of the implementation.""" @abstractmethod def localize_utc(self, dt: datetime) -> datetime: """Return the datetime in UTC.""" @abstractmethod def localize(self, dt: datetime, tz: tzinfo) -> datetime: """Localize a datetime to a timezone.""" @abstractmethod def knows_timezone_id(self, id: str) -> bool: """Whether the timezone is already cached by the implementation.""" @abstractmethod def fix_rrule_until(self, rrule: rrule, ical_rrule: prop.vRecur) -> None: """Make sure the until value works for the rrule generated from the ical_rrule.""" @abstractmethod def create_timezone(self, name: str, transition_times, transition_info) -> tzinfo: """Create a pytz timezone file given information.""" @abstractmethod def timezone(self, name: str) -> Optional[tzinfo]: """Return a timezone with a name or None if we cannot find it.""" @abstractmethod def uses_pytz(self) -> bool: """Whether we use pytz.""" @abstractmethod def uses_zoneinfo(self) -> bool: """Whether we use zoneinfo.""" __all__ = ["TZProvider"]