diff --git a/pyproject.toml b/pyproject.toml index a21d4cd..3d53741 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" packages = [{include = "dnidatetime", from = "src"}] [tool.poetry.dependencies] -python = "^3.11" +python = ">=3.10" [tool.poetry.group.dev.dependencies] pylint = "^3.1.0" diff --git a/src/dnidatetime/constants.py b/src/dnidatetime/constants.py index 8bcc95a..be04f74 100644 --- a/src/dnidatetime/constants.py +++ b/src/dnidatetime/constants.py @@ -2,11 +2,10 @@ from collections import OrderedDict from datetime import datetime, timezone -from typing import Tuple, TypedDict - +from typing import TypedDict #: Type alias for a seven-integer tuple used in a datetime timestamp. -DniDateTimeTuple = Tuple[int, int, int, int, int, int, int] +DniDateTimeTuple = tuple[int, int, int, int, int, int, int] class DniUnitType(TypedDict): @@ -64,34 +63,34 @@ DNI_EPOCH_HAHR = 9647 #: delta_ms_1900_to_1970 = -2208988800000 #: leap_ms = leap_sec_from_ietf * 1000 + delta_ms_1900_to_1970 LEAP_MS_FROM_EPOCH = [ - 63072000000, # 1 Jan 1972 - 78796800000, # 1 Jul 1972 - 94694400000, # 1 Jan 1973 - 126230400000, # 1 Jan 1974 - 157766400000, # 1 Jan 1975 - 189302400000, # 1 Jan 1976 - 220924800000, # 1 Jan 1977 - 252460800000, # 1 Jan 1978 - 283996800000, # 1 Jan 1979 - 315532800000, # 1 Jan 1980 - 362793600000, # 1 Jul 1981 - 394329600000, # 1 Jul 1982 - 425865600000, # 1 Jul 1983 - 489024000000, # 1 Jul 1985 - 567993600000, # 1 Jan 1988 - 631152000000, # 1 Jan 1990 - 662688000000, # 1 Jan 1991 - 709948800000, # 1 Jul 1992 - 741484800000, # 1 Jul 1993 - 773020800000, # 1 Jul 1994 - 820454400000, # 1 Jan 1996 - 867715200000, # 1 Jul 1997 - 915148800000, # 1 Jan 1999 - 1136073600000, # 1 Jan 2006 - 1230768000000, # 1 Jan 2009 - 1341100800000, # 1 Jul 2012 - 1435708800000, # 1 Jul 2015 - 1483228800000, # 1 Jan 2017 + 63072000000, # 1 Jan 1972 + 78796800000, # 1 Jul 1972 + 94694400000, # 1 Jan 1973 + 126230400000, # 1 Jan 1974 + 157766400000, # 1 Jan 1975 + 189302400000, # 1 Jan 1976 + 220924800000, # 1 Jan 1977 + 252460800000, # 1 Jan 1978 + 283996800000, # 1 Jan 1979 + 315532800000, # 1 Jan 1980 + 362793600000, # 1 Jul 1981 + 394329600000, # 1 Jul 1982 + 425865600000, # 1 Jul 1983 + 489024000000, # 1 Jul 1985 + 567993600000, # 1 Jan 1988 + 631152000000, # 1 Jan 1990 + 662688000000, # 1 Jan 1991 + 709948800000, # 1 Jul 1992 + 741484800000, # 1 Jul 1993 + 773020800000, # 1 Jul 1994 + 820454400000, # 1 Jan 1996 + 867715200000, # 1 Jul 1997 + 915148800000, # 1 Jan 1999 + 1136073600000, # 1 Jan 2006 + 1230768000000, # 1 Jan 2009 + 1341100800000, # 1 Jul 2012 + 1435708800000, # 1 Jul 2015 + 1483228800000, # 1 Jan 2017 ] #: A carry-over from the Python datetime module for timedelta objects. Might diff --git a/src/dnidatetime/conversions.py b/src/dnidatetime/conversions.py index b4050a5..bc7c196 100644 --- a/src/dnidatetime/conversions.py +++ b/src/dnidatetime/conversions.py @@ -2,10 +2,8 @@ from datetime import datetime, timezone from math import floor -from typing import Dict, Optional, Tuple from .constants import ( - DniDateTimeTuple, DNI_EPOCH_EDT, DNI_EPOCH_HAHR, DNI_UNITS, @@ -13,17 +11,16 @@ from .constants import ( MIN_DNI_ORDINAL, MS_PER_HAHR, MS_PER_PRORAHN, - YAHRTEE_BEFORE_VAILEE + YAHRTEE_BEFORE_VAILEE, + DniDateTimeTuple, ) - from .utils import ( check_dni_date_fields, get_adj_ms_from_epoch, get_ms_from_epoch, - is_timezone_aware + is_timezone_aware, ) - # Number of yahrtee (days) in a hahr (year) == 290. _YAHR_IN_HAHR = DNI_UNITS["yahr"]["max"] * DNI_UNITS["vailee"]["max"] @@ -35,7 +32,7 @@ def hvy2ord(hahr: int, vailee: int, yahr: int) -> int: return yahr_before_hahr + YAHRTEE_BEFORE_VAILEE[ok_vailee] + ok_yahr -def ord2hvy(ordinal: int) -> Tuple[int, int, int]: +def ord2hvy(ordinal: int) -> tuple[int, int, int]: """Find the exact hahr, vailee, and yahr from an ordinal value of yahrtee. """ @@ -53,19 +50,14 @@ def ord2hvy(ordinal: int) -> Tuple[int, int, int]: vailee = DNI_UNITS["vailee"]["max"] yahr = DNI_UNITS["yahr"]["max"] else: - vailee, yahr = divmod( - rem + DNI_UNITS["yahr"]["max"], - DNI_UNITS["yahr"]["max"] - ) + vailee, yahr = divmod(rem + DNI_UNITS["yahr"]["max"], DNI_UNITS["yahr"]["max"]) if yahr == 0: vailee -= 1 yahr = DNI_UNITS["yahr"]["max"] return hahr, vailee, yahr -def earth_to_dni( - date_time: Optional[datetime] = None -) -> DniDateTimeTuple: +def earth_to_dni(date_time: datetime | None = None) -> DniDateTimeTuple: """Converts an Earth gregorian datetime to a D'Ni datetime.""" if date_time is None: moment = datetime.now(timezone.utc) @@ -75,7 +67,7 @@ def earth_to_dni( else: raise ValueError("Supplied datetime must be timezone aware.") - dni_dt: Dict[str, int] = {} + dni_dt: dict[str, int] = {} stamp = get_adj_ms_from_epoch(moment) dni_epoch = get_adj_ms_from_epoch(DNI_EPOCH_EDT) @@ -125,13 +117,13 @@ def dni_to_earth(dni_date_time: DniDateTimeTuple) -> datetime: "D'Ni datetime must be in the form of a timetuple. " "See DniDateTime.timetuple()." ), - dni_date_time + dni_date_time, ) if len(dni_date_time) != 7: raise ValueError( "The D'Ni timetuple is malformed. See DniDateTime.timetuple().", - dni_date_time + dni_date_time, ) temp_units = list(dni_date_time) diff --git a/src/dnidatetime/dnidate.py b/src/dnidatetime/dnidate.py index 6c98d36..4cd8b08 100644 --- a/src/dnidatetime/dnidate.py +++ b/src/dnidatetime/dnidate.py @@ -1,8 +1,10 @@ """The DniDate class.""" -from typing import Any, Optional, TYPE_CHECKING, Union +from __future__ import annotations -from .constants import DniDateTimeTuple, DNI_UNITS, MAX_DNI_ORDINAL +from typing import TYPE_CHECKING, Any + +from .constants import DNI_UNITS, MAX_DNI_ORDINAL, DniDateTimeTuple from .conversions import hvy2ord, ord2hvy from .dnitimedelta import DniTimedelta from .utils import check_dni_date_fields, cmp @@ -19,8 +21,8 @@ class DniDate: _yahr: int # Class properties - min: "DniDate" - max: "DniDate" + min: DniDate + max: DniDate resolution: DniTimedelta def __new__( @@ -28,7 +30,7 @@ class DniDate: hahr: int = DNI_UNITS["hahr"]["min"], vailee: int = DNI_UNITS["vailee"]["min"], yahr: int = DNI_UNITS["yahr"]["min"], - ) -> "DniDate": + ) -> DniDate: if isinstance(hahr, int): hahr, vailee, yahr = check_dni_date_fields(hahr, vailee, yahr) self = object.__new__(cls) @@ -39,7 +41,7 @@ class DniDate: return NotImplemented @classmethod - def from_dnitimestamp(cls, prorahntee: int) -> "DniDate": + def from_dnitimestamp(cls, prorahntee: int) -> DniDate: """Construct a D'Ni date from a D'Ni timestamp.""" yahrtee = prorahntee // DNI_UNITS["yahr"]["total_pro"] return cls.from_ordinal(yahrtee) @@ -50,7 +52,7 @@ class DniDate: return NotImplemented @classmethod - def from_isoformat(cls, date_str: str) -> "DniDate": + def from_isoformat(cls, date_str: str) -> DniDate: if not isinstance(date_str, str): raise TypeError("from_isoformat: argument must be str.") @@ -64,7 +66,7 @@ class DniDate: raise ValueError(f"Invalid isoformat string: {date_str!r}") from exc @classmethod - def from_ordinal(cls, yahrtee: int) -> "DniDate": + def from_ordinal(cls, yahrtee: int) -> DniDate: """Construct a D'ni date from a D'ni ordinal.""" hahr, vailee, yahr = ord2hvy(yahrtee) return cls(hahr, vailee, yahr) @@ -105,10 +107,10 @@ class DniDate: def replace( self, - hahr: Optional[int] = None, - vailee: Optional[int] = None, - yahr: Optional[int] = None, - ) -> "DniDate": + hahr: int | None = None, + vailee: int | None = None, + yahr: int | None = None, + ) -> DniDate: """Return a new D'ni date with new values for the specified fields.""" if hahr is None: hahr = self._hahr @@ -119,7 +121,7 @@ class DniDate: return type(self)(hahr, vailee, yahr) # Arithmetic - def __add__(self, other: Any) -> "DniDate": + def __add__(self, other: Any) -> DniDate: if isinstance(other, DniTimedelta): ordinal = self.to_ordinal() + other._yahrtee if 0 < ordinal <= MAX_DNI_ORDINAL: @@ -129,7 +131,7 @@ class DniDate: __radd__ = __add__ - def __sub__(self, other: Any) -> Union["DniDate", DniTimedelta]: + def __sub__(self, other: Any) -> DniDate | DniTimedelta: if isinstance(other, DniTimedelta): return self + DniTimedelta(-other._yahrtee) if isinstance(other, DniDate): diff --git a/src/dnidatetime/dnidatetime.py b/src/dnidatetime/dnidatetime.py index 367e218..2bc5b9d 100644 --- a/src/dnidatetime/dnidatetime.py +++ b/src/dnidatetime/dnidatetime.py @@ -1,14 +1,11 @@ """The DniDatetime class.""" -from datetime import datetime, timedelta, timezone -from typing import Any, Optional, TYPE_CHECKING, Union +from __future__ import annotations -from .constants import ( - DniDateTimeTuple, - DNI_EPOCH_HAHR, - DNI_UNITS, - MAX_DNI_ORDINAL -) +from datetime import datetime, timedelta, timezone +from typing import TYPE_CHECKING, Any + +from .constants import DNI_EPOCH_HAHR, DNI_UNITS, MAX_DNI_ORDINAL, DniDateTimeTuple from .conversions import dni_to_earth, earth_to_dni, hvy2ord from .dnidate import DniDate from .dnitime import DniTime @@ -31,8 +28,8 @@ class DniDatetime: _prorahn: int # Class properties - min: "DniDatetime" - max: "DniDatetime" + min: DniDatetime + max: DniDatetime resolution: DniTimedelta def __new__( @@ -44,7 +41,7 @@ class DniDatetime: tahvo: int = DNI_UNITS["tahvo"]["min"], gorahn: int = DNI_UNITS["gorahn"]["min"], prorahn: int = DNI_UNITS["prorahn"]["min"], - ) -> "DniDatetime": + ) -> DniDatetime: if isinstance(hahr, int): hahr, vailee, yahr = check_dni_date_fields(hahr, vailee, yahr) gahrtahvo, tahvo, gorahn, prorahn = check_dni_time_fields( @@ -121,13 +118,13 @@ class DniDatetime: def replace( self, - hahr: Optional[int] = None, - vailee: Optional[int] = None, - yahr: Optional[int] = None, - gahrtahvo: Optional[int] = None, - tahvo: Optional[int] = None, - gorahn: Optional[int] = None, - prorahn: Optional[int] = None, + hahr: int | None = None, + vailee: int | None = None, + yahr: int | None = None, + gahrtahvo: int | None = None, + tahvo: int | None = None, + gorahn: int | None = None, + prorahn: int | None = None, ) -> "DniDatetime": """Return a new D'ni datetime with new values for the specified fields.""" if hahr is None: @@ -147,7 +144,7 @@ class DniDatetime: return type(self)(hahr, vailee, yahr, gahrtahvo, tahvo, gorahn, prorahn) # Arithmetic - def __add__(self, other: Any) -> "DniDatetime": + def __add__(self, other: Any) -> DniDatetime: if not isinstance(other, (timedelta, DniTimedelta)): return NotImplemented if isinstance(other, timedelta): @@ -173,7 +170,7 @@ class DniDatetime: __radd__ = __add__ - def __sub__(self, other: Any) -> Union["DniDatetime", DniTimedelta]: + def __sub__(self, other: Any) -> DniDatetime | DniTimedelta: if not isinstance(other, DniDatetime): if isinstance(other, timedelta): return self + -other @@ -266,7 +263,7 @@ class DniDatetime: def timestamp(self) -> int: """Return total number of prorahntee since the D'ni epoch.""" - return (self - DNI_EPOCH_DDT).total_prorahntee() #type: ignore + return (self - DNI_EPOCH_DDT).total_prorahntee() # type: ignore def timetuple(self) -> DniDateTimeTuple: """Return the DniDateTime in the form of a timetuple.""" @@ -277,7 +274,7 @@ class DniDatetime: self._gahrtahvo, self._tahvo, self._gorahn, - self._prorahn + self._prorahn, ) def to_ordinal(self) -> int: @@ -285,7 +282,7 @@ class DniDatetime: return hvy2ord(self._hahr, self._vailee, self._yahr) @classmethod - def combine(cls, date_obj: DniDate, time_obj: DniTime) -> "DniDatetime": + def combine(cls, date_obj: DniDate, time_obj: DniTime) -> DniDatetime: """Construct a D'ni datetime from a given DniDate and DniTime.""" # pylint: disable=protected-access if not isinstance(date_obj, DniDate): @@ -302,12 +299,12 @@ class DniDatetime: time_obj._prorahn, ) - def to_earth(self, tz: Optional[timezone] = timezone.utc) -> datetime: + def to_earth(self, tz: timezone | None = timezone.utc) -> datetime: """Create an earth datetime from a DniDatetime.""" return dni_to_earth(self.timetuple()).astimezone(tz) @classmethod - def from_earth(cls, date_time: datetime) -> "DniDatetime": + def from_earth(cls, date_time: datetime) -> DniDatetime: """Create a DniDatetime from an earth datetime.""" ddt = earth_to_dni(date_time) return cls(*ddt) diff --git a/src/dnidatetime/dnitime.py b/src/dnidatetime/dnitime.py index da0eb7d..2eb26d0 100644 --- a/src/dnidatetime/dnitime.py +++ b/src/dnidatetime/dnitime.py @@ -1,6 +1,8 @@ """The DniTime class.""" -from typing import Any, Optional, TYPE_CHECKING +from __future__ import annotations + +from typing import TYPE_CHECKING, Any from .constants import DNI_UNITS from .dnitimedelta import DniTimedelta @@ -19,8 +21,8 @@ class DniTime: _prorahn: int # Class properties - min: "DniTime" - max: "DniTime" + min: DniTime + max: DniTime resolution: DniTimedelta def __new__( @@ -29,7 +31,7 @@ class DniTime: tahvo: int = DNI_UNITS["tahvo"]["min"], gorahn: int = DNI_UNITS["gorahn"]["min"], prorahn: int = DNI_UNITS["prorahn"]["min"], - ) -> "DniTime": + ) -> DniTime: gahrtahvo, tahvo, gorahn, prorahn = check_dni_time_fields( gahrtahvo, tahvo, gorahn, prorahn ) @@ -41,7 +43,7 @@ class DniTime: return self @classmethod - def from_isoformat(cls, time_str: str) -> "DniTime": + def from_isoformat(cls, time_str: str) -> DniTime: if not isinstance(time_str, str): raise TypeError("from_isoformat: argument must be str.") @@ -95,11 +97,11 @@ class DniTime: def replace( self, - gahrtahvo: Optional[int] = None, - tahvo: Optional[int] = None, - gorahn: Optional[int] = None, - prorahn: Optional[int] = None, - ) -> "DniTime": + gahrtahvo: int | None = None, + tahvo: int | None = None, + gorahn: int | None = None, + prorahn: int | None = None, + ) -> DniTime: """Return a new D'ni time with new values for the specified fields.""" if gahrtahvo is None: gahrtahvo = self._gahrtahvo diff --git a/src/dnidatetime/dnitimedelta.py b/src/dnidatetime/dnitimedelta.py index 28a3a0b..ffe4252 100644 --- a/src/dnidatetime/dnitimedelta.py +++ b/src/dnidatetime/dnitimedelta.py @@ -1,8 +1,10 @@ """The DniTimedelta class.""" +from __future__ import annotations + from datetime import timedelta from math import modf -from typing import Any, Tuple, TYPE_CHECKING, Union +from typing import TYPE_CHECKING, Any, Self from .constants import DNI_UNITS, MAX_DNI_DELTA_YAHRTEE, MS_PER_PRORAHN from .utils import cmp, divide_and_round @@ -19,19 +21,19 @@ class DniTimedelta: _prorahntee: int # Class properties - min: "DniTimedelta" - max: "DniTimedelta" - resolution: "DniTimedelta" + min: DniTimedelta + max: DniTimedelta + resolution: DniTimedelta def __new__( cls, - yahrtee: Union[float, int] = 0, - pahrtahvotee: Union[float, int] = 0, - prorahntee: Union[float, int] = 0, - gorahntee: Union[float, int] = 0, - tahvotee: Union[float, int] = 0, - gahrtahvotee: Union[float, int] = 0, - vaileetee: Union[float, int] = 0, + yahrtee: float | int = 0, + pahrtahvotee: float | int = 0, + prorahntee: float | int = 0, + gorahntee: float | int = 0, + tahvotee: float | int = 0, + gahrtahvotee: float | int = 0, + vaileetee: float | int = 0, ) -> "DniTimedelta": # Final values are integer. yahr: int = 0 @@ -165,7 +167,7 @@ class DniTimedelta: return self._prorahntee # Arithmetic functions - def __add__(self, other: Any) -> "DniTimedelta": + def __add__(self, other: Any) -> DniTimedelta: if isinstance(other, (timedelta, DniTimedelta)): if isinstance(other, timedelta): other = self.from_timedelta(other) @@ -178,7 +180,7 @@ class DniTimedelta: __radd__ = __add__ - def __sub__(self, other: Any) -> "DniTimedelta": + def __sub__(self, other: Any) -> DniTimedelta: if isinstance(other, (timedelta, DniTimedelta)): if isinstance(other, timedelta): other = self.from_timedelta(other) @@ -189,25 +191,25 @@ class DniTimedelta: ) return NotImplemented - def __rsub__(self, other: Any) -> "DniTimedelta": + def __rsub__(self, other: Any) -> DniTimedelta: if isinstance(other, (timedelta, DniTimedelta)): if isinstance(other, timedelta): other = self.from_timedelta(other) return -self + other return NotImplemented - def __neg__(self) -> "DniTimedelta": + def __neg__(self) -> DniTimedelta: return DniTimedelta(-self._yahrtee, -self._pahrtahvotee, -self._prorahntee) - def __pos__(self) -> "DniTimedelta": + def __pos__(self) -> DniTimedelta: return self - def __abs__(self) -> "DniTimedelta": + def __abs__(self) -> DniTimedelta: if self._yahrtee < 0: return -self return self - def __mul__(self, other: Any) -> "DniTimedelta": + def __mul__(self, other: Any) -> DniTimedelta: if isinstance(other, int): return DniTimedelta( self._yahrtee * other, @@ -222,7 +224,7 @@ class DniTimedelta: __rmul__ = __mul__ - def __floordiv__(self, other: Any) -> Union["DniTimedelta", int]: + def __floordiv__(self, other: Any) -> DniTimedelta | int: if not isinstance(other, (int, DniTimedelta)): return NotImplemented pro = self.total_prorahntee() @@ -231,7 +233,7 @@ class DniTimedelta: if isinstance(other, int): return DniTimedelta(0, 0, pro // other) - def __truediv__(self, other: Any) -> Union["DniTimedelta", float]: + def __truediv__(self, other: Any) -> DniTimedelta | float: if not isinstance(other, (float, int, DniTimedelta)): return NotImplemented pro = self.total_prorahntee() @@ -243,13 +245,13 @@ class DniTimedelta: if isinstance(other, int): return DniTimedelta(0, 0, divide_and_round(pro, other)) - def __mod__(self, other: Any) -> "DniTimedelta": + def __mod__(self, other: Any) -> DniTimedelta: if isinstance(other, DniTimedelta): rem = self.total_prorahntee() % other.total_prorahntee() return DniTimedelta(0, 0, rem) return NotImplemented - def __divmod__(self, other: Any) -> Tuple[int, "DniTimedelta"]: + def __divmod__(self, other: Any) -> tuple[int, DniTimedelta]: if isinstance(other, DniTimedelta): quot, rem = divmod(self.total_prorahntee(), other.total_prorahntee()) return quot, DniTimedelta(0, 0, rem) @@ -290,7 +292,7 @@ class DniTimedelta: return self._yahrtee != 0 or self._pahrtahvotee != 0 or self._prorahntee != 0 @classmethod - def from_timedelta(cls, delta: timedelta) -> "DniTimedelta": + def from_timedelta(cls, delta: timedelta) -> DniTimedelta: """Converts a normal timedelta to a D'Ni timedelta.""" prorahntee = delta.total_seconds() * 1000 / MS_PER_PRORAHN return cls(prorahntee=prorahntee) diff --git a/src/dnidatetime/utils.py b/src/dnidatetime/utils.py index 8134bfc..1802a0d 100644 --- a/src/dnidatetime/utils.py +++ b/src/dnidatetime/utils.py @@ -3,7 +3,7 @@ # pylint: disable=line-too-long from datetime import datetime, timedelta, timezone -from typing import Any, Optional, Tuple, Union +from typing import Any from .constants import DNI_UNITS, EARTH_EPOCH, LEAP_MS_FROM_EPOCH @@ -18,7 +18,7 @@ def cmp(x: Any, y: Any) -> int: return 0 if x == y else 1 if x > y else -1 -def divide_and_round(a: Union[float, int], b: Union[float, int]) -> int: +def divide_and_round(a: float | int, b: float | int) -> int: """Divide a by b and round result to the nearest integer. When the ratio is exactly half-way between two integers, the even integer is returned. """ @@ -35,7 +35,7 @@ def check_dni_date_fields( hahr: int = DNI_UNITS["hahr"]["min"], vailee: int = DNI_UNITS["vailee"]["min"], yahr: int = DNI_UNITS["yahr"]["min"], -) -> Tuple[int, int, int]: +) -> tuple[int, int, int]: """Verifies the D'Ni date fields are within proper boundaries.""" if not DNI_UNITS["hahr"]["min"] <= hahr <= DNI_UNITS["hahr"]["max"]: raise ValueError( @@ -60,7 +60,7 @@ def check_dni_time_fields( tahvo: int = DNI_UNITS["tahvo"]["min"], gorahn: int = DNI_UNITS["gorahn"]["min"], prorahn: int = DNI_UNITS["prorahn"]["min"], -) -> Tuple[int, int, int, int]: +) -> tuple[int, int, int, int]: """Verifies the D'Ni time fields are within proper boundaries.""" if ( not DNI_UNITS["gahrtahvo"]["min"] @@ -76,20 +76,12 @@ def check_dni_time_fields( f"Tahvo must be in {DNI_UNITS['tahvo']['min']}..{DNI_UNITS['tahvo']['max'] - 1}", tahvo, ) - if ( - not DNI_UNITS["gorahn"]["min"] - <= gorahn - <= DNI_UNITS["gorahn"]["max"] - 1 - ): + if not DNI_UNITS["gorahn"]["min"] <= gorahn <= DNI_UNITS["gorahn"]["max"] - 1: raise ValueError( f"Gorahn must be in {DNI_UNITS['gorahn']['min']}..{DNI_UNITS['gorahn']['max'] - 1}", gorahn, ) - if ( - not DNI_UNITS["prorahn"]["min"] - <= prorahn - <= DNI_UNITS["prorahn"]["max"] - 1 - ): + if not DNI_UNITS["prorahn"]["min"] <= prorahn <= DNI_UNITS["prorahn"]["max"] - 1: raise ValueError( f"Prorahn must be in {DNI_UNITS['prorahn']['min']}..{DNI_UNITS['prorahn']['max'] - 1}", prorahn, @@ -111,7 +103,7 @@ def add_leap_seconds(timestamp: int) -> int: return timestamp + (leap_seconds * 1000) -def get_ms_from_epoch(date_time: Optional[datetime] = None) -> int: +def get_ms_from_epoch(date_time: datetime | None = None) -> int: """ Returns the amount of milliseconds since the UNIX epoch (1-1-1970). """ @@ -124,7 +116,7 @@ def get_ms_from_epoch(date_time: Optional[datetime] = None) -> int: return ((date - EARTH_EPOCH) // timedelta(microseconds=1)) // 1000 -def get_adj_ms_from_epoch(date_time: Optional[datetime] = None) -> int: +def get_adj_ms_from_epoch(date_time: datetime | None = None) -> int: """ Returns the amount of milliseconds since the UNIX epoch (1-1-1970), but also accounting for leap seconds.