Release 0.9.0 is a major release and contains improvements to ease development, adds some new features and removes the legacy hierarchical machine:
- removed legacy implementation of
HierarchicalMachine
from the package - removed
_super
workaround related to dill (see pytransitions#236) - Bug #554: Fix issues related to scopes and queueing in
HierachicalMachine
(thanks @jankrejci) - Feature: Add pyi stub files for better type hinting
- Feature: Reviewed and improved method documentation
- Feature #549: Add
may
transition check to transitions (thnaks @artofhuman) - Feature #552: Refactored error handling to be able to handle
MachineError
inon_exception
callbacks (thanks @kpihus) - PR #461: Add
Retry
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
Release 0.8.11 is the last 0.8 release and contains fixes for Python 3.10 compatibility issues
- Bug #559: Rewrote an async test and replaced
setDaemon
withdaemon
property assignment for thread handling (thanks @debalance)
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.
- Feature #545: The literal 'self' (default model parameter of
Machine
) has been replaced by the class variableMachine.self_literal = 'self'
.Machine
now performs an identity check (instead of a value check) withmod is self.self_literal
to determine whether it should act as a model. While 'self' should still work when passed to themodel
parameter, we encourage usingMachine.self_literal
from now on. This was done to enable easier override ofMachine.__eq__
in subclasses (thanks @VKSolovev). - Bug #547: Introduce
HierarchicalMachine.prefix_path
to resolve global state names since the HSM stack is not reliable whenqueued=True
(thanks @jankrejci). - Bug #548:
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:
- Bugfix #544:
NestedEvent
now wraps the machine's scope into partials passed toHierarchicalMachine._process
. This prevents queued transitions from losing their scope. - Feature #533:
(A)Graph.draw
function (object returned byGraphMachine.get_graph()
) can be passed a file/stream object as first parameter orNone
. The later will result indraw
returning a binary string. (thanks @Blindfreddy). - Feature #532: Use id(model) instead of model for machine-bound caches in
LockedMachine
,AsyncMachine
andGraphMachine
. This might influence pickling (thanks @thedrow).
Release 0.8.8 is a minor release and contains a bugfix and several new or improved features:
- Bugfix #526:
AsyncMachine
does not remove models whenremove_models
is called (thanks @Plazas87) - Feature #517: Introduce
try/except
for finalize callbacks inMachine
andHierachicalMachine
. Thus, errors occurring in finalize callbacks will be suppressed and only the original error will be raised. - Feature #520: Show references in graphs and markup. Introduce
MarkupMachine.format_references
to tweak reference formatting (thanks @StephenCarboni) - Feature #485: Introduce
Machine.on_exception
to handle raised exceptions in callbacks (thanks @thedrow) - Feature #527:
Machine.get_triggers
now supportsState
andEnum
as arguments (thanks @luup2k) - Feature #506:
NestedState
andHierachicalMachine.add_states
now accept (lists of) states and enums asinitial
parameter
Release 0.8.7 is a minor release and contains a bugfix, a feature and adjustments to internal processes:
- State configuration dictionaries passed to
HierarchicalMachine
can also usestates
as a keyword to define substates. Ifchildren
andstates
are present, onlychildren
will be considered. - Feature #500:
HierarchicalMachine
with custom separator now addsis_state
partials for nested states (e.g.is_C.s3.a()
) to models (thanks @alterscape) - Bugfix #512: Use
model_attribute
consistently inAsyncMachine
(thanks @thedrow) - Testing now treats most warnings as errors (thanks @thedrow)
- As a consequence,
pygraphviz.Agraph
indiagrams_pygraphviz
are now copied bytransitions
sinceAGraph.copy
as of version1.6
does not close temporary files appropriately HierarchicalMachine
now checks whetherstate_cls
,event_cls
andtransition_cls
have been subclassed from nested base classes (e.g.NestedState
) to prevent hard to debug inheritance errors
Release 0.8.6 is a minor release and contains bugfixes and new features:
HierarchicalMachine.add_states
will raise aValueError
when anEnum
name contains the currently usedNestedState.separator
.- Bugfix #486: Reset
NestedState._scope
when enter/exit callbacks raise an exception (thanks @m986883511) - Bugfix #488: Let
HierarchicalMachine._get_trigger
which is bound tomodel.trigger
raise aMachineError
for invalid events andAttributeError
for unknown events (thanks @hsharrison) - Introduced
HierarchicalMachine.has_trigger
to determine whether an event is valid for an HSM - Feature #490:
AsyncMachine
features an event queue dictionary for individual models whenqueued='model'
(thanks @jekel) - Feature #490:
Machine.remove_model
will now also remove model events from the event queue whenqueued=True
- Feature #491:
Machine.get_transitions
and its HSM counterpart now acceptEnum
andState
forsource
anddest
(thanks @thedrow)
Release 0.8.5 is a minor release and contains bugfixes:
AsyncMachine.switch_model_context
is expected to beasync
now for easier integration of async code during model switch.- Bugfix #478: Initializing a machine with
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:
- Bugfix #477: Model callbacks were not added to a LockedHierarchicalMachine when the machine itself served as a model (thanks @oliver-goetz)
- Bugfix #475: Clear collection of tasks to prevent memory leak when initializing many models (thanks @h-nakai)
- Feature #474: Added static
AsyncMachine.protected_tasks
list which can be used to preventtransitions
to cancel certain tasks. - Feature: Constructor of
HierarchicalMachine
now accepts substates ('A_1_c') and parallel states (['A', 'B']) asinitial
parameter
Release 0.8.3 is a minor release and contains several bugfixes mostly related to HierarchicalStateMachine
:
- Feature #473: Assign
is_<model_attribute>_<state_name>
instead ofis_<state_name>
whenmodel_attribute != "state"
to enable multiple versions of such convenience functions. A warning will be raised whenis_<state_name>
is used. (thanks @artofhuman) - Similarly, auto transitions (
to_<state_name>
) will be assigned asto_<model_attribute>_<state_name>
.to_<state_name>
will work as before but raise a warning until version 0.9.0. - Bugfix:
allow_substates
did not consider enum states - Feature: Nested enums can now be passed in a dict as
children
withinitial
parameter - Bugfix #449: get_triggers/get_transitions did not return nested triggers correctly (thanks @alexandretanem)
- Feature #452: Improve handling of label attributes in custom diagram states and
TransitionGraphSupport
(thanks @badiku) - Bugfix #456: Prevent parents from overriding (falsy) results of their children's events (thanks @alexandretanem)
- Bugfix #458: Entering the same state caused key errors when transition was defined on a parent (thanks @matlom)
- Bugfix #459: Do not remove current timeout runner in AsyncTimeout to prevent accidental overrides (thanks @rgov)
- Rewording of
State.enter/exit
debug message emitted when callbacks have been processed. - Bugfix #370: Fix order of
before_state_change/before
andafter/after_state_change
inAsyncMachine
(thanks @tzoiker and @vishes-shell) - Bugfix #470:
Graph.get_graph()
did not considerenum
states whenshow_roi=True
(thanks @termim)
Release 0.8.2 is a minor release and contains several bugfixes and improvements:
- Bugfix #438: Improved testing without any optional
graphviz
package - Bugfix:
_check_event_result
failed when model was in parallel state - Bugfix #440: Only allow explicit
dest=None
inMachine.add_transition
(not just falsy) for internal transitions (thanks @Pathfinder216) - Bugfix #419: Fix state creation of nested enums (thanks @thedrow)
- Bugfix #428: HierarchicalGraphMachine did not find/apply styling for parallel states (thanks @xiaohuihui1024)
- Bugfix:
Model.trigger
now considers the machine's and current state'signore_invalid_triggers
attribute and can be called with non-existing events (thanks @potens1) - Bugfix: Child states may not have been exited when the executed transition had been defined on a parent (thanks @thedrow)
- Feature #429: Introduced
transitions.extensions.asyncio.AsyncTimeout
as a state decorator to avoid threads used intransitions.extensions.state.Timeout
(thanks @potens1) - Feature #444:
transitions
can now be tested online at mybinder.org - PR #418: Use sets instead of lists to cache already covered transitions in nested state machines (thanks @thedrow)
- PR #422: Improve handling of unresolved attributes for easier inheritance (thanks @thedrow)
- PR #445: Refactored AsyncMachine to enable trio/anyio override
Release 0.8.1 is a minor release of HSM improvements and bugfixes in the diagram and async extension:
- Feature: Introduced experimental
HierarchicalAsync(Graph)Machine
- Feature #405: Support for nested Enums in
HierarchicalMachine
(thanks @thedrow) - Bugfix #400: Fix style initialization when initial state is an
Enum
(thanks @kbinpgh) - Bugfix #403: AsyncMachine.dispatch now returns a boolean as expected (thanks @thedrow)
- Bugfix #413: Improve diagram output for
HierarchicalMachine
(thanks @xiaohuihui1024) - Increased coverage (thanks @thedrow)
- Introduced
xdist
for parallel testing withpytest
(thanks @thedrow)
Release 0.8.0 is a major release and introduces asyncio support for Python 3.7+, parallel state support and some bugfixes:
- Feature:
HierarchicalMachine
has been rewritten to support parallel states. Please have a look at the ReadMe.md to check what has changed.- The previous version can be found in
transitions.extensions.nesting_legacy
for now
- The previous version can be found in
- Feature: Introduced
AsyncMachine
(see discussion #259); note that async HSMs are not yet supported - Feature #390: String callbacks can now point to properties and attributes (thanks @jsenecal)
- Bugfix: Auto transitions are added multiple times when add_states is called more than once
- Bugfix: Convert state._name from
Enum
into strings inMarkupMachine
when necessary - Bugfix #392: Allow
Machine.add_ordered_transitions
to be called without the initial state (thanks @mkaranki and @facundofc) GraphMachine
now attempts to fall back tographviz
when importingpygraphviz
fails- Not implemented/tested so far (contributions are welcome!):
- Proper Graphviz support of parallel states
- AsyncHierachicalMachine
Release 0.7.2 is a minor release and contains bugfixes and a new feature:
- Bugfix #386: Fix transitions for enums with str behavior (thanks @artofhuman)
- Bugfix #378: Don't mask away KeyError when executing a transition (thanks @facundofc)
- Feature #387: Add support for dynamic model state attribute (thanks @v1k45)
Release 0.7.1 is a minor release and contains several documentation improvements and a new feature:
- Feature #334: Added Enum (Python 3.4+:
enum
Python 2.7:enum34
) support (thanks @artofhuman and @justinttl) - Replaced test framework
nosetests
withpytest
(thanks @artofhuman) - Extended
add_ordered_transitions
documentation inReadme.md
- Collected code snippets from earlier discussions in
examples/Frequently asked questions.ipynb
- Improved stripping of
long_description
insetup.py
(thanks @artofhuman)
Release 0.7.0 is a major release with fundamental changes to the diagram extension. It also introduces an intermediate MarkupMachine
which can be used to transfer and (re-)initialize machine configurations.
- Feature #263:
MarkupMachine
can be used to retrieve a Machine's dictionary representationGraphMachine
uses this representation for Graphs now and does not rely onMachine
attributes any longer
- Feature: The default value of
State.ignore_invalid_triggers
changed toNone
. If it is not explicitly set, theMachine
's value is used instead. - Feature #325: transitions now supports
pygraphviz
andgraphviz
for the creation of diagrams. Currently,GraphMachine
will check forpygraphviz
first and fall back tographviz
. To usegraphviz
directly passuse_pygraphiv=False
to the constructor ofGraphMachine
- Diagram style has been overhauled. Have a look at
GraphMachine
's attributesmachine_attributes
andstyle_attributes
to adjust it to your needs. - Feature #305: Timeouts and other features are now marked in the graphs
- Bugfix #343:
get_graph
was not assigned to models added during machine runtime
Release 0.6.9 is a minor release and contains two bugfixes:
- Bugfix #314: Do not override already defined model functions with convenience functions (thanks @Arkanayan)
- Bugfix #316:
state.Error
did not call parent'senter
method (thanks @potens1)
Release 0.6.8 is a minor release and contains a critical bugfix:
- Bugfix #301: Reading
Readme.md
insetup.py
causes aUnicodeDecodeError
in non-UTF8-locale environments (thanks @jodal)
Release 0.6.7 is identical to 0.6.6. A release had been necessary due to #294 related to PyPI.
Release 0.6.6 is a minor release and contains several bugfixes and new features:
- Bugfix:
HierarchicalMachine
now considers the initial state ofNestedState
instances/names passed toinitial
. - Bugfix:
HierarchicalMachine
used to ignore children whenNestedStates
were added to the machine. - Bugfix #300: Fixed missing brackets in
TimeoutState
(thanks @Synss) - Feature #289: Introduced
Machine.resolve_callable(func, event_data)
to enable customization of callback definitions (thanks @ollamh and @paulbovbel) - Feature #299: Added support for internal transitions with
dest=None
(thanks @maueki) - Feature: Added
Machine.dispatch
to trigger events on all models assigned toMachine
Release 0.6.5 is a minor release and contains a new feature and a bugfix:
- Feature #287: Embedding
HierarchicalMachine
will now reuse the machine'sinitial
state. Passinginitial: False
overrides this (thanks @mrjogo). - Bugfix #292: Models using
GraphMashine
were not picklable in the past due tograph
property. Graphs for each model are now stored inGraphMachine.model_graphs
(thanks @ansumanm).
Release 0.6.4 is a minor release and contains a new feature and two bug fixes related to HierachicalMachine
:
- Bugfix #274:
initial
has not been passed to super inHierachicalMachine.add_model
(thanks to @illes). - Feature #275:
HierarchicalMachine.add_states
now supports keywordparent
to be aNestedState
or a string. - Bugfix #278:
NestedState
has not been exited correctly during reflexive triggering (thanks to @hrsmanian).
Release 0.6.3 is a minor release and contains a new feature and two bug fixes:
- Bugfix #268:
Machine.add_ordered_transitions
changed states' order ifinitial
is not the first or last state (thanks to @janekbaraniewski). - Bugfix #265: Renamed
HierarchicalMachine.to
toto_state
to prevent warnings when HSM is used as a model. - Feature #266: Introduce
Machine.get_transitions
to get a list of transitions for alteration (thanks to @Synss).
Release 0.6.2 is a minor release and contains new features and bug fixes but also several internal changes:
- Documentation: Add docstring to every public method
- Bugfix #257: Readme example variable had been capitalized (thanks to @fedesismo)
- Add
appveyor.yml
for Windows testing; However, Windows testing is disabled due to #258 - Bugfix #262: Timeout threads prevented program from execution when main thread ended (thanks to @tkuester)
prep_ordered_arg
is now protected incore
- Convert
logger
instances to_LOGGER
to comply with protected module constant naming standards traverse
is now protected inHierarchicalMachine
- Remove abstract class
Diagram
since it did not add functionality todiagrams
- Specify several overrides of
add_state
oradd_transition
to keep the base class parameters instead of*args
and**kwargs
- Change several
if len(x) > 0:
checks toif x:
as suggested by the static code analysis to make use of falsy empty lists/strings.
Release 0.6.1 is a minor release and contains new features as well as bug fixes:
- Feature #245: Callback definitions ('before', 'on_enter', ...) have been moved to classes
Transition
andState
- Bugfix #253:
Machine.remove_transitions
converteddefaultdict
into dict (thanks @Synss) - Bugfix #248:
HierarchicalStateMachine
's copy procedure used to cause issues with function callbacks and object references (thanks @Grey-Bit) - Renamed
Machine.id
toMachine.name
to be consistent with the constructor parametername
- Add
Machine.add_transitions
for adding multiple transitions at once (thanks @Synss)
Release 0.6.0 is a major release and introduces new state features and bug fixes:
add_state_features
convenience decorator supports creation of custom statesTags
makes states taggableError
checks for error states (not accepted states that cannot be left); subclass ofTags
Volatile
enables scoped/temporary state objects to handle context parameters- Removed
add_self
fromMachine
constructor pygraphviz
is now optional; usepip install transitions[diagrams]
to install it- Narrowed warnings filter to prevent output cluttering by other 3rd party modules (thanks to @ksandeep)
- Reword HSM exception when wrong state object had been passedn (thanks to @Blindfreddy)
- Improved handling of partials during graph generation (thanks to @Synss)
- Introduced check to allow explicit passing of callback functions which match the
on_enter_<state>
scheme (thanks to @termim) - Bug #243: on_enter/exit callbacks defined in dictionaries had not been assigned correctly in HSMs (thanks to @Blindfreddy)
- Introduced workaround for Python 3 versions older than 3.4 to support dill version 0.2.7 and higher (thanks to @mmckerns)
- Improved manifest (#242) to comply with distribution standards (thanks to @jodal)
Release 0.5.3 is a minor release and contains several bug fixes:
- Bug #214:
LockedMachine
as a model prevented correct addition ofon_enter/exit_<state>
(thanks to @kr2) - Bug #217: Filtering rules for auto transitions in graphs falsely filtered certain transitions (thanks to @KarolOlko)
- Bug #218: Uninitialized
EventData.transition
causedAttributeError
inEventData.__repr__
(thanks to @kunalbhagawati) - Bug #215: State instances passed to
initial
parameter ofMachine
constructor had not been processed properly (thanks @mathiasimmer)
Release 0.5.2 is a minor release and contains a bug fix:
- Bug #213: prevent
LICENSE
to be installed to root of installation path
Release 0.5.1 is a minor release and contains new features and bug fixes:
- Added reflexive transitions (thanks to @janLo)
- Wildcards for reflexive (
wildcard_same
) and all (wildcard_all
) destinations areMachine
class variables now which can be altered if necessary. - Add LICENSE to packaged distribution (thanks to @bachp)
- Bug #211:
prepare
andfinalized
had not been called for HierarchicalMachines (thanks to @booware)
Release 0.5.0 is a major release:
- CHANGED API:
MachineError
is now limited to internal error and has been replaced byAttributeError
andValueError
where applicable (thanks to @ankostis) - CHANGED API: Phasing out
add_self
;model=None
will add NO model starting from next major release; usemodel='self'
instead. - Introduced deprecation warnings for upcoming changes concerning
Machine
keywordsmodel
andadd_self
- Introduced
Machine.remove_transition
(thanks to @PaleNeutron) - Introduced
Machine._create_state
for easier subclassing of states LockedMachine
now supports custom context managers for each model (thanks to @paulbovbel)Machine.before/after_state_change
can now be altered dynamically (thanks to @peendebak)Machine.add_ordered_transitions
now supportsprepare
,conditons
,unless
,before
andafter
(thanks to @aforren1)- New
prepare_event
andfinalize_event
keywords to handle transitions globally (thanks to @ankostis) - New
show_auto_transitions
keyword forGraphMachine.__init__
(defaultFalse
); if enabled, show auto transitions in graph - New
show_roi
keyword forGraphMachine._get_graph
(defaultFalse
); ifTrue
, show only reachable states in retrieved graph - Test suite now skips contextual tests (e.g. pygraphviz) if dependencies cannot be found (thanks to @ankostis)
- Improved string representation of several classes (thanks to @ankostis)
- Improved
LockedMachine
performance by removing recursive locking - Improved graph layout for nested graphs
transitions.extensions.nesting.AGraph
has been split up intoGraph
andNestedGraph
for easier maintenance- Fixed bug related to pickling
RLock
in nesting - Fixed order of callback execution (thanks to @ankostis)
- Fixed representation of condition names in graphs (thanks to @cemoody)
Release 0.4.3 is a minor release and contains bug fixes and several new features:
- Support dynamic model addition via
Machine.add_model
(thanks to @paulbovbel) - Allow user to explicitly pass a lock instance or context manager to LockedMachine (thanks to @paulbovbel)
- Fixed issue related to parsing of HSMs (thanks to @steval and @user2154065 from SO)
- When
State
is passed toMachine.add_transition
, it will check if the state (and not just the name) is known to the machine
Release 0.4.2 contains several new features and bugfixes:
- Machines can work with multiple models now (thanks to @gemerden)
- New
initial
keyword for nested states to automatically enter a child - New
Machine.trigger
method to trigger events by name (thanks to @IwanLD) - Bug fixes related to remapping in nested (thanks to @imbaczek)
- Log messages in
Transition.execute
andMachine.__init__
have been reassigned to DEBUG log level (thanks to @ankostis) - New
Machine.get_triggers
method to return all valid transitions from (a) certain state(s) (thanks to @limdauto and @guilhermecgs)
Release 0.4.1 is a minor release containing bug fixes, minor API changes, and community feedback:
-
async
is renamed toqueued
since it describes the mechanism better -
HierarchicalStateMachine.is_state now provides
allow_substates
as an optional argument(thanks to @jonathanunderwood) -
Machine can now be used in scenarios where multiple inheritance is required (thanks to @jonathanunderwood)
-
Adds support for tox (thanks to @medecau and @aisbaa)
-
Bug fixes:
- Problems with conditions shown multiple times in graphs
- Bug which omitted transitions with same source and destination in diagrams (thanks to @aisbaa)
- Conditions passed incorrectly when HSMs are used as a nested state
- Class nesting issue that prevented pickling with dill
- Two bugs in HierarchicalStateMachine (thanks to @ajax2leet)
- Avoided recursion error when naming a transition 'process' (thanks to @dceresuela)
-
Minor PEP8 fixes (thanks to @medecau)
Release 0.4 is a major release that includes several new features:
- New
async
Machine keyword allows queueing of transitions (thanks to @khigia) - New
name
Machine keyword customizes transitions logger output for easier debugging of multiple running instances - New
prepare
Transition keyword for callbacks before any 'conditions' are checked (thanks to @TheMysteriousX) - New
show_conditions
GraphSupport keyword adds condition checks to dot graph edges (thanks to @khigia) - Nesting now supports custom (unicode) substate separators
- Nesting no longer requires a leaf state (e.g. to_C() does not enter C_1 automatically)
- Factory for convenient extension mixins
- Numerous minor improvements and bug fixes
Mostly a bug fix release. Changes include:
- Fixes graphing bug introduced in 0.3.0 (thanks to @wtgee)
- Fixes bug in dynamic addition of before/after callbacks (though this is a currently undocumented feature)
- Adds coveralls support and badge
- Adds a few tests to achieve near-100% coverage
Release 0.3 includes a number of new features (nesting, multithreading, and graphing) as well as bug fixes and minor improvements:
- Support for nested states (thanks to @aleneum)
- Basic multithreading support for function access (thanks to @aleneum)
- Basic graphing support via graphviz (thanks to @svdgraaf)
- Stylistic edits, minor fixes, and improvements to README
- Expanded and refactored tests
- Minor bug fixes
- Enabled pickling in Python 3.4 (and in < 3.4 with the dill module)
- Added reference to generating Transition in EventData objects
- Fixed minor bugs
- README improvements, added TOC, and typo fixes
- Condition checks now receive optional data
- Removed invasive basicConfig() call introduced with logging in 0.2.6
- Fixed import bug that prevented dependency installation at setup
- Added rudimentary logging for key transition and state change events
- Added generic before/after callbacks that apply to all state changes
- Ensured string type compatibility across Python 2 and 3
- Added ability to suppress invalid trigger calls
- Shorthand definition of transitions via lists
- Automatic detection of predefined state callbacks
- Fixed bug in automatic transition creation
- Added Changelog
- Added travis-ci support
- Cleaned up and PEP8fied code
- Added 'unless' argument to transitions that mirrors 'conditions'
- Python 2/3 compatibility
- Added automatic to_{state}() methods
- Added ability to easily add ordered transitions