66from ..transition_list import TransitionList
77
88
9- def create_machine_class_from_definition (name : str , definition : dict ) -> StateMachine : # noqa: C901
9+ def create_machine_class_from_definition (name : str , ** definition ) -> StateMachine : # noqa: C901
1010 """
1111 Creates a StateMachine class from a dictionary definition, using the StateMachineMetaclass.
1212
1313 Example usage with a traffic light machine:
1414
1515 >>> machine = create_machine_class_from_definition(
1616 ... "TrafficLightMachine",
17- ... {
17+ ... ** {
1818 ... "states": {
19- ... "green": {"initial": True, "on": {"change": {"target": "yellow"}}},
20- ... "yellow": {"on": {"change": {"target": "red"}}},
21- ... "red": {"on": {"change": {"target": "green"}}},
19+ ... "green": {"initial": True, "on": {"change": [ {"target": "yellow"}] }},
20+ ... "yellow": {"on": {"change": [ {"target": "red"}] }},
21+ ... "red": {"on": {"change": [ {"target": "green"}] }},
2222 ... },
2323 ... }
2424 ... )
@@ -36,25 +36,26 @@ def create_machine_class_from_definition(name: str, definition: dict) -> StateMa
3636
3737 events : Dict [str , TransitionList ] = {}
3838 for state_id , state_events in events_definitions .items ():
39- for event_name , transition_data in state_events .items ():
40- source = states_instances [state_id ]
41-
42- target = states_instances [transition_data ["target" ]]
43-
44- transition = source .to (
45- target ,
46- event = event_name ,
47- cond = transition_data .get ("cond" ),
48- unless = transition_data .get ("unless" ),
49- on = transition_data .get ("on" ),
50- before = transition_data .get ("before" ),
51- after = transition_data .get ("after" ),
52- )
53-
54- if event_name in events :
55- events [event_name ] |= transition
56- elif event_name is not None :
57- events [event_name ] = transition
39+ for event_name , transitions_data in state_events .items ():
40+ for trantion_data in transitions_data :
41+ source = states_instances [state_id ]
42+
43+ target = states_instances [trantion_data ["target" ]]
44+
45+ transition = source .to (
46+ target ,
47+ event = event_name ,
48+ cond = trantion_data .get ("cond" ),
49+ unless = trantion_data .get ("unless" ),
50+ on = trantion_data .get ("on" ),
51+ before = trantion_data .get ("before" ),
52+ after = trantion_data .get ("after" ),
53+ )
54+
55+ if event_name in events :
56+ events [event_name ] |= transition
57+ elif event_name is not None :
58+ events [event_name ] = transition
5859
5960 attrs_mapper = {** definition , ** states_instances , ** events }
6061 return StateMachineMetaclass (name , (StateMachine ,), attrs_mapper ) # type: ignore[return-value]
0 commit comments