PyTransitions ExampleΒΆ
The sample FSMLang source:
machine ActionMatrix
{
state idle, active, done;
event go, halt;
event report data translator translate_report { int value; };
action log_start[go, (idle, active)] transition active;
action log_report[report, (all)];
transition [halt, active] decide_finish;
decide_finish returns done when is_finished, idle otherwise;
}
This output was produced by fsm -tpy action_matrix.fsm
"""
action_matrix.py
This file generated by FSMLang
"""
from transitions import Machine
class ActionMatrix(object):
states = ['idle' ,'active' ,'done']
transitions = [
['go', ['idle' ,'active'] , 'active']
, {'trigger': 'report'
, 'source': ['idle' ,'active' ,'done']
, 'dest': None
}
, {'trigger': 'halt'
, 'source': 'active'
, 'dest': 'done'
, 'conditions': ['is_finished']
}
, {'trigger': 'halt'
, 'source': 'active'
, 'dest': 'idle'
, 'conditions': ['choose_idle']
}
]
_fsm_translators = {
"report": "translate_report",
}
_fsm_actions = {
("idle", "go"): "log_start",
("active", "go"): "log_start",
("idle", "report"): "log_report",
("active", "report"): "log_report",
("done", "report"): "log_report",
}
def __init__(self):
self.data = {}
self.machine = Machine(model=self, states=ActionMatrix.states, transitions=ActionMatrix.transitions, initial='idle', send_event=True, prepare_event="_fsm_prepare_event")
def _fsm_get_trigger_name(self, e):
ev = getattr(e, "event", None)
if ev is not None:
name = getattr(ev, "name", None)
if name:
return name
name = getattr(ev, "trigger", None)
if name:
return name
for attr in ("trigger", "name", "event_name"):
name = getattr(e, attr, None)
if name:
return name
tr = getattr(e, "transition", None)
if tr is not None:
name = getattr(tr, "trigger", None)
if name:
return name
return None
def _fsm_prepare_event(self, e):
trigger = self._fsm_get_trigger_name(e)
if trigger is None:
trigger = "__unknown_trigger__"
translator_name = self._fsm_translators.get(trigger)
if translator_name is not None:
getattr(self, translator_name)(e)
action_name = self._fsm_actions.get((self.state, trigger))
if action_name is not None:
getattr(self, action_name)(e)
return True
def log_start(self, event=None):
print('log_start')
def log_report(self, event=None):
print('log_report')
@property
def is_finished(self):
return True
@property
def choose_idle(self):
return True
def translate_report(self, e):
print("translate_report")
# intentionally empty