Source code for modelly.data.recorders.protocol
"""The DataSet protocol and the attrgetter-based BaseDataSet."""
from __future__ import annotations
import abc
import operator
from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable
if TYPE_CHECKING:
from modelly.data.recorders.base import BaseDataRecorder
from modelly.data.recorders.config import DatasetConfig
[docs]
@runtime_checkable
class DataSet(Protocol):
"""Protocol for all data collection classes.
All datasets raise RuntimeError if accessed after being closed.
"""
name: str
@property
def data(self) -> Any:
"""Return collected data."""
...
[docs]
def close(self):
"""Close the dataset."""
...
[docs]
def record(
self, recorder: BaseDataRecorder, configuration: DatasetConfig | None = None
) -> DataSet:
"""Record the collected data."""
...
[docs]
class BaseDataSet(abc.ABC):
"""Abstract base class for data sets.
Args:
name: the name of the data set
fields: the fields to collect
"""
def __init__(
self,
name,
*,
fields: str | list[str] | None = None,
):
"""Initialize a base data set."""
self.name = name
if fields is not None:
if isinstance(fields, str):
fields = [fields]
else:
raise ValueError("please pass one or more fields to collect")
self._attributes = fields
self._collector = operator.attrgetter(*self._attributes)
self._closed = False
@property
@abc.abstractmethod
def data(self):
"""Return the data of the dataset."""
...
def _check_closed(self):
"""Check to see if the data set has been closed."""
if self._closed:
raise RuntimeError(f"DataSet '{self.name}' has been closed")
[docs]
def close(self):
"""Cleanup and close the data set."""
if self._closed:
return
self._collector = None
self._closed = True
[docs]
def record(
self, recorder: BaseDataRecorder, configuration: DatasetConfig | None = None
) -> DataSet:
"""Record the collected data."""
recorder.add_dataset(self, configuration=configuration)
return self