Source code for elasticai.creator.ir.registry
from collections.abc import Iterable, Iterator, Mapping
from typing import Self, overload
from .datagraph import DataGraph
_registry_types = []
[docs]
def is_registry(object) -> bool:
return object in _registry_types
[docs]
def mark_as_registry[T](object: T) -> T:
_registry_types.append(object)
return object
[docs]
@mark_as_registry
class Registry[G: DataGraph](Mapping[str, G]):
@overload
def __init__(self, items: Iterable[tuple[str, G]], /) -> None: ...
@overload
def __init__(self, items: Mapping[str, G], /) -> None: ...
@overload
def __init__(self, /, **kwargs: G) -> None: ...
def __init__(
self,
items: Iterable[tuple[str, G]] | Mapping[str, G] | None = None,
/,
**kwargs,
) -> None:
if items is None:
self._data: dict[str, G] = dict(**kwargs)
else:
if not len(kwargs) == 0:
raise TypeError(f"unsupported arguments for {type(self)}")
self._data = dict(items)
[docs]
def __getitem__(self, name: str) -> G:
return self._data[name]
[docs]
def __len__(self) -> int:
return len(self._data)
[docs]
def __contains__(self, key: object) -> bool:
return key in self._data
[docs]
def __iter__(self) -> Iterator[str]:
yield from self._data
[docs]
def __or__(self, other: object) -> Self:
if not isinstance(other, Mapping):
raise TypeError("unsupported operand")
return type(self)(**(self._data | dict(other.items()))) # type: ignore
[docs]
def add(self, name: str, graph: G) -> Self:
return type(self)(**(self._data) | {name: graph})