def __set_state(self, newvalue): """Set state to new value, ensuring it is a proper state and respects the state machine""" if newvalue not in self._states: raise DataStateError(newvalue) if not hasattr(self, '_DataState__state'): if newvalue != self._initial_state: raise DataStateError(newvalue) elif (self.__state, newvalue) not in self._transitions: raise DataStateTransitionError((self.__state, newvalue)) self.__state = newvalue
def __init__(self, spec): """Validate states and transitions Arguments: spec -- a dictionary passed to the underlying Data class Exceptions: DataStateError -- _states, _transitions or _initial_state contains an improper value; accompanying message contains additional information """ Data.__init__(self, spec) if not isinstance(self._states, list): raise DataStateError("_states attribute is not a list: %s" % (self._states,)) if self._initial_state == None: raise DataStateError("_initial_state is not set") if self._initial_state not in self._states: raise DataStateError("_initial_state is not a valid state: %s" % (self._initial_state,)) if not isinstance(self._transitions, list): raise DataStateError("_transitions attribute is not a list: %s" % (self._transitions,)) for transition in self._transitions: if not isinstance(transition, tuple) or len(transition) != 2: raise DataStateError("_transition is not a 2-tuple: %s" % (transition,)) old_state, new_state = transition if old_state not in self._states: raise DataStateError("_transition contains a invalid state: %s" % (old_state,)) if new_state not in self._states: raise DataStateError("_transition contains a invalid state: %s" % (new_state,))