- 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)
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
whenpygraphviz
was not installed (thanks @FridjofAmundsen) - Bug #580: Fix
on_timeout
callback resolution when timeout had been initialized withtimeout=0
(thanks @Rysbai) - Bug #582: Last label in
GraphSupport
was not correctly aligned whenshow_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
inon_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 pytransitions#236)
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