Source code for majis.misc.evf
"""Event file miscellaneous module."""
import re
from pathlib import Path
from planetary_coverage import datetime
# EVF key pattern: REF_NAME (COUNT = N)
EVF_KEY = r'(?P<ref>\w+)\s*\(COUNT\s*=\s*(?P<count>\d+)\)'
[docs]
def ref_count(key: str) -> tuple[str, int]:
"""Extract reference name and count from EVF key."""
if match := re.match(EVF_KEY, key):
return match.group('ref').upper(), int(match.group('count'))
raise KeyError(f'Invalid EVF key pattern: `{key}`. Should be `REF_NAME (COUNT = N)`')
[docs]
def read_evf(fname: Path | str | list | None, comment: str = '#') -> dict | None:
"""Read and extract EVF references and times."""
if fname is None:
return None
if str(fname).endswith('.evf'):
lines = Path(fname).read_text().splitlines()
elif isinstance(fname, list):
lines = fname
else:
lines = fname.splitlines()
refs = {}
for line in lines:
if not line.startswith(comment) and (line_strip := line.strip()):
dt, key = line_strip.split(maxsplit=1)
refs[ref_count(key)] = datetime(dt)
return refs
[docs]
def ref_key(ref: str | dict | tuple) -> tuple[str, datetime]:
"""Format relative datetime reference key."""
if isinstance(ref, tuple):
key, t_ref = ref
else:
if not isinstance(ref, dict):
ref = read_evf(ref)
if len(ref) > 1:
raise ValueError(f'Only 1 reference could be provided, not {len(ref)}')
(ref, count), t_ref = list(ref.items())[0]
key = f'{ref} (COUNT = {count})'
return key, t_ref