Skip to content

Latest commit

 

History

History
489 lines (356 loc) · 32.3 KB

Changelog.md

File metadata and controls

489 lines (356 loc) · 32.3 KB

Changelog

0.9.3 ()

  • Bug #683: Typing wrongly suggested that Transition instances can be passed to Machine.__init__ and/or Machine.add_transition(s) (thanks @antonio-antuan)
  • Typing should be more precise now
    • Made transitions.core.(Async)TransitionConfigDict a TypedDict which can be used to spot parameter errors during static analysis
    • Machine.add_transitions and Machine.__init__ expect a Sequence of configurations for transitions now
    • Added 'async' callbacks to types in asyncio extension

0.9.2 (August 2024)

Release 0.9.2 is a minor release and contains a new mermaid diagram backend, a new model decoration mode for easier development with types and some more features and bugfixes.

  • Bug #610: Decorate models appropriately when HierarchicalMachine is passed to add_state (thanks @e0lithic)
  • Bug #647: Let may_<trigger> check all parallel states in processing order (thanks @spearsear)
  • Bug: HSM.is_state works with parallel states now
  • Experimental features:
    • Add model_override to Machine constructor to determine the mode of operation. With model_override=Fale (default), transitions will not override already defined methods on a model just as it did before. For workflows relying on typing, model_override=True will override methods already defined on the model and only those (!). This allows to control which convenience methods shall be assigned to the model and keeps the statically 'assumed' model in sync with its runtime counterpart. Since defining each and every method manually is rather tiresome, transitions.experimental.utils.generate_base_model features a way to convert a machine configuration into a BaseClass with all convenience functions and callbacks.
    • Add transitions.experimental.utils.{add_transitions, event, with_model_definitions, transition} to define trigger methods in a class model for more convenient type checking. add_transitions can be used as a function decorator and is stackable. event returns a placeholder object for attribute assigment. add_transitions and event have the same signature and support transition definition like machine constructors. The function transition can used for better typing and returns a dictionary that can be passed to the utility functions but also to a machine constructor. add_transitions and event require a machine decorated with with_model_definitions. Decorating a machine with_model_definitions implies model_override=True.
  • Feature: Add may_trigger to models to check whether transitions can be conducted by trigger name.
  • Feature: Add Mermaid diagram backend that returns a mermaid diagram as a string. use_pygraphviz is deprecated in favour for graph_engine which may be pygraphviz (default), graphviz or mermaid.

0.9.1 (May 2024)

Release 0.9.1 is a minor release and contains several bugfixes and some (typing) improvements. This release also introduces on_final callbacks on machines (as well as NestedState) and final flags for states.

  • Bug #594: Fix may_ always returning false for internal transitions (thanks @a-schade)
  • PR #592: Pass investigated transition to EventData context in 'may' check (thanks @msclock)
  • PR #634: Improve the handling of diagrams when working with parallel states, especially when using the show_roi option (thanks @seanxlliu)
  • Bug #619/#639: Exception is not broad enough and does not catch asyncio.CancelledError or KeyboardInterrupt; use BaseException instead (thanks @e0lithic and @ofacklam)
  • '_anchor' suffix has been removed for (py)graphviz cluster node anchors
  • local testing switched from tox to nox
  • PR #633: Remove surrounding whitespace from docstrings (thanks @artofhuman)
  • PR #665: Add on_final to Machine and NestedState constructor and final to State. Callbacks passed to on_final will be executed when a State with final=True is entered or all children of a parallel state are final.
  • Bug #626: Process exceptions with Machine.on_exception in may_ as well (thanks @match1)
  • PR #666: Improved handling of removing transitions for GraphMachine and HiearachicalMachine (thanks @drpjm)
  • PR #667: Better handling of unset styling in GraphMachine
  • Typing:
    • Added --strict mypy flag for transitions type checks (not tests though)
    • Made state, event and machine property mandatory in (Nested)EventData
    • Transition.dest may be None
    • Introduced (Async)CallbackFunc to declutter callback-related signatures
    • Add stub file for extension package for explicite reexport (thanks @DrewDevereux)

0.9.0 (September 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. Since many functions and constructors allow rather arbitrary arguments time will tell whether typing should be strict (and cause more mypy issues) or more relaxed (and thus less precise).
  • 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: Removed _super workaround related to dill (see #236)

0.8.11 (February 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)

0.8.10 (October 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).

0.8.9 (September 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).

0.8.8 (April 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

0.8.7 (February 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

0.8.6 (December 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)

0.8.5 (November 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)

0.8.4 (October 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

0.8.3 (September 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 (thanks @termim)

0.8.2 (June 2020)

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 in Machine.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's ignore_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 in transitions.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

0.8.1 (April 2020)

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 with pytest (thanks @thedrow)

0.8.0 (March 2020)

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
  • 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 in MarkupMachine 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 to graphviz when importing pygraphviz fails
  • Not implemented/tested so far (contributions are welcome!):
    • Proper Graphviz support of parallel states
    • AsyncHierachicalMachine

0.7.2 (January 2020)

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)

0.7.1 (September 2019)

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 with pytest (thanks @artofhuman)
  • Extended add_ordered_transitions documentation in Readme.md
  • Collected code snippets from earlier discussions in examples/Frequently asked questions.ipynb
  • Improved stripping of long_description in setup.py (thanks @artofhuman)

0.7.0 (August 2019)

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 representation
    • GraphMachine uses this representation for Graphs now and does not rely on Machine attributes any longer
  • Feature: The default value of State.ignore_invalid_triggers changed to None. If it is not explicitly set, the Machine's value is used instead.
  • Feature #325: transitions now supports pygraphviz and graphviz for the creation of diagrams. Currently, GraphMachine will check for pygraphviz first and fall back to graphviz. To use graphviz directly pass use_pygraphiv=False to the constructor of GraphMachine
  • Diagram style has been overhauled. Have a look at GraphMachine's attributes machine_attributes and style_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

0.6.9 (October 2018)

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's enter method (thanks @potens1)

0.6.8 (May, 2018)

Release 0.6.8 is a minor release and contains a critical bugfix:

  • Bugfix #301: Reading Readme.md in setup.py causes a UnicodeDecodeError in non-UTF8-locale environments (thanks @jodal)

0.6.7 (May, 2018)

Release 0.6.7 is identical to 0.6.6. A release had been necessary due to #294 related to PyPI.

0.6.6 (May, 2018)

Release 0.6.6 is a minor release and contains several bugfixes and new features:

  • Bugfix: HierarchicalMachine now considers the initial state of NestedState instances/names passed to initial.
  • Bugfix: HierarchicalMachine used to ignore children when NestedStates 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 to Machine

0.6.5 (April, 2018)

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's initial state. Passing initial: False overrides this (thanks @mrjogo).
  • Bugfix #292: Models using GraphMashine were not picklable in the past due to graph property. Graphs for each model are now stored in GraphMachine.model_graphs (thanks @ansumanm).

0.6.4 (January, 2018)

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 in HierachicalMachine.add_model (thanks to @illes).
  • Feature #275: HierarchicalMachine.add_states now supports keyword parent to be a NestedState or a string.
  • Bugfix #278: NestedState has not been exited correctly during reflexive triggering (thanks to @hrsmanian).

0.6.3 (November, 2017)

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 if initial is not the first or last state (thanks to @janekbaraniewski).
  • Bugfix #265: Renamed HierarchicalMachine.to to to_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).

0.6.2 (November, 2017)

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 in core
  • Convert logger instances to _LOGGER to comply with protected module constant naming standards
  • traverse is now protected in HierarchicalMachine
  • Remove abstract class Diagram since it did not add functionality to diagrams
  • Specify several overrides of add_state or add_transition to keep the base class parameters instead of *args and **kwargs
  • Change several if len(x) > 0: checks to if x: as suggested by the static code analysis to make use of falsy empty lists/strings.

0.6.1 (September, 2017)

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 and State
  • Bugfix #253: Machine.remove_transitions converted defaultdict 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 to Machine.name to be consistent with the constructor parameter name
  • Add Machine.add_transitions for adding multiple transitions at once (thanks @Synss)

0.6.0 (August, 2017)

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 states
  • Tags makes states taggable
  • Error checks for error states (not accepted states that cannot be left); subclass of Tags
  • Volatile enables scoped/temporary state objects to handle context parameters
  • Removed add_self from Machine constructor
  • pygraphviz is now optional; use pip 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)

0.5.3 (May, 2017)

Release 0.5.3 is a minor release and contains several bug fixes:

  • Bug #214: LockedMachine as a model prevented correct addition of on_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 caused AttributeError in EventData.__repr__ (thanks to @kunalbhagawati)
  • Bug #215: State instances passed to initial parameter of Machine constructor had not been processed properly (thanks @mathiasimmer)

0.5.2 (April, 2017)

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

0.5.1 (April, 2017)

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 are Machine class variables now which can be altered if necessary.
  • Add LICENSE to packaged distribution (thanks to @bachp)
  • Bug #211: prepare and finalized had not been called for HierarchicalMachines (thanks to @booware)

0.5.0 (March, 2017)

Release 0.5.0 is a major release:

  • CHANGED API: MachineError is now limited to internal error and has been replaced by AttributeError and ValueError where applicable (thanks to @ankostis)
  • CHANGED API: Phasing out add_self; model=None will add NO model starting from next major release; use model='self' instead.
  • Introduced deprecation warnings for upcoming changes concerning Machine keywords model and add_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 supports prepare, conditons, unless, before and after (thanks to @aforren1)
  • New prepare_event and finalize_event keywords to handle transitions globally (thanks to @ankostis)
  • New show_auto_transitions keyword for GraphMachine.__init__ (default False); if enabled, show auto transitions in graph
  • New show_roi keyword for GraphMachine._get_graph (default False); if True, 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 into Graph and NestedGraph 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)

0.4.3 (December, 2016)

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 to Machine.add_transition, it will check if the state (and not just the name) is known to the machine

0.4.2 (October, 2016)

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 and Machine.__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)

0.4.1 (July, 2016)

Release 0.4.1 is a minor release containing bug fixes, minor API changes, and community feedback:

  • async is renamed to queued 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)

0.4.0 (April, 2016)

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

0.3.1 (January 3, 2016)

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

0.3.0 (January 2, 2016)

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

0.2.9 (November 10, 2015)

  • 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

0.2.8 (August, 6, 2015)

  • README improvements, added TOC, and typo fixes
  • Condition checks now receive optional data
  • Removed invasive basicConfig() call introduced with logging in 0.2.6

0.2.7 (July 27, 2015)

  • Fixed import bug that prevented dependency installation at setup

0.2.6 (July 26, 2015)

  • 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

0.2.5 (May 4, 2015)

  • Added ability to suppress invalid trigger calls
  • Shorthand definition of transitions via lists

0.2.4 (March 11, 2015)

  • Automatic detection of predefined state callbacks
  • Fixed bug in automatic transition creation
  • Added Changelog

0.2.3 (January 14, 2015)

  • Added travis-ci support
  • Cleaned up and PEP8fied code
  • Added 'unless' argument to transitions that mirrors 'conditions'

0.2.2 (December 28, 2014)

  • Python 2/3 compatibility
  • Added automatic to_{state}() methods
  • Added ability to easily add ordered transitions