@@ -74,19 +74,20 @@ The experimental `statemachine.io.scxml` internals were promoted into a format-n
7474IO core (see * What's new* below). Code that imported implementation modules directly must
7575update its imports:
7676
77- | Before | After |
77+ | Before (3.1.x) | After (3.2.0) |
7878| ---| ---|
7979| ` statemachine.io.scxml.schema ` | ` statemachine.io.model ` |
80- | ` statemachine.io.scxml.datamodel ` | ` statemachine.io.evaluators ` |
8180| ` statemachine.io.scxml.parser ` | ` statemachine.io.scxml.reader ` |
8281| generic helpers in ` statemachine.io.scxml.actions ` | ` statemachine.io.actions ` |
82+ | ` protected_attrs ` / ` _eval ` in ` statemachine.io.scxml.actions ` | ` statemachine.io.evaluators ` |
8383| ` EventDataWrapper ` etc. in ` statemachine.io.scxml.actions ` | ` statemachine.io.system_variables ` |
8484| ` SCXMLInvoker ` in ` statemachine.io.scxml.invoke ` | ` Invoker ` in ` statemachine.io.invoke ` |
85- | ` statemachine.io.processor.GenericProcessor ` | ` statemachine.io.interpreter.Interpreter ` (+ ` statemachine.io.builder ` ) |
8685
87- ` statemachine.io.scxml.processor.SCXMLProcessor ` (now a thin ` Interpreter ` wrapper, minus
88- the removed ` parse_scxml_file ` — use ` io.load ` for files) and
89- ` statemachine.io.create_machine_class_from_definition ` keep their behavior.
86+ ` statemachine.io.scxml.processor.SCXMLProcessor ` (now a thin wrapper over the new
87+ format-neutral runtime, minus the removed ` parse_scxml_file ` ; use ` io.load ` for files) and
88+ ` statemachine.io.create_machine_class_from_definition ` keep their behavior. The runtime
89+ itself moved into the new, SCXML-agnostic ` statemachine.io.interpreter.Interpreter ` and
90+ ` statemachine.io.builder ` (see * Architecture* below).
9091
9192## What's new in 3.2.0
9293
@@ -145,4 +146,29 @@ python-statemachine[io] # both of the above
145146
146147## Bug fixes in 3.2.0
147148
148- TODO
149+ ### Sibling compound states with same-named children no longer collide
150+
151+ A ` StateChart ` with sibling compound states whose children reuse the same local
152+ ` id ` (e.g. each region declares an ` a ` and a ` b ` ) but carry distinct ` value= `
153+ identifiers would collapse in the internal instance-state map, which was keyed by
154+ ` state.id ` . The duplicate ids overwrote each other, so dispatching an event
155+ resolved to the wrong ` State ` instance and raised ` TransitionNotAllowed ` .
156+
157+ Instance states are now keyed by ` state.value ` (globally unique, the canonical
158+ identifier already used by ` states_map ` ), fixing dispatch for nested and parallel
159+ configurations that repeat child names.
160+
161+ [ #624 ] ( https://github.com/fgmacedo/python-statemachine/issues/624 ) ,
162+ [ #625 ] ( https://github.com/fgmacedo/python-statemachine/pull/625 ) .
163+
164+ ### Async ` invoke ` no longer cancels itself on its own ` done.invoke `
165+
166+ When an async ` invoke ` completed and its ` done.invoke ` event triggered a
167+ transition out of the owning state, the cancel-on-exit path could cancel the
168+ invocation's own task while it was still running. The ` CancelledError ` surfaced at
169+ the next ` await ` , so the target state's ` on_enter ` callback never finished.
170+
171+ The engine now skips self-cancellation when the invocation's task is the currently
172+ running task, letting the originating handler complete normally.
173+
174+ [ #627 ] ( https://github.com/fgmacedo/python-statemachine/pull/627 ) .
0 commit comments