Source code for statemachine.transition_list

from .utils import ensure_iterable


[docs]class TransitionList: def __init__(self, transitions=None): self.transitions = list(transitions) if transitions else [] def __repr__(self): return f"{type(self).__name__}({self.transitions!r})" def __or__(self, other): return TransitionList(self.transitions).add_transitions(other) def add_transitions(self, transition): if isinstance(transition, TransitionList): transition = transition.transitions transitions = ensure_iterable(transition) for transition in transitions: self.transitions.append(transition) return self def __getitem__(self, index): return self.transitions[index] def __len__(self): return len(self.transitions) def _add_callback(self, callback, name, is_event=False, **kwargs): for transition in self.transitions: list_obj = getattr(transition, name) list_obj._add_unbounded_callback( callback, is_event=is_event, transitions=self, **kwargs, ) return callback def __call__(self, f): return self._add_callback(f, "on", is_event=True) def before(self, f): return self._add_callback(f, "before") def after(self, f): return self._add_callback(f, "after") def on(self, f): return self._add_callback(f, "on") def cond(self, f): return self._add_callback(f, "cond") def unless(self, f): return self._add_callback(f, "cond", expected_value=False) def validators(self, f): return self._add_callback(f, "validators") def add_event(self, event): for transition in self.transitions: transition.add_event(event) @property def unique_events(self): tmp_ordered_unique_events_as_keys_on_dict = {} for transition in self.transitions: for event in transition.events: tmp_ordered_unique_events_as_keys_on_dict[event] = True return list(tmp_ordered_unique_events_as_keys_on_dict.keys())