@@ -103,26 +103,13 @@ def start(self):
103103 if self .sm .current_state_value is not None :
104104 return
105105
106- BoundEvent ("__initial__" , _sm = self .sm ).put (machine = self . sm )
106+ BoundEvent ("__initial__" , _sm = self .sm ).put ()
107107
108108 def _initial_transition (self , trigger_data ):
109109 transition = Transition (State (), self .sm ._get_initial_state (), event = "__initial__" )
110110 transition ._specs .clear ()
111111 return transition
112112
113- def select_eventless_transitions (self , trigger_data : TriggerData ):
114- """
115- Select the eventless transitions that match the trigger data.
116- """
117- return self ._select_transitions (trigger_data , lambda t , _e : t .is_eventless )
118-
119- def _conditions_match (self , transition : Transition , trigger_data : TriggerData ):
120- event_data = EventData (trigger_data = trigger_data , transition = transition )
121- args , kwargs = event_data .args , event_data .extended_kwargs
122-
123- self .sm ._callbacks .call (transition .validators .key , * args , ** kwargs )
124- return self .sm ._callbacks .all (transition .cond .key , * args , ** kwargs )
125-
126113 def _filter_conflicting_transitions (
127114 self , transitions : OrderedSet [Transition ]
128115 ) -> OrderedSet [Transition ]:
@@ -234,6 +221,12 @@ def get_effective_target_states(self, transition: Transition) -> OrderedSet[Stat
234221 # TODO: Handle history states
235222 return OrderedSet ([transition .target ])
236223
224+ def select_eventless_transitions (self , trigger_data : TriggerData ):
225+ """
226+ Select the eventless transitions that match the trigger data.
227+ """
228+ return self ._select_transitions (trigger_data , lambda t , _e : t .is_eventless )
229+
237230 def select_transitions (self , trigger_data : TriggerData ) -> OrderedSet [Transition ]:
238231 """
239232 Select the transitions that match the trigger data.
@@ -297,6 +290,27 @@ def microstep(self, transitions: List[Transition], trigger_data: TriggerData):
297290
298291 return result
299292
293+ def _get_args_kwargs (
294+ self , transition : Transition , trigger_data : TriggerData , set_target_as_state : bool = False
295+ ):
296+ # TODO: Ideally this method should be called only once per microstep/transition
297+ event_data = EventData (trigger_data = trigger_data , transition = transition )
298+ if set_target_as_state :
299+ event_data .state = transition .target
300+
301+ args , kwargs = event_data .args , event_data .extended_kwargs
302+
303+ result = self .sm ._callbacks .call (self .sm .prepare .key , * args , ** kwargs )
304+ for new_kwargs in result :
305+ kwargs .update (new_kwargs )
306+ return args , kwargs
307+
308+ def _conditions_match (self , transition : Transition , trigger_data : TriggerData ):
309+ args , kwargs = self ._get_args_kwargs (transition , trigger_data )
310+
311+ self .sm ._callbacks .call (transition .validators .key , * args , ** kwargs )
312+ return self .sm ._callbacks .all (transition .cond .key , * args , ** kwargs )
313+
300314 def _exit_states (self , enabled_transitions : List [Transition ], trigger_data : TriggerData ):
301315 """Compute and process the states to exit for the given transitions."""
302316 states_to_exit = self ._compute_exit_set (enabled_transitions )
@@ -309,8 +323,7 @@ def _exit_states(self, enabled_transitions: List[Transition], trigger_data: Trig
309323 # states_to_exit = sorted(states_to_exit, key=self.exit_order)
310324
311325 for info in states_to_exit :
312- event_data = EventData (trigger_data = trigger_data , transition = info .transition )
313- args , kwargs = event_data .args , event_data .extended_kwargs
326+ args , kwargs = self ._get_args_kwargs (info .transition , trigger_data )
314327
315328 # # TODO: Update history
316329 # for history in state.history:
@@ -342,10 +355,9 @@ def _execute_transition_content(
342355 ):
343356 result = []
344357 for transition in enabled_transitions :
345- event_data = EventData (trigger_data = trigger_data , transition = transition )
346- if set_target_as_state :
347- event_data .state = transition .target
348- args , kwargs = event_data .args , event_data .extended_kwargs
358+ args , kwargs = self ._get_args_kwargs (
359+ transition , trigger_data , set_target_as_state = set_target_as_state
360+ )
349361
350362 result += self .sm ._callbacks .call (get_key (transition ), * args , ** kwargs )
351363
@@ -379,14 +391,14 @@ def _enter_states(
379391 )
380392
381393 # Sort states to enter in entry order
382- # for state in sorted(states_to_enter, key=self.entry_order): # TODO: ordegin of states_to_enter # noqa: E501
394+ # for state in sorted(states_to_enter, key=self.entry_order): # TODO: order of states_to_enter # noqa: E501
383395 for info in states_to_enter :
384396 target = info .target
385397 assert target
386398 transition = info .transition
387- event_data = EventData ( trigger_data = trigger_data , transition = transition )
388- event_data . state = target
389- args , kwargs = event_data . args , event_data . extended_kwargs
399+ args , kwargs = self . _get_args_kwargs (
400+ transition , trigger_data , set_target_as_state = True
401+ )
390402
391403 # Add state to the configuration
392404 # self.sm.configuration |= {target}
@@ -400,7 +412,6 @@ def _enter_states(
400412 # state.is_first_entry = False
401413
402414 # Execute `onentry` handlers
403- # TODO: if not transition.internal:
404415 self .sm ._callbacks .call (target .enter .key , * args , ** kwargs )
405416
406417 # Handle default initial states
@@ -420,18 +431,15 @@ def _enter_states(
420431 parent = target .parent
421432 grandparent = parent .parent
422433
423- self .internal_queue .put (
424- BoundEvent (f"done.state.{ parent .id } " , _sm = self .sm ).build_trigger (
425- machine = self .sm
426- )
427- )
434+ BoundEvent (
435+ f"done.state.{ parent .id } " ,
436+ _sm = self .sm ,
437+ internal = True ,
438+ ).put ()
439+
428440 if grandparent .parallel :
429441 if all (child .final for child in grandparent .states ):
430- self .internal_queue .put (
431- BoundEvent (f"done.state.{ parent .id } " , _sm = self .sm ).build_trigger (
432- machine = self .sm
433- )
434- )
442+ BoundEvent (f"done.state.{ parent .id } " , _sm = self .sm , internal = True ).put ()
435443
436444 def compute_entry_set (
437445 self , transitions , states_to_enter , states_for_default_entry , default_history_content
@@ -521,7 +529,6 @@ def add_descendant_states_to_enter(
521529 assert state
522530
523531 if state .parallel :
524- # Handle parallel states
525532 for child_state in state .states :
526533 if not any (s .target .is_descendant (child_state ) for s in states_to_enter ):
527534 info_to_add = StateTransition (
@@ -536,7 +543,6 @@ def add_descendant_states_to_enter(
536543 default_history_content ,
537544 )
538545 elif state .is_compound :
539- # Handle compound states
540546 states_for_default_entry .add (info )
541547 initial_state = next (s for s in state .states if s .initial )
542548 transition = next (
0 commit comments