- (Fixed) Incorrect visualisation with PlantUML due to a backward incompatible change in their viewer.
- (Fixed) Minimal version of Python, and related installation instructions.
- (Fixed) Backward incompatible change in
ruamel.yaml
.
- (Fixed) Dropped support for Python 3.5 and 3.6 since they are no longer supported by
ruamel.yaml
used internally.
- (Fixed) Invalid output of
export_to_plantuml
ifstatechart_preamble
is enabled, with plantuml-1.2022.12 (#119).
- (Fixed)
Statechart.remove_state
no longer resets all initial states and all history states (#110, Rigó Ernő).
- (Added) Support for Python 3.9.
- (Fixed) Remove deprecated import from
collections
(#101).- (Fixed) Remove deprecated
threading.isAlive
used insismic.runner.AsyncRunner
.
- (Fixed) Remove dependency to
typing
since it is no longer required for Python 3.5 and prevents the installation of Sismic.
- (Added) A
sismic-plantuml
command-line utility to accesssismic.io.export_to_plantuml
.
- (Fixed) Transitions are no longer duplicated when calling
copy_from_statechart
(#91).
The internals required to expose time and event-related predicates in a PythonEvaluator
are moved
to the Interpreter
instead of being handled by context providers. This eases the implementation by other
code evaluators of uniform semantics for these predicates. This change does not affect Sismic public API.
- (Deprecated) Internal module
sismic.code.context
.
This new release contains many internal changes. While the public API is stable and/or backwards compatible, expect some breaking changes if you relied on Sismic internal API.
A new binding/monitoring system has been deployed on Interpreter
, allowing listeners to be notified about
meta-events. Listeners are simply callables that accept meta-events instances.
- (Added) An
Interpreter.attach
method that accepts any callable. Meta-events raised by the interpreter are propagated to attached listeners.- (Added) An
Interpreter.detach
method to detach a previously attached listener.- (Added) Module
sismic.interpreter.listener
with two convenient listeners for the newly introducedInterpreter.attach
method. TheInternalEventListener
identifies sent events and propagates them as external events. ThePropertyStatechartListener
propagates meta-events, executes and checks property statecharts.- (Changed)
Interpreter.bind
is built on top ofattach
andInternalEventListener
.- (Changed)
Interpreter.bind_property_statechart
is built on top ofattach
andPropertyStatechartListener
.- (Changed) Meta-Event step started has a
time
attribute.- (Changed) Property statecharts are checked for each meta-events, not only at the end of the step.
- (Changed) Meta-events step started and step ended are sent even if no step can be processed.
- (Deprecated) Passing an interpreter to
bind_property_statechart
is deprecated, useinterpreter_klass
instead.
Time and event related predicates were extracted from PythonEvaluator
to ease their reuse.
They can be found in TimeContextProvider
and EventContextProvider
of sismic.code.context
and
rely on the new monitoring system:
- (Added)
TimeContextProvider
andEventContextProvider
insismic.code.context
that exposes most of the predicates that are used inPythonEvaluator
.- (Added) A
setdefault
function that can be used in the preamble and actions of a statechart to assign a default value to a variable.- (Changed) Most predicates exposed by
PythonEvaluator
are implemented by context providers.- (Deprecated)
on_step_starts
method of anEvaluator
.
We also refactored how events are passed and processed by the interpreter. The main visible consequences are:
- (Added) Event parameters can be directly passed to
Interpreter.queue
.- (Fixed) Internal events are processed before external ones (regression introduced in 1.3.0).
- (Fixed) Optional transition for
testing.transition_is_processed
, as promised by its documentation but not implemented.- (Removed) Internal module
sismic.interpreter.queue
.- (Deprecated)
DelayedEvent
, useEvent
with adelay
parameter instead.- (Deprecated) BDD step delayed event sent, use event sent instead.
And some other small changes:
- (Added) Documentation about concurrently running multiple statecharts.
- (Changed) State invariants are checked even if no step can be processed.
- (Fixed) Hook-errors reported by
sismic-bdd
CLI are a little bit more verbose (#81).
Priority can be defined on transitions, allowing to simulate default transitions and to break non-deterministic situations when many transitions are triggered for a single source state:
- (Added) Priority can be set for transitions (using low, high or any integer in yaml). Transitions are selected according to their priorities (still following eventless and inner-first/source state semantics).
- (Added) Interpreter's
_select_transitions
gets two new parameters,eventless_first
andinner_first
. Both default toTrue
and can be used in subclasses to change the default semantics of the interpreter.
The current time of an interpreter is now clock-based driven, thanks to the Clock
base class and its implementations.
- (Added) A
sismic.clock
module with aClock
base class and three direct implementations, namelySimulatedClock
,UtcClock
andSynchronizedClock
. ASimulatedClock
allows to manually or automatically change the time, while aUtcClock
as the expected behaviour of a wall-clock and aSynchronizedClock
is a clock that synchronizes with another interpreter.Clock
instances are used by the interpreter to get the current time during execution. See documentation for more information.- (Added) An
Interpreter.clock
attribute that stores an instance of the newly addedClock
class.- (Changed)
interpreter.time
represents the time of the last executed step, not the current time. Useinterpreter.clock.time
instead.- (Deprecated) Setting
Interpreter.time
is deprecated, set time withInterpreter.clock.time
instead.
Queued events can be delayed when they are added to the interpreter event queue.
- (Added) Delayed events are supported through
DelayedEvent
andDelayedInternalEvent
. If a delayed event with delay d is queued or sent by an interpreter at time t, it will not be processed unless execute or execute_once is called after the current clock exceeds t + d.- (Added) Property statecharts receive a delayed event sent meta-event when a delayed event is sent by a statechart.
- (Added) Delayed events can be sent from within a statechart by specifying a
delay
parameter to thesent
function.- (Added) An
EventQueue
class (insismic.interpreter.queue
) that controls how (delayed) events are handled by an interpreter.
A new interpreter runner that benefit from the clock-based handling of time and delayed events:
- (Added) An
AsyncRunner
in the newly addedrunner
module to asynchronously run an interpreter at regular interval.- (Changed)
helpers.run_in_background
no longer synchronizes the interpreter clock. Use thestart()
method ofinterpreter.clock
or anUtcClock
instance instead.- (Deprecated)
helpers.run_in_background
is deprecated, userunner.AsyncRunner
instead.
And other small changes:
- (Added) A
sismic.testing
module containing some testing primitives to ease the writing of unit tests.- (Changed)
Interpreter.queue
does not longer acceptInternalEvent
.- (Fixed) State on entry time (used for
idle
andafter
) is set after the on entry action is executed, making the two predicates more accurate when long-running actions are executed when a state is entered. Similarly,idle
is reset after the action of a transition is performed, not before.- (Changed) Drop official support for Python 3.4.
- (Fixed) Event shouldn't be exposed when guards of eventless transitions are evaluated (regression introduced in version 1.2.1).
- (Changed) Improve performances when selecting transitions that could/will be triggered.
- (Fixed) Transitions are evaluated according to their event (eventless ones first) and inner-first/source state semantics, allowing to bypass many useless guard evaluations.
- (Added) A
notify
function that can be used in the action code fragments of a statechart to send user-defined meta-events to the bound property statecharts (#67).
- (Fixed) Interpreter instances can be serialized using
pickle
(#66).
- (Fixed) Whitespaces in event parameters used in BDD steps are stripped before they are evaluated.
- (Added)
Interpreter._select_event
accepts an additional parameterconsume
that can be used to select an event without consuming it. - (Added) Documentation for extensions, and two (not included in Sismic!) extensions providing import/export with AMOLA, and new semantics for the interpreter.
- (Fixed) Final states remain in the active configuration unless they are all children of the root state. In this case, statechart execution is stopped. Previously, if all leaf states of the active configuration were final states, the execution stopped even if these final states were nested in an orthogonal or compound state. The corrected behavior strictly adheres to SCXML 1.0 semantics. This could be a backward incompatible change if you explicitly relied on the previously wrong behaviour.
- (Fixed) BDD steps that involve a state raise a
StatechartError
if state does not exist. This prevents state X is active (and its variants) to fail, e.g., because X is misspelled.
After more than two years of development, Sismic is stable enough to be released in version 1.0.0. Consequently, Sismic will adhere to semantic versioning (see semver.org), meaning that breaking changes will only occur in major releases, backward compatible changes in minor releases, and bug fixes in patches.
- (Fixed)
based_on
forexport_to_plantuml
correctly takes into account states whose name contains whitespaces. - (Fixed)
export_to_plantuml
properly exports transition with no event, no guard and no action. - (Changed)
export_to_yaml
does not add quotes by default.
- (Added)
import_from_yaml
accepts afilepath
argument. - (Added)
based_on
andbased_on_filepath
parameters forexport_to_plantuml
so a previously generated PlantUML file can be used as a basis for a new one (including its modifications related to the direction and length of transitions).
- (Removed) Nested context (ie. nested variable scopes) for the Python code evaluator.
- (Fixed) BDD step expression {expression} holds.
- (Changed) Export to PlantUML uses short arrows by default.
- (Changed) Many improvements related to the transitions when using
export_to_plantuml
.
- (Added)
sismic.bdd.execute_bdd
can be used to execute BDD tests programmatically. - (Added)
sismic.bdd.__main__
is the CLI interface forsismic-behave
and can now be executed usingpython -m sismic.bdd
too if sismic is available but not installed. - (Added) Many tests for BDD steps.
- (Changed)
Statechart.copy_from_statechart
has only its first argument that can be provided by position. The remaining ones (esp.source
andreplace
) should be provided by name. - (Fixed) Sismic requires behave >= 1.6.0.
- (Fixed) Older versions of typing do not contain
Deque
. - (Removed)
sismic.bdd.cli.execute_behave
, subsumed bysismic.bdd.execute_bdd
.
- (Added)
sismic.bdd
exposessismic.bdd.cli.execute_behave
function to programmatically usesismic-bdd
. - (Changed)
execute_behave
function has only two required parameters, and the remaining ones (that have default values) can only be set by name, not by position. - (Changed)
action_alias
andassertion_alias
of modulesismic.bdd.steps
are renamed tomap_action
andmap_assertion
and are directly available fromsismic.bdd
.
- (Fixed) Step Given/when I repeat "{step}" {repeat} times requires step to be provided with no Gherkin keyword. The current keyword (either given or when) is automatically used.
- (Fixed) Escape expression in then expression "{expression}" holds and its negative counterpart.
Sismic support for BDD was completely rewritten. The CLI is now sismic-bdd
, pointing to the cli
submodule of
the newly created sismic.bdd
module. All steps that are related to Sismic internals were removed, and only
steps that manipulate the statechart are kept. Check the documentation and sismic.bdd.steps
for more information.
Execution semantics have slightly changed but shouldn't have any impact when running BDD tests.
Predefined steps can be easily extended thanks to the action_alias
and assertion_alias
helpers.
See documentation for more details.
- (Changed)
sismic-behave
CLI is nowsismic-bdd
. - (Removed)
--coverage
option fromsismic-behave
CLI. - (Changed) Rename
sismic.testing
tosismic.bdd
, andsismic.testing.behave
tosismic.bdd.cli
. - (Changed) A new list of predefined steps, available in
sismic.bdd.steps
, see documentation. - (Changed) A "when" step is now required before any "then" step. The "then" steps assert on what happens during the "when" steps, and not on the whole execution or the last step as before.
- (Added)
sismic.bdd.steps
providesaction_alias
andassertion_alias
to make defining new steps easy. - (Changed) BDD tests are directly executed by
pytest
(instead of being triggered by Travis-CI).
Other changes:
- (Changed)
Interpreter.bind_property
becomesInterpreter.bind_property_statechart
. - (Changed)
helpers.coverage_from_trace
returns a dict with "entered states", "exited states" and "processed transitions". - (Removed) Unused
io.text
.
- (Fixed)
export_to_dict
(and by extension,export_to_yaml
) didn't export transition contracts. - (Changed) All the tests are now written using
pytest
instead ofunittest
.
- (Added) Make
Event
,InternalEvent
andMetaEvent
available frominterpreter
as well. - (Changed) Move
helpers
fromsismic.interpreter.helpers
tosismic.helpers
. - (Removed) Remove module
stories
, not really required anymore.
- (Added) Full equality comparison (
__eq__
) for states and transitions (including all relevant attributes). - (Added)
Interpreter.queue
also accepts an event name in addition to anEvent
instance. - (Added)
Interpreter.queue
accepts more than one event (or name) at once. - (Changed)
Evaluator.execute_onentry
andexecute_onexit
becomeexecute_on_entry
andexecute_on_exit
. - (Changed) Many type annotations were added or fixed.
- (Changed)
Interpreter.bind
can no longer be chained.
Property statecharts do not require anymore the use of an ExecutionWatcher
and are now directly supported
by the interpreter. The documentation contains a new page, Monitoring properties, that explains how to monitor
properties at runtime and provides some examples of property statecharts.
- (Added) Property statechart can be bound to an interpreter with
interpreter.bound_property
method, that accepts either aStatechart
or anInterpreter
instance. - (Added) A
PropertyStatechartError
that is raised when a property statechart reaches a final state. - (Added) A
MetaEvent
class to represent meta-events sent by the interpreter for property statechart checking. - (Added)
Interpreter._notify_property(event_name, **kwargs)
andInterpreter._check_properties(macro_step)
that are used internally to respectively send meta-events to bound properties, and to check these properties. - (Changed)
Interpreter.raise_event
is nowInterpreter._raise_event
as it's not supposed to be part of the public API. - (Removed)
sismic.testing
module was removed (including theExecutionWatcher
andTestStoryFromTrace
). - (Removed) BDD steps related to the execution watcher, in
sismic.testing.steps
. - (Fixed)
Interpreter.time
cannot be set to a lower value than the current one (ie. time is monotonic). - (Fixed) A statechart preamble cannot be used to send events.
- (Fixed)
ExecutionWatcher.stop()
was not called at the end of the execution whensismic-behave
was called with--properties
. - (Removed) Unused dependency on
pyparsing
.
- (Added)
sismic.io
contains anexport_to_plantuml
function to export a statechart to PlantUML. - (Added)
sismic-behave
accepts a--properties
argument, pointing to a list of YAML files containing property statecharts that will be checked during execution (in a fail fast mode). - (Changed)
sismic.io.export_to_yaml
accepts an additionalfilepath
argument. - (Fixed) Whitespaces in strings are trimmed when using
import_from_dict
(and hence, usingimport_from_yaml
).
- (Fixed) An exited state is removed from the current configuration before its postconditions are checked.
- (Removed) Sequential conditions that were introduced in 0.22.0.
- (Fixed) Path error when using
sismic-behave
on Windows.
- (Added) A
--debug-on-error
parameter forsismic-behave
.
- (Fixed) Behave step "Event x should be fired" now checks that the event was fired during the last execution.
- (Fixed) YAML values like "1", "1.0", "yes", "True" are converted to strings, not to int, float and bool respectively.
- (Changed)
ruamel.yaml
replacespyyaml
as supported YAML parser. - (Changed) Use
schema
instead ofpykwalify
(which unfortunately freezes its dependencies versions) to validate (the structure of) YAML files. - (Changed)
import_from_yaml
raisesStatechartError
instead ofSchemaError
if it cannot validate given YAML against the predefined schema.
- (Added) A new helper
coverage_from_trace
that returns coverage information (in absolute numbers) from a trace. - (Added) Parameter
fails_fast
(default isFalse
, behavior preserved) forExecutionWatcher.watch_with
methods. This parameter allows the watcher to raise anAssertionError
as soon as the added watcher reaches a final configuration. - (Changed)
StateMixin
,Transition
andEvent
's__eq__
method returns aNotImplemented
object if the other object involved in the comparison is not an instance of the same class, meaning thatEvent('a') == 1
now raises aNotImplementedError
instead of beingFalse
.
- (Changed)
Event
,MacroStep
,MicroStep
,StateMixin
,Transition
,Statechart
andInterpreter
's__repr__
returns a valid Python expression. - (Changed) The context returned by a
PythonEvaluator
(and thus by the defaultInterpreter
) exhibits nested variables (the ones that are not defined in the preamble of a statechart). Those variables are prefixed by the name of the state in which they are declared, to avoid name clashing. - (Changed) Context variables are sorted in exceptions'
.__str__
methods.
- (Added)
sismic-behave
CLI now accepts a--steps
parameter, which is a list of file paths containing the steps implementation. - (Added)
sismic-behave
CLI now accepts a--show-steps
parameter, which list the steps (equivalent to Behave's overriden--steps
parameter). - (Added)
sismic-behave
now returns an appropriate exit code. - (Changed) Reorganisation of
docs/examples
. - (Fixed) Coverage data for
sismic-behave
takes the initialization step into account (regression introduced in 0.21.0).
- (Added)
sent
andreceived
are also available in preconditions and postconditions.
- (Added)
model.Event
is now correctly pickled, meaning that Sismic can be used in a multiprocessing environment.
- (Added) A event {event_name} should not be fired steps for BDD.
- (Added) Both
MicroStep
andMacroStep
have a listsent_events
of events that were sent during the step. - (Added) Property statecharts receive a
event sent
event when an event is sent by the statechart under test. - (Changed) Events fired from within the statechart are now collected and sent at the end of the current micro step, instead of being immediately sent.
- (Changed) Invariants and sequential contracts are now evaluated ordered by their state's depth
- (Added) Support for sequential conditions in contracts (see documentation for more information).
- (Added) Python code evaluator: after and idle are now available in postconditions and invariants.
- (Added) Python code evaluator: received and sent are available in invariants.
- (Added) An
Evaluator
has now aon_step_starts
method which is called at the beginning of each step, with the current event (if any) being processed. - (Added)
Interpreter.raise_event
to send events from within the statechart. - (Added) A
copy_from_statechart
method for aStatechart
instance that allows to copy (part of) a statechart into a state. - (Added) Microwave controller example (see docs/examples/microwave.[yaml|py]).
- (Changed) Events sent by a code evaluator are now returned by the
execute_*
methods instead of being automatically added to the interpreter's queue. - (Changed) Moved
run_in_background
andlog_trace
fromsismic.interpreter
to the newly addedsismic.interpreter.helpers
. - (Changed) Internal API changes: rename
self.__x
toself._x
to avoid (mostly) useless name mangling.
Changes for interpreter.Interpreter
class:
- (Removed)
_select_eventless_transition
which is a special case of_select_transition
. - (Added)
_select_event
, extracted fromexecute_once
. - (Added)
_filter_transitions
, extracted from_select_transition
. - (Changed)
_execute_step
is now_apply_step
. - (Changed)
_compute_stabilization_step
is now_create_stabilization_step
and accepts a list of state names - (Changed)
_compute_transitions_step
is now_create_steps
. - (Changed) Except for the
statechart
parameter, all the parameters forInterpreter
's constructor can now be only provided by name. - (Fixed) Contracts on a transition are checked (if not explicitly disabled) even if the transition has no action.
- (Fixed)
Evaluator.execute_action
is called even if the transition has no action. - (Fixed) States are added/removed from the active configuration as soon as they are entered/exited.
Previously, the configuration was only updated at the end of the step (and could possibly lead to inaccurate results
when using
active(name)
in aPythonEvaluator
).
The default PythonEvaluator
class has been completely rewritten:
- (Changed) Code contained in states and/or transitions is now executed with a local context instead of a global one. The local context of a state is built upon the local context of its parent, and so one until the local context of the statechart is reached. This should facilitate the use of dummy variables in nested states and transitions.
- (Changed) The code is now compiled (once) before is evaluation/execution. This should increase performance.
- (Changed) The frozen context of a state (ie.
__old__
) is now computed only if contracts are checked, and only if at least one invariant or one postcondition exists. - (Changed) The
initial_context
parameter ofEvaluator
's constructor can now only be provided by name. - (Changed) The
additional_context
parameter ofEvaluator._evaluate_code
andEvaluator._execute_code
can now only be provided by name.
Miscellaneous:
- (Fixed) Step I load the statechart now executes (once) the statechart in order to put it into a stable initial configuration (regression introduced in 0.20.0).
- (Added) Type hinting (see PEP484 and mypy-lang project)
- (Changed) Statechart testers are now called property statechart.
- (Changed) Property statechart can describe desirable and undesirable properties.
- (Changed) Step Event x should be fired now checks sent events from the beginning of the test, not only for the last executed step.
- (Fixed) Internal events that are sequentially sent are now sequentially consumed (and not anymore in reverse order).
- (Fixed)
interpreter.log_trace
does not anymore log empty macro step.
- (Added) A step ended event at the end of each step in a tester story.
- (Changed) The name of the events and attributes that are exposed in a tester story has changed. Consult the documentation for more information.
- (Added) Module
interpreter
provides alog_trace
function that takes an interpreter instance and returns a (dynamic) list of executed macro steps. - (Added) Module
testing
exposes anExecutionWatcher
class that can be used to check statechart properties with tester statecharts at runtime. - (Changed)
Interpreter.__init__
does not anymore stabilize the statechart. Stabilization is done during the first call ofexecute_once
. - (Changed)
Story.tell
returns a list ofMacroStep
(the trace) instead of anInterpreter
instance. - (Changed) The name of some attributes of an event in a tester story changes (e.g. event becomes consumed_event, state becomes entered_state or exited_state or source_state or target_state).
- (Removed)
Interpreter.trace
, as it can be easily obtained fromexecute_once
or usinglog_trace
. - (Removed)
Interpreter.__init__
does not accept aninitial_time
parameter. - (Fixed) Parallel state without children does not any more result into an infinite loop.
- (Added) BDD can now output coverage data using
--coverage
command-line argument. - (Changed) The YAML definition of a statechart must use root state: instead of initial state:.
- (Changed) When a contract is evaluated by a
PythonEvaluator
,__old__.x
raises anAttributeError
instead of aKeyError
ifx
does not exist. - (Changed) Behave is now called from Python instead of using a subprocess and thus allows debugging.
- (Added) Support for behavior-driven-development using Behave.
- (Added) An
io.text.export_to_tree
that returns a textual representation of the states. - (Changed)
Statechart.rename_to
does not anymore raiseKeyError
butexceptions.StatechartError
. - (Changed) Wheel build should work on Windows
Many backward incompatible changes in this update, especially if you used to work with model
.
The YAML format of a statechart also changed, look carefully at the changelog and the documentation.
- (Added) YAML: an history state can declare on entry and on exit.
- (Added) Statechart: new methods to manipulate transitions:
transitions_from
,transitions_to
,transitions_with
,remove_transition
androtate_transition
. - (Added) Statechart: new methods to manipulate states:
remove_state
,rename_state
,move_state
,state_for
,parent_for
,children_for
. - (Added) Steps:
__eq__
forMacroStep
andMicroStep
. - (Added) Stories:
tell_by_step
method for aStory
. - (Added) Testing:
teststory_from_trace
generates a step event at the beginning of each step. - (Added) Module: a new exceptions hierarchy (see
exceptions
module). The new exceptions are used in place of the old ones (Warning
,AssertionError
andValueError
). - (Changed) YAML: uppermost states: should be replaced by initial state: and can contain at most one state.
- (Changed) YAML: uppermost on entry: should be replaced by preamble:.
- (Changed) YAML: initial memory of an history state should be specified using memory instead of initial.
- (Changed) YAML: contracts for a statechart must be declared on its root state.
- (Changed) Statechart: rename
StateChart
toStatechart
. - (Changed) Statechart: rename
events
toevents_for
. - (Changed) Statechart:
states
attribute is nowStatechart.state_for
method. - (Changed) Statechart:
register_state
is nowadd_state
. - (Changed) Statechart:
register_transition
is nowadd_transition
. - (Changed) Statechart: now defines a root state.
- (Changed) Statechart: checks done in
validate
. - (Changed) Transition:
.event
is a string instead of anEvent
instance. - (Changed) Transition: attributes
from_state
andto_state
are renamed intosource
andtarget
. - (Changed) Event:
__eq__
takesdata
attribute into account. - (Changed) Event:
event.foo
raises anAttributeError
instead of aKeyError
iffoo
is not defined. - (Changed) State:
StateMixin.name
is now read-only (useStatechart.rename_state
). - (Changed) State: split
HistoryState
into a mixinHistoryStateMixin
and two concrete subclasses, namelyShallowHistoryState
andDeepHistoryState
. - (Changed) IO: Complete rewrite of
io.import_from_yaml
to load states before transitions. Parameter names have changed. - (Changed) Module: adapt module hierarchy (no visible API change).
- (Changed) Module: expose module content through
__all__
. - (Removed) Transition:
transitions
attribute onTransitionStateMixin
, useStatechart.transitions_for
instead. - (Removed) State:
CompositeStateMixin.children
, useStatechart.children_for
instead.
- (Added) An
InternalEvent
subclass formodel.Event
. - (Added)
Interpreter
now exposes itsstatechart
. - (Added)
Statechart.validate
checks that a targeted compound state declares an initial state. - (Changed)
Interpreter.queue
does not accept anymore aninternal
parameter. Use an instance ofInternalEvent
instead (#20). - (Fixed)
Story.story_from_trace
now ignores internal events (#19). - (Fixed) Condition C3 in
Statechart.validate
.
- (Changed) Rename
Interpreter.send
toInterpreter.queue
(#18). - (Changed) Rename
evaluator
module tocode
.
- (Added) Changelog.
- (Fixed) Missing files in MANIFEST.in