Convert WWVBMinute to dataclass
This has the effect of making WWVBMinute instances mutable now.
This commit is contained in:
parent
6f03ba274e
commit
bf9a98e8e8
1 changed files with 19 additions and 36 deletions
|
|
@ -12,7 +12,7 @@ import datetime
|
||||||
import enum
|
import enum
|
||||||
import json
|
import json
|
||||||
import warnings
|
import warnings
|
||||||
from typing import TYPE_CHECKING, Any, NamedTuple, TextIO, TypeVar
|
from typing import TYPE_CHECKING, Any, ClassVar, TextIO, TypeVar
|
||||||
|
|
||||||
from . import iersdata
|
from . import iersdata
|
||||||
from .tz import Mountain
|
from .tz import Mountain
|
||||||
|
|
@ -324,7 +324,8 @@ _dst_ls_lut = [
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class _WWVBMinute(NamedTuple):
|
@dataclasses.dataclass
|
||||||
|
class WWVBMinute:
|
||||||
"""Uniquely identifies a minute of time in the WWVB system.
|
"""Uniquely identifies a minute of time in the WWVB system.
|
||||||
|
|
||||||
To use ut1 and ls information from IERS, create a WWVBMinuteIERS value instead.
|
To use ut1 and ls information from IERS, create a WWVBMinuteIERS value instead.
|
||||||
|
|
@ -342,51 +343,33 @@ class _WWVBMinute(NamedTuple):
|
||||||
min: int
|
min: int
|
||||||
"""Minute of hour"""
|
"""Minute of hour"""
|
||||||
|
|
||||||
dst: int
|
dst: int | None = None
|
||||||
"""2-bit DST code """
|
"""2-bit DST code """
|
||||||
|
|
||||||
ut1: int
|
ut1: int | None = None
|
||||||
"""UT1 offset in units of 100ms, range -900 to +900ms"""
|
"""UT1 offset in units of 100ms, range -900 to +900ms"""
|
||||||
|
|
||||||
ls: bool
|
ls: bool | None = None
|
||||||
"""Leap second warning flag"""
|
"""Leap second warning flag"""
|
||||||
|
|
||||||
ly: bool
|
ly: bool | None = None
|
||||||
"""Leap year flag"""
|
"""Leap year flag"""
|
||||||
|
|
||||||
|
epoch: ClassVar[int] = 1970
|
||||||
|
|
||||||
class WWVBMinute(_WWVBMinute):
|
def __post_init__(self):
|
||||||
"""Uniquely identifies a minute of time in the WWVB system.
|
"""Fill the optional members if not otherwise set"""
|
||||||
|
if self.dst is None:
|
||||||
To use ut1 and ls information from IERS, create a WWVBMinuteIERS value instead.
|
self.dst = self.get_dst(self.year, self.days)
|
||||||
"""
|
if self.dst not in (0, 1, 2, 3):
|
||||||
|
|
||||||
epoch: int = 1970
|
|
||||||
|
|
||||||
def __new__( # noqa: PYI034
|
|
||||||
cls,
|
|
||||||
year: int,
|
|
||||||
days: int,
|
|
||||||
hour: int,
|
|
||||||
minute: int,
|
|
||||||
dst: int | None = None,
|
|
||||||
ut1: int | None = None,
|
|
||||||
ls: bool | None = None,
|
|
||||||
ly: bool | None = None,
|
|
||||||
) -> WWVBMinute:
|
|
||||||
"""Construct a WWVBMinute"""
|
|
||||||
if dst is None:
|
|
||||||
dst = cls.get_dst(year, days)
|
|
||||||
if dst not in (0, 1, 2, 3):
|
|
||||||
raise ValueError("dst value should be 0..3")
|
raise ValueError("dst value should be 0..3")
|
||||||
if ut1 is None and ls is None:
|
if self.ut1 is None and self.ls is None:
|
||||||
ut1, ls = cls._get_dut1_info(year, days)
|
self.ut1, self.ls = self._get_dut1_info(self.year, self.days)
|
||||||
elif ut1 is None or ls is None:
|
elif self.ut1 is None or self.ls is None:
|
||||||
raise ValueError("sepecify both ut1 and ls or neither one")
|
raise ValueError("sepecify both ut1 and ls or neither one")
|
||||||
year = cls.full_year(year)
|
self.year = self.full_year(self.year)
|
||||||
if ly is None:
|
if self.ly is None:
|
||||||
ly = isly(year)
|
self.ly = isly(self.year)
|
||||||
return _WWVBMinute.__new__(cls, year, days, hour, minute, dst, ut1, ls, ly)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def full_year(cls, year: int) -> int:
|
def full_year(cls, year: int) -> int:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue