A lightweight, object-oriented finite state machine implementation in Python with many extensions
Release 0.9.0 is a major release and contains improvements to ease development, adds some new features and removes the legacy hierarchical machine:
HierarchicalMachine
from the packageGraphMachine
(thanks @betaboon)HierachicalMachine
(thanks @jankrejci)graphviz
when pygraphviz
was not installed (thanks @FridjofAmundsen)on_timeout
callback resolution when timeout had been initialized with timeout=0
(thanks @Rysbai)GraphSupport
was not correctly aligned when show_attributes=True
(thanks @spagh-eddie)may
transition check to transitions (thanks @artofhuman)MachineError
in on_exception
callbacks (thanks @kpihus)mypy
to test workflowRetry
state to supported state stereotypes (thanks @rgov)Machine._identify_callback
has been converted to instance method from class methodLockedMachine._get_qualified_state_name
has been converted to instance method from static method_super
workaround related to dill (see https://github.com/pytransitions/transitions/issues/236)Release 0.8.11 is the last 0.8 release and contains fixes for Python 3.10 compatibility issues:
Release 0.8.10 is a minor release and contains two bug fixes for the HSM extension and changes how the 'self' literal string is handled.
Machine
) has been replaced by the class variable Machine.self_literal = 'self'
. Machine
now performs an identity check (instead of a value check) with mod is self.self_literal
to determine whether it should act as a model. While 'self' should still work when passed to the model
parameter, we encourage using Machine.self_literal
from now on. This was done to enable easier override of Machine.__eq__
in subclasses (thanks @VKSolovev).HierarchicalMachine.prefix_path
to resolve global state names since the HSM stack is not reliable when queued=True
(thanks @jankrejci).HSM
source states were exited even though they are parents of the destination state (thanks @wes-public-apps).Release 0.8.9 is a minor release and contains a bugfix for HSM, a feature for GraphSupport
and changes internal cache handling:
NestedEvent
now wraps the machine's scope into partials passed to HierarchicalMachine._process
. This prevents queued transitions from losing their scope.(A)Graph.draw
function (object returned by GraphMachine.get_graph()
) can be passed a file/stream object as first parameter or None
. The later will result in draw
returning a binary string. (thanks @Blindfreddy).LockedMachine
, AsyncMachine
and GraphMachine
. This might influence pickling (thanks @thedrow).Release 0.8.8 is a minor release and contains a bugfix and several new or improved features:
AsyncMachine
does not remove models when remove_models
is called (thanks @Plazas87)try/except
for finalize callbacks in Machine
and HierachicalMachine
. Thus, errors occurring in finalize callbacks will be suppressed and only the original error will be raised.MarkupMachine.format_references
to tweak reference formatting (thanks @StephenCarboni)Machine.on_exception
to handle raised exceptions in callbacks (thanks @thedrow)Machine.get_triggers
now supports State
and Enum
as arguments (thanks @luup2k)NestedState
and HierachicalMachine.add_states
now accept (lists of) states and enums as initial
parameterRelease 0.8.7 is a minor release and contains bugfixes and new features:
HierarchicalMachine
can also use states
as a keyword to define substates. If children
and states
are present, only children
will be considered.HierarchicalMachine
with custom separator now adds is_state
partials for nested states (e.g. is_C.s3.a()
) to models (thanks @alterscape)model_attribute
consistently in AsyncMachine
(thanks @thedrow)pygraphviz.Agraph
in diagrams_pygraphviz
are now copied by transitions
since AGraph.copy
as of version 1.6
does not close temporary files appropriatelyHierarchicalMachine
now checks whether state_cls
, event_cls
and transition_cls
have been subclassed from nested base classes (e.g. NestedState
) to prevent hard to debug inheritance errorsRelease 0.8.6 is a minor release and contains bugfixes and new features:
HierarchicalMachine.add_states
will raise a ValueError
when an Enum
name contains the currently used NestedState.separator
.NestedState._scope
when enter/exit callbacks raise an exception (thanks @m986883511)HierarchicalMachine._get_trigger
which is bound to model.trigger
raise a MachineError
for invalid events and AttributeError
for unknown events (thanks @hsharrison)HierarchicalMachine.has_trigger
to determine whether an event is valid for an HSMAsyncMachine
features an event queue dictionary for individual models when queued='model'
(thanks @jekel)Machine.remove_model
will now also remove model events from the event queue when queued=True
Machine.get_transitions
and its HSM counterpart now accept Enum
and State
for source
and dest
(thanks @thedrow)Release 0.8.5 is a minor release and contains bugfixes:
AsyncMachine.switch_model_context
is expected to be async
now for easier integration of async code during model switch.GraphSupport
threw an exception when initial was set to a nested or parallel state (thanks @nickvazztau)Release 0.8.4 is a minor release and contains bugfixes as well as new features:
AsyncMachine.protected_tasks
list which can be used to prevent transitions
to cancel certain tasks.HierarchicalMachine
now accepts substates ('A_1_c') and parallel states (['A', 'B']) as initial
parameterRelease 0.8.3 is a minor release and contains several bugfixes mostly related to HierarchicalStateMachine
:
is_<model_attribute>_<state_name>
instead of is_<state_name>
when model_attribute != "state"
to enable multiple versions of such convenience functions. A warning will be raised when is_<state_name>
is used. (thanks @artofhuman)to_<state_name>
) will be assigned as to_<model_attribute>_<state_name>
. to_<state_name>
will work as before but raise a warning until version 0.9.0.allow_substates
did not consider enum stateschildren
with initial
parameterTransitionGraphSupport
(thanks @badiku)State.enter/exit
debug message emitted when callbacks have been processed.before_state_change/before
and after/after_state_change
in AsyncMachine
(thanks @tzoiker and @vishes-shell)Graph.get_graph()
did not consider enum
states when show_roi=True
(thank @termim)