Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def enter(self, event_data):
""" Extends transitions.core.State.enter. Throws a `MachineError` if there is
no leaving transition from this state and 'accepted' is not in self.tags.
"""
if not event_data.machine.get_triggers(self.name) and not self.is_accepted:
raise MachineError("Error state '{0}' reached!".format(self.name))
super(Error, self).enter(event_data)
def _trigger(self, model, *args, **kwargs):
""" Internal trigger function called by the ``Machine`` instance. This should not
be called directly but via the public method ``Machine.trigger``.
"""
state = self.machine.get_state(model.state)
if state.name not in self.transitions:
msg = "%sCan't trigger event %s from state %s!" % (self.machine.name, self.name,
state.name)
ignore = state.ignore_invalid_triggers if state.ignore_invalid_triggers is not None \
else self.machine.ignore_invalid_triggers
if ignore:
_LOGGER.warning(msg)
return False
else:
raise MachineError(msg)
event_data = EventData(state, self, self.machine, model, args=args, kwargs=kwargs)
return self._process(event_data)
def read_message(self, message, payload_buffer):
try:
self._handshake_machine.next_message()
self._pattern_machine.read()
except MachineError as ex:
raise self._convert_machine_error(ex, 'read_message')
result = self._handshakestate.read_message(message, payload_buffer)
if result is not None:
self._handshake_machine.finish()
return result
async def _trigger(self, model, *args, **kwargs):
state = self.machine.get_state(model.state)
if state.name not in self.transitions:
msg = "%sCan't trigger event %s from state %s!" % (self.machine.name, self.name,
state.name)
ignore = state.ignore_invalid_triggers if state.ignore_invalid_triggers is not None \
else self.machine.ignore_invalid_triggers
if ignore:
_LOGGER.warning(msg)
return False
else:
raise MachineError(msg)
event_data = EventData(state, self, self.machine, model, args=args, kwargs=kwargs)
return await self._process(event_data)
async def _process(self, trigger):
# default processing
if not self.has_queue:
if not self._transition_queue:
# if trigger raises an Error, it has to be handled by the Machine.process caller
return await trigger()
else:
raise MachineError("Attempt to process events synchronously while transition queue is not empty!")
# ToDo: test for has_queue
# process queued events
self._transition_queue.append(trigger)
# another entry in the queue implies a running transition; skip immediate execution
if len(self._transition_queue) > 1:
return True
# execute as long as transition queue is not empty ToDo: not tested!
while self._transition_queue:
try:
await self._transition_queue[0]()
self._transition_queue.popleft()
except Exception:
# if a transition raises an exception, clear queue and delegate exception handling
self._transition_queue.clear()
def __init__(self, value):
super(MachineError, self).__init__(value)
self.value = value
def _trigger(self, model, *args, **kwargs):
state = self.machine.get_state(model.state)
while state.parent and state.name not in self.transitions:
state = state.parent
if state.name not in self.transitions:
msg = "%sCan't trigger event %s from state %s!" % (self.machine.name, self.name,
model.state)
if self.machine.get_state(model.state).ignore_invalid_triggers:
_LOGGER.warning(msg)
else:
raise MachineError(msg)
event_data = EventData(state, self, self.machine,
model, args=args, kwargs=kwargs)
return self._process(event_data)
def _process(self, trigger):
# default processing
if not self.has_queue:
if not self._transition_queue:
# if trigger raises an Error, it has to be handled by the Machine.process caller
return trigger()
else:
raise MachineError("Attempt to process events synchronously while transition queue is not empty!")
# process queued events
self._transition_queue.append(trigger)
# another entry in the queue implies a running transition; skip immediate execution
if len(self._transition_queue) > 1:
return True
# execute as long as transition queue is not empty
while self._transition_queue:
try:
self._transition_queue[0]()
self._transition_queue.popleft()
except Exception:
# if a transition raises an exception, clear queue and delegate exception handling
self._transition_queue.clear()
raise