Source code for runtimepy.codec.protocol

"""
A module implementing an interface to build communication protocols.
"""

# built-in
from abc import ABC, abstractmethod
from typing import Optional

# internal
from runtimepy.codec.protocol.json import JsonProtocol
from runtimepy.enum.registry import EnumRegistry


[docs] class Protocol(JsonProtocol): """A class for defining runtime communication protocols."""
[docs] class ProtocolFactory(ABC): """ A class implementing an interface for creating runtime instances of a prototypes that are unique to the implementing class. """ # Can be re-assigned during inheriting class declaration. protocol: Protocol = Protocol(EnumRegistry()) initialized = False # Private. _singleton: Optional[Protocol] = None
[docs] @classmethod @abstractmethod def initialize(cls, protocol: Protocol) -> None: """Initialize this protocol."""
[docs] @classmethod def instance(cls) -> Protocol: """Create an instance of this factory's protocol.""" # We only need to run the routine that populates the protocol once. if not cls.initialized: if not cls.protocol.alias: cls.protocol.alias = cls.__name__ cls.initialize(cls.protocol) cls.initialized = True return cls.protocol.copy()
[docs] @classmethod def singleton(cls) -> Protocol: """Get a shared single instance of a protocol for this class.""" if cls._singleton is None: cls._singleton = cls.instance() return cls._singleton
[docs] @classmethod def id(cls) -> int: """Get an integer identifier for this protocol factory.""" return cls.singleton().id