Source code for pyrtma.data_logger.data_formatter
"""DataFormatter abstract base class and formatter registration functions"""
import pyrtma
from typing import Type, Optional, ClassVar, IO, Any, Union, List, Dict
from abc import ABC
from .exceptions import InvalidFormatter, DataFormatterKeyError
[docs]
class DataFormatter(ABC):
name: ClassVar[str] = "base"
mode: ClassVar[str] = "wt"
ext: ClassVar[str] = ".txt"
def __init__(self, fd: IO[Any], **kwargs):
self.fd = fd
if hdr := self.format_header():
self.fd.write(hdr)
def format_header(self) -> Optional[Union[bytes, str]]:
return None
def format_footer(self) -> Optional[Union[bytes, str]]:
return None
def format_message(self, msg: pyrtma.Message) -> Optional[Union[str, bytes]]:
return None
def write(self, wbuf: List[pyrtma.Message]):
self.fd.writelines(self.format_message(msg) for msg in wbuf)
def finalize(self, wbuf: List[pyrtma.Message]):
# Write the last bit of data
self.write(wbuf)
# Write an optional footer
if footer := self.format_footer():
self.fd.write(footer)
_formatter_map: Dict[str, Type[DataFormatter]] = {}
[docs]
def add_formatter(fmt_cls: Type[DataFormatter]):
assert issubclass(fmt_cls, DataFormatter)
if _formatter_map.get(fmt_cls.name) is not None:
raise DataFormatterKeyError(
f"A DataFormatter already exists with the name: {fmt_cls.name}"
)
_formatter_map[fmt_cls.name] = fmt_cls