PyTransitions ExampleΒΆ

The sample FSMLang source:

Download

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

Download

"""
	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