All Versions
Latest Version
Avg Release Cycle
77 days
Latest Release
25 days ago

Changelog History
Page 1

  • v0.9.0 Changes

    September 01, 2022

    🚀 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
    • 🐛 Bug #551: Fix active state styling in GraphMachine (thanks @betaboon)
    • 🐛 Bug #554: Fix issues related to scopes and queueing in HierachicalMachine (thanks @jankrejci)
    • 🐛 Bug #568: Reflexive transitions (dest: '=') had not been resolved correctly when source was a wildcard (thanks @jnu)
    • 🐛 Bug #568: HSM did not detect reflexive transitions if src was a parent state (thanks @lostcontrol)
    • 🐛 Bug #569: Fix implicit fallback to graphviz when pygraphviz was not installed (thanks @FridjofAmundsen)
    • 🐛 Bug #580: Fix on_timeout callback resolution when timeout had been initialized with timeout=0 (thanks @Rysbai)
    • 🐛 Bug #582: Last label in GraphSupport was not correctly aligned when show_attributes=True (thanks @spagh-eddie)
    • 🔋 Feature: Add pyi stub files for better type hinting
    • 🔋 Feature: Reviewed and improved method documentation
    • 🔋 Feature #549: Add may transition check to transitions (thanks @artofhuman)
    • 🔋 Feature #552: Refactored error handling to be able to handle MachineError in on_exception callbacks (thanks @kpihus)
    • 🔋 Feature: Add mypy to test workflow
    • 👍 PR #461: Add Retry state to supported state stereotypes (thanks @rgov)
    • Internal: Machine._identify_callback has been converted to instance method from class method
    • Internal: LockedMachine._get_qualified_state_name has been converted to instance method from static method
    • 👀 Internal: _super workaround related to dill (see
  • v0.8.11 Changes

    February 01, 2022

    🚀 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 with daemon property assignment for thread handling (thanks @debalance)
  • v0.8.10 Changes

    October 01, 2021

    🚀 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 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).
    • 🐛 Bug #547: Introduce HierarchicalMachine.prefix_path to resolve global state names since the HSM stack is not reliable when queued=True (thanks @jankrejci).
    • 🐛 Bug #548: HSM source states were exited even though they are parents of the destination state (thanks @wes-public-apps).
  • v0.8.9 Changes

    September 01, 2021

    🛠 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 to HierarchicalMachine._process. This prevents queued transitions from losing their scope.
    • 🔋 Feature #533: (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).
    • 🔋 Feature #532: Use id(model) instead of model for machine-bound caches in LockedMachine, AsyncMachine and GraphMachine. This might influence pickling (thanks @thedrow).
  • v0.8.8 Changes

    April 01, 2021

    🛠 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 when remove_models is called (thanks @Plazas87)
    • 🔋 Feature #517: Introduce 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.
    • 🔋 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 supports State and Enum as arguments (thanks @luup2k)
    • 🔋 Feature #506: NestedState and HierachicalMachine.add_states now accept (lists of) states and enums as initial parameter
  • v0.8.7 Changes

    February 01, 2021

    🛠 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 use states as a keyword to define substates. If children and states are present, only children will be considered.
    • Feature #500: HierarchicalMachine with custom separator now adds is_state partials for nested states (e.g. is_C.s3.a()) to models (thanks @alterscape)
    • 🛠 Bugfix #512: Use model_attribute consistently in AsyncMachine (thanks @thedrow)
    • ✅ Testing now treats most warnings as errors (thanks @thedrow)
    • As a consequence, pygraphviz.Agraph in diagrams_pygraphviz are now copied by transitions since AGraph.copy as of version 1.6 does not close temporary files appropriately
    • HierarchicalMachine 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 errors
  • v0.8.6 Changes

    December 01, 2020

    🛠 Release 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.
    • 🛠 Bugfix #486: Reset NestedState._scope when enter/exit callbacks raise an exception (thanks @m986883511)
    • Bugfix #488: Let HierarchicalMachine._get_trigger which is bound to model.trigger raise a MachineError for invalid events and AttributeError 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 when queued='model' (thanks @jekel)
    • 🔋 Feature #490: Machine.remove_model will now also remove model events from the event queue when queued=True
    • 🔋 Feature #491: Machine.get_transitions and its HSM counterpart now accept Enum and State for source and dest (thanks @thedrow)
  • v0.8.5 Changes

    November 01, 2020

    🛠 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.
    • 🛠 Bugfix #478: Initializing a machine with GraphSupport threw an exception when initial was set to a nested or parallel state (thanks @nickvazztau)
  • v0.8.4 Changes

    October 01, 2020

    🛠 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 prevent transitions to cancel certain tasks.
    • Feature: Constructor of HierarchicalMachine now accepts substates ('A_1_c') and parallel states (['A', 'B']) as initial parameter
  • v0.8.3 Changes

    August 01, 2020

    🛠 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 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)
    • Similarly, auto transitions (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.
    • 🛠 Bugfix: allow_substates did not consider enum states
    • 🔋 Feature: Nested enums can now be passed in a dict as children with initial 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 and after/after_state_change in AsyncMachine (thanks @tzoiker and @vishes-shell)
    • Bugfix #470: Graph.get_graph() did not consider enum states when show_roi=True (thank @termim)