Source code for statemachine.event_data
from dataclasses import dataclass
from dataclasses import field
from time import time
from typing import TYPE_CHECKING
from typing import Any
if TYPE_CHECKING:
from .event import Event
from .state import State
from .statemachine import StateChart
from .transition import Transition
[docs]
@dataclass(order=True)
class TriggerData:
machine: "StateChart" = field(compare=False)
event: "Event | None" = field(compare=False)
"""The Event that was triggered."""
send_id: "str | None" = field(compare=False, default=None)
"""A string literal to be used as the id of this instance of :ref:`TriggerData`.
Allow revoking a delayed :ref:`TriggerData` instance.
"""
execution_time: float = field(default=0.0)
"""The time at which the :ref:`Event` should run."""
model: Any = field(init=False, compare=False)
"""A reference to the underlying model that holds the current :ref:`State`."""
args: tuple = field(default_factory=tuple, compare=False)
"""All positional arguments provided on the :ref:`Event`."""
kwargs: dict = field(default_factory=dict, compare=False)
"""All keyword arguments provided on the :ref:`Event`."""
future: Any = field(default=None, compare=False, repr=False, init=False)
"""An optional :class:`asyncio.Future` for async result routing.
When set, the processing loop will resolve this future with the microstep
result (or exception), allowing the caller to ``await`` it.
"""
def __post_init__(self):
self.model = self.machine.model
delay = self.event.delay if self.event and self.event.delay else 0
self.execution_time = time() + (delay / 1000)
[docs]
@dataclass
class EventData:
trigger_data: TriggerData
"""The :ref:`TriggerData` of the :ref:`event`."""
transition: "Transition"
"""The :ref:`Transition` instance that was activated by the :ref:`Event`."""
state: "State" = field(init=False)
"""The current :ref:`State` of the :ref:`statemachine`."""
source: "State" = field(init=False)
"""The :ref:`State` which :ref:`statemachine` was in when the Event started."""
target: "State | None" = field(init=False)
"""The destination :ref:`State` of the :ref:`transition`, or ``None`` for targetless."""
def __post_init__(self):
self.state = self.transition.source
self.source = self.transition.source
self.target = self.transition.target
self.machine = self.trigger_data.machine
@property
def event(self):
return self.trigger_data.event
@property
def args(self):
return self.trigger_data.args
@property
def extended_kwargs(self):
kwargs = self.trigger_data.kwargs.copy()
kwargs["event_data"] = self
kwargs["machine"] = self.trigger_data.machine
kwargs["event"] = self.trigger_data.event
kwargs["model"] = self.trigger_data.model
kwargs["transition"] = self.transition
kwargs["state"] = self.state
kwargs["source"] = self.source
kwargs["target"] = self.target
return kwargs