Rework fsm_update API

This commit is contained in:
Kristóf Tóth
2018-07-24 17:16:57 +02:00
parent d718b6425e
commit a6b7fa04ab
3 changed files with 33 additions and 17 deletions

View File

@ -2,6 +2,7 @@
# All Rights Reserved. See LICENSE file for details.
from collections import defaultdict
from datetime import datetime
from transitions import Machine, MachineError
@ -24,7 +25,7 @@ class FSMBase(Machine, CallbackMixin):
def __init__(self, initial=None, accepted_states=None):
self.accepted_states = accepted_states or [self.states[-1].name]
self.trigger_predicates = defaultdict(list)
self.trigger_history = []
self.event_log = []
Machine.__init__(
self,
@ -60,9 +61,22 @@ class FSMBase(Machine, CallbackMixin):
if all(predicate_results):
try:
from_state = self.state
self.trigger(trigger)
self.trigger_history.append(trigger)
self.update_event_log(from_state, trigger)
return True
except (AttributeError, MachineError):
LOG.debug('FSM failed to execute nonexistent trigger: "%s"', trigger)
return False
def update_event_log(self, from_state, trigger):
self.event_log.append({
'from_state': from_state,
'to_state': self.state,
'trigger': trigger,
'timestamp': datetime.utcnow()
})
@property
def in_accepted_state(self):
return self.state in self.accepted_states