import re import enum import datetime RE_PHENOM = re.compile(r''' ^/ (?P[OTEX]) \. (?P[A-Z]{3}) \. (?P[A-Z]{4}) \. (?P[A-Z]{2}) \. (?P[A-Z]) \. (?P\d{4}) \. (?P\d{6}T\d{4}Z) - (?P\d{6}T\d{4}Z) /$ ''', re.X) RE_HYDRO = re.compile(r''' ^/ (?P[0N1]) \. (?P[A-Z]{2}) \. (?P\d{6}T\d{4}Z) - (?P\d{6}T\d{4}Z) \. (?P[A-Z]{2}) /$ ''', re.X) def parse_timestamp(text: str): return datetime.datetime.strptime( text, '%y%m%dT%H%M%SZ' ).astimezone(datetime.UTC) class VTECEventType(enum.StrEnum): OPERATIONAL = 'O' TEST = 'T' EXPERIMENTAL = 'E' EXPERIMENTAL_VTEC = 'X' class VTECEvent(): typeof: str actions: str wfo: str phenom: str sig: str etn: int timestamp_start: datetime.datetime timestamp_end: datetime.datetime @staticmethod def parse(text: str) -> __class__: match = RE_PHENOM.match(text) if match is None: return event = VTECEvent() event.typeof = match['typeof'] event.actions = match['actions'] event.wfo = match['wfo'] event.phenom = match['phenom'] event.sig = match['sig'] event.etn = int(match['etn']) event.timestamp_start = parse_timestamp(match['time_start']) event.timestamp_end = parse_timestamp(match['time_end']) return event class VTECHydroEvent(): __slots__ = ( 'severity', 'cause', 'record', 'timestamp_start', 'timestamp_end' ) severity: str cause: str record: str timestamp_start: datetime.datetime timestamp_end: datetime.datetime @staticmethod def parse(text: str) -> __class__: match = RE_HYDRO.match(text) if match is None: return event = VTECHydroEvent() event.severity = match['severity'] event.cause = match['cause'] event.timestamp_start = parse_timestamp(match['time_start']) event.timestamp_end = parse_timestamp(match['time_end']) return event