From 66cee081c62f696de112fd1350105e61a050a70e Mon Sep 17 00:00:00 2001 From: Fernando Macedo Date: Mon, 23 Jan 2023 15:38:55 -0300 Subject: [PATCH 1/3] feat: Nested states (compound / parallel) --- statemachine/factory.py | 32 +++++++-- statemachine/state.py | 51 ++++++++++++++ .../examples/microwave_inheritance_machine.py | 68 +++++++++++++++++++ .../examples/traffic_light_nested_machine.py | 64 +++++++++++++++++ tests/test_compound.py | 68 +++++++++++++++++++ tests/test_nested.py | 5 ++ 6 files changed, 283 insertions(+), 5 deletions(-) create mode 100644 tests/examples/microwave_inheritance_machine.py create mode 100644 tests/examples/traffic_light_nested_machine.py create mode 100644 tests/test_compound.py create mode 100644 tests/test_nested.py diff --git a/statemachine/factory.py b/statemachine/factory.py index 40e3db15..22005a8c 100644 --- a/statemachine/factory.py +++ b/statemachine/factory.py @@ -44,8 +44,26 @@ def __init__( cls.add_inherited(bases) cls.add_from_attributes(attrs) + if not cls.states: + return + initials = [s for s in cls.states if s.initial] + parallels = [s.id for s in cls.states if s.parallel] + root_only_has_parallels = len(cls.states) == len(parallels) + + if len(initials) != 1 and not root_only_has_parallels: + raise InvalidDefinition( + _( + "There should be one and only one initial state. " + "Your currently have these: {0}" + ).format(", ".join(s.id for s in initials)) + ) + try: - cls.initial_state: State = next(s for s in cls.states if s.initial) + if root_only_has_parallels: + # TODO: Temp, whe should fix initial, and current state design + cls.initial_state: State = next(s for s in cls.states if s.initial) + else: + cls.initial_state: State = next(s for s in initials if s.initial) except StopIteration: cls.initial_state = None # Abstract SM still don't have states @@ -205,15 +223,19 @@ def _add_unbounded_callback(cls, attr_name, func): def add_state(cls, id, state: State): state._set_id(id) - cls.states.append(state) - cls.states_map[state.value] = state - if not hasattr(cls, id): - setattr(cls, id, state) + if not state.parent: + cls.states.append(state) + cls.states_map[state.value] = state + if not hasattr(cls, id): + setattr(cls, id, state) # also register all events associated directly with transitions for event in state.transitions.unique_events: cls.add_event(event) + for substate in state.substates: + cls.add_state(substate.id, substate) + def add_event(cls, event, transitions=None): if transitions is not None: transitions.add_event(event) diff --git a/statemachine/state.py b/statemachine/state.py index 4f67d5cd..ebec41ec 100644 --- a/statemachine/state.py +++ b/statemachine/state.py @@ -15,6 +15,24 @@ from .statemachine import StateMachine +class NestedStateFactory(type): + def __new__( # type: ignore [misc] + cls, classname, bases, attrs, name=None, **kwargs + ) -> "State": + if not bases: + return super().__new__(cls, classname, bases, attrs) # type: ignore [return-value] + + substates = [] + for key, value in attrs.items(): + if isinstance(value, State): + value._set_id(key) + substates.append(value) + if isinstance(value, TransitionList): + value.add_event(key) + + return State(name=name, substates=substates, **kwargs) + + class State: """ A State in a :ref:`StateMachine` describes a particular behavior of the machine. @@ -94,20 +112,47 @@ class State: """ + class Builder(metaclass=NestedStateFactory): + # Mimic the :ref:`State` public API to help linters discover the result of the Builder + # class. + + @classmethod + def to(cls, *args: "State", **kwargs) -> "TransitionList": # pragma: no cover + """Create transitions to the given target states. + + .. note: This method is only a type hint for mypy. + The actual implementation belongs to the :ref:`State` class. + """ + return TransitionList() + + @classmethod + def from_(cls, *args: "State", **kwargs) -> "TransitionList": # pragma: no cover + """Create transitions from the given target states (reversed). + + .. note: This method is only a type hint for mypy. + The actual implementation belongs to the :ref:`State` class. + """ + return TransitionList() + def __init__( self, name: str = "", value: Any = None, initial: bool = False, final: bool = False, + parallel: bool = False, + substates: Any = None, enter: Any = None, exit: Any = None, ): self.name = name self.value = value + self.parallel = parallel + self.substates = substates or [] self._initial = initial self._final = final self._id: str = "" + self.parent: "State" = None self.transitions = TransitionList() self._specs = CallbackSpecList() self.enter = self._specs.grouper(CallbackGroup.ENTER).add( @@ -116,6 +161,12 @@ def __init__( self.exit = self._specs.grouper(CallbackGroup.EXIT).add( exit, priority=CallbackPriority.INLINE ) + self._init_substates() + + def _init_substates(self): + for substate in self.substates: + substate.parent = self + setattr(self, substate.id, substate) def __eq__(self, other): return isinstance(other, State) and self.name == other.name and self.id == other.id diff --git a/tests/examples/microwave_inheritance_machine.py b/tests/examples/microwave_inheritance_machine.py new file mode 100644 index 00000000..47aa5071 --- /dev/null +++ b/tests/examples/microwave_inheritance_machine.py @@ -0,0 +1,68 @@ +""" +Microwave machine +================= + +Example that exercises the Compound and Parallel states. + +Compound +-------- + +If there are more than one substates, one of them is usually designated as the initial state of +that compound state. + +When a compound state is active, its substates behave as though they were an active state machine: + Exactly one child state must also be active. This means that: + +When a compound state is entered, it must also enter exactly one of its substates, usually its +initial state. +When an event happens, the substates have priority when it comes to selecting which transition to +follow. If a substate happens to handles an event, the event is consumed, it isn’t passed to the +parent compound state. +When a substate transitions to another substate, both “inside” the compound state, the compound +state does not exit or enter; it remains active. +When a compound state exits, its substate is simultaneously exited too. (Technically, the substate +exits first, then its parent.) +Compound states may be nested, or include parallel states. + +The opposite of a compound state is an atomic state, which is a state with no substates. + +A compound state is allowed to define transitions to its child states. Normally, when a transition +leads from a state, it causes that state to be exited. For transitions from a compound state to +one of its descendants, it is possible to define a transition that avoids exiting and entering +the compound state itself, such transitions are called local transitions. + + +""" +from statemachine import State +from statemachine import StateMachine + + +class MicroWave(StateMachine): + class oven(State.Builder, name="Microwave oven", parallel=True): + class engine(State.Builder): + off = State("Off", initial=True) + + class on(State.Builder): + idle = State("Idle", initial=True) + cooking = State("Cooking") + + idle.to(cooking, cond="closed.is_active") + cooking.to(idle, cond="open.is_active") + cooking.to.itself(internal=True, on="increment_timer") + + turn_off = on.to(off) + turn_on = off.to(on) + on.to(off, cond="cook_time_is_over") # eventless transition + + class door(State.Builder): + closed = State(initial=True) + open = State() + + door_open = closed.to(open) + door_close = open.to(closed) + + def __init__(self): + self.cook_time = 5 + self.door_closed = True + self.timer = 0 + super().__init__() diff --git a/tests/examples/traffic_light_nested_machine.py b/tests/examples/traffic_light_nested_machine.py new file mode 100644 index 00000000..33220680 --- /dev/null +++ b/tests/examples/traffic_light_nested_machine.py @@ -0,0 +1,64 @@ +""" +Nested Traffic light machine +---------------------------- + +Demonstrates the concept of nested compound states. + +From this example on XState: https://xstate.js.org/docs/guides/hierarchical.html#api + +""" +import time + +from statemachine import State +from statemachine import StateMachine + + +class NestedTrafficLightMachine(StateMachine): + "A traffic light machine" + green = State(initial=True, enter="reset_elapsed") + yellow = State(enter="reset_elapsed") + + class red(State.Builder, enter="reset_elapsed"): + "Pedestrian states" + walk = State(initial=True) + wait = State() + stop = State() + blinking = State() + + ped_countdown = walk.to(wait) | wait.to(stop) + + timer = green.to(yellow) | yellow.to(red) | red.to(green) + power_outage = red.blinking.from_() + power_restored = red.from_() + + def __init__(self, seconds_to_turn_state=5, seconds_running=20): + self.seconds_to_turn_state = seconds_to_turn_state + self.seconds_running = seconds_running + super().__init__(allow_event_without_transition=True) + + def on_timer(self, event: str, source: State, target: State): + print(f".. Running {event} from {source.id} to {target.id}") + + def reset_elapsed(self, event: str, time: int = 0): + print(f"entering reset_elapsed from {event} with {time}") + self.last_turn = time + + @timer.cond + def time_is_over(self, time): + return time - self.last_turn > self.seconds_to_turn_state + + def run_forever(self): + self.running = True + start_time = time.time() + while self.running: + print("tick!") + time.sleep(1) + curr_time = time.time() + self.send("timer", time=curr_time) + + if curr_time - start_time > self.seconds_running: + self.running = False + + +sm = NestedTrafficLightMachine() +sm.send("anything") diff --git a/tests/test_compound.py b/tests/test_compound.py new file mode 100644 index 00000000..c2eb8a11 --- /dev/null +++ b/tests/test_compound.py @@ -0,0 +1,68 @@ +import pytest + +from statemachine import State + + +@pytest.fixture() +def microwave_cls(): + from tests.examples.microwave_inheritance_machine import MicroWave + + return MicroWave + + +def assert_state(s, name, initial=False, final=False, parallel=False, substates=None): + if substates is None: + substates = [] + + assert isinstance(s, State) + assert s.name == name + assert s.initial is initial + assert s.final is final + assert s.parallel is parallel + assert isinstance(s, State) + assert set(s.substates) == set(substates) + + +class TestNestedSyntax: + def test_capture_constructor_arguments(self, microwave_cls): + sm = microwave_cls() + + assert_state( + sm.oven, + "Microwave oven", + parallel=True, + substates=[sm.oven.engine, sm.oven.door], + ) + assert_state( + sm.oven.engine, + "Engine", + initial=False, + substates=[sm.oven.engine.on, sm.oven.engine.off], + ) + assert_state(sm.oven.engine.off, "Off", initial=True) + assert_state( + sm.oven.engine.on, + "On", + substates=[sm.oven.engine.on.idle, sm.oven.engine.on.cooking], + ) + assert_state( + sm.oven.door, + "Door", + initial=False, + substates=[sm.oven.door.closed, sm.oven.door.open], + ) + assert_state(sm.oven.door.closed, "Closed", initial=True) + assert_state(sm.oven.door.open, "Open") + + def test_list_children_states(self, microwave_cls): + sm = microwave_cls() + assert [s.id for s in sm.oven.engine.substates] == ["off", "on"] + + def test_list_events(self, microwave_cls): + sm = microwave_cls() + assert [e.name for e in sm.events] == [ + "turn_on", + "turn_off", + "door_open", + "door_close", + ] diff --git a/tests/test_nested.py b/tests/test_nested.py new file mode 100644 index 00000000..de96b979 --- /dev/null +++ b/tests/test_nested.py @@ -0,0 +1,5 @@ +def test_nested_sm(): + from tests.examples.microwave_inheritance_machine import MicroWave + + sm = MicroWave() + assert sm.current_state.id == "oven" From 4de8712c6febca8500420fbbc9d5ca3a805978d2 Mon Sep 17 00:00:00 2001 From: Fernando Macedo Date: Tue, 9 Jul 2024 13:44:19 -0300 Subject: [PATCH 2/3] feat: Diagram compound and parallel states --- conftest.py | 24 +++++ docs/diagram.md | 2 +- docs/images/order_control_machine_initial.png | Bin 24245 -> 26229 bytes .../order_control_machine_processing.png | Bin 26212 -> 27462 bytes docs/images/readme_trafficlightmachine.png | Bin 12761 -> 15329 bytes docs/images/test_state_machine_internal.png | Bin 9287 -> 9725 bytes statemachine/contrib/diagram.py | 102 ++++++++++++++---- statemachine/factory.py | 22 ++-- statemachine/state.py | 34 ++++-- statemachine/states.py | 3 + tests/test_compound.py | 44 +++++++- tests/test_contrib_diagram.py | 2 +- 12 files changed, 192 insertions(+), 41 deletions(-) diff --git a/conftest.py b/conftest.py index fcdcaf2c..39cfdf91 100644 --- a/conftest.py +++ b/conftest.py @@ -1,4 +1,6 @@ +import io import sys +from unittest import mock import pytest @@ -31,3 +33,25 @@ def pytest_ignore_collect(collection_path, path, config): if "django_project" in str(path): return True + + +@pytest.fixture(autouse=True, scope="module") +def mock_dot_write(request): + def open_effect( + filename, + mode="r", + *args, + **kwargs, + ): + if mode in ("r", "rt", "rb"): + return open(filename, mode, *args, **kwargs) + elif filename.startswith("/tmp/"): + return open(filename, mode, *args, **kwargs) + elif "b" in mode: + return io.BytesIO() + else: + return io.StringIO() + + with mock.patch("pydot.core.io.open", spec=True) as m: + m.side_effect = open_effect + yield m diff --git a/docs/diagram.md b/docs/diagram.md index 2238bf46..91b72258 100644 --- a/docs/diagram.md +++ b/docs/diagram.md @@ -42,7 +42,7 @@ Graphviz. For example, on Debian-based systems (such as Ubuntu), you can use the >>> dot = graph() >>> dot.to_string() # doctest: +ELLIPSIS -'digraph list {... +'digraph OrderControl {... ``` diff --git a/docs/images/order_control_machine_initial.png b/docs/images/order_control_machine_initial.png index bd5cf06dd1bee2bb20511653c585d6f9eba07f00..fed73a4e2fb73ffffda0ffe4c157a6e5578c53de 100644 GIT binary patch literal 26229 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 literal 24245 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 diff --git a/docs/images/order_control_machine_processing.png b/docs/images/order_control_machine_processing.png index 5355f07888799e24b455154fb942087faa180c8d..f4ddae7a5af6160a173a365e39799af8bd814cf1 100644 GIT binary patch literal 27462 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

OZw2i~GL};~8 z;zE140`Z%Pa#2K`WP>|Uscx3v&q=nO0P%Q1jOAlu;i?7k(80r_c=U3V+Y_8u{ZQ?m zjgRL6H`@Gx$3Y}3%#zITiMa$yCIL)rOa2`oeLf_2*WO?-So7QsEPT~M3 zSq8+8jFbr#6#^RmIyAN3&u^+rUS@X7r;j(!X*ZZz%ltw;sD=~^dvLE?Kyc7c}d!ftAXcW>WIKhkmym zW3@bKK%oGG01YG6*%&2CggEN+xGK8nl@#_K@}yBDq_j{0XCrr)j2tT z5c{&gXYlgzA#S|pd8VSlk%m^_HM&T`BN`>P3>*uhz;Pn~CAkBr$-a=zAML5o0ud$*wk*}p zpYQ6CVsb{Le=v{-1m_alM=z2Xf1E2jnA-HxOG( z9&mArmEp@911^Wv(FG_P&FS{?NmQgX$6rmR&9@_xe9{NviKo$~jlc#85^`r2P&G;I&C1DH zhiicJ5czuQ_r;2hfD!{J{U`4Df_6aJ)u{0alL)!$sM+*Ax_3$atecIV6rS zUS3|I2jq7mxO#u8T?rA#o`aupDD?gK!G((F;iE@*QbGlV0&Nx(Rxeqq1Zs43jmFny z;!K4i61jUgxQC!27=4I+`vTT=nJ?2pTg5 zDcPZkf#-E?o^Eb-Zsph=R^`hZ;j1ma5hsOY; zKtkj|L}^cant=9EmJu>MUjpagie%&SnAt-`~t1wDEd zq=x6Q454-+88viOe#s=k!pDFH^?v?*9tp*2*`dy9aj2zQPGFJcpAZ_+pg`HLw+Cn} zWSNo*3ajet>lE(O@}{ULp(qKhzoAKrd0ChOjDZO%M;np3~nFfktoM}<^>Ff;iJRAfZ_XwW$v0k0m#%`6=x zs_)9BMPi?#11=DG`U%1%qj}k&+3wxC5K;g$@PZi(EX5@@Y{<1$$C9-zJ1#^pBCPj* z^ptf>O}Q|*NF4u;NS}t4M}g8qw*Lu=P_;9^)$krk4O~BLFR)@Ou!=#N&Kp@>c$6%V zso%?^wGIOYwHA6u)|D&ILgojL*wWMEPI&N2rY(Jz3M%na(uP5^4nMXRRA&V6aBfCO z->`kE(4i!7`qXHTxZZgV9b^JVa*aS!Pz%&SZV`&Yq^7=}80it$F-3r!lou&XVBOXu z6hL9d4%#&;U^YT*D;{MD*VBsD- P7>lyYz*N6j*CFgb$cd47 literal 26212 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 literal 12761 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 Ccxep) literal 9287 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 dP7NN&rB=g#BILuXft5iJDKRBo- diff --git a/statemachine/contrib/diagram.py b/statemachine/contrib/diagram.py index 694cae7d..9e434334 100644 --- a/statemachine/contrib/diagram.py +++ b/statemachine/contrib/diagram.py @@ -32,21 +32,34 @@ class DotGraphMachine: def __init__(self, machine): self.machine = machine - def _get_graph(self): - machine = self.machine + def _get_graph(self, machine): return pydot.Dot( - "list", + machine.name, graph_type="digraph", label=machine.name, fontname=self.font_name, fontsize=self.state_font_size, rankdir=self.graph_rankdir, + compound="true", ) - def _initial_node(self): + def _get_subgraph(self, state): + style = ", solid" + if state.parent and state.parent.parallel: + style = ", dashed" + subgraph = pydot.Subgraph( + label=f"{state.name}", + graph_name=f"cluster_{state.id}", + style=f"rounded{style}", + cluster="true", + ) + return subgraph + + def _initial_node(self, state): node = pydot.Node( - "i", - shape="circle", + self._state_id(state), + label="", + shape="point", style="filled", fontsize="1pt", fixedsize="true", @@ -56,14 +69,18 @@ def _initial_node(self): node.set_fillcolor("black") return node - def _initial_edge(self): + def _initial_edge(self, initial_node, state): + extra_params = {} + if state.states: + extra_params["lhead"] = f"cluster_{state.id}" return pydot.Edge( - "i", - self.machine.initial_state.id, + initial_node.get_name(), + self._state_id(state), label="", color="blue", fontname=self.font_name, fontsize=self.transition_font_size, + **extra_params, ) def _actions_getter(self): @@ -104,11 +121,18 @@ def _state_actions(self, state): return actions + @staticmethod + def _state_id(state): + if state.states: + return f"{state.id}_anchor" + else: + return state.id + def _state_as_node(self, state): actions = self._state_actions(state) node = pydot.Node( - state.id, + self._state_id(state), label=f"{state.name}{actions}", shape="rectangle", style="rounded, filled", @@ -127,29 +151,64 @@ def _transition_as_edge(self, transition): cond = ", ".join([str(cond) for cond in transition.cond]) if cond: cond = f"\n[{cond}]" + + extra_params = {} + has_substates = transition.source.states or transition.target.states + if transition.source.states: + extra_params["ltail"] = f"cluster_{transition.source.id}" + if transition.target.states: + extra_params["lhead"] = f"cluster_{transition.target.id}" + return pydot.Edge( - transition.source.id, - transition.target.id, + self._state_id(transition.source), + self._state_id(transition.target), label=f"{transition.event}{cond}", color="blue", fontname=self.font_name, fontsize=self.transition_font_size, + minlen=2 if has_substates else 1, + **extra_params, ) def get_graph(self): - graph = self._get_graph() - graph.add_node(self._initial_node()) - graph.add_edge(self._initial_edge()) + graph = self._get_graph(self.machine) + self._graph_states(self.machine, graph) + return graph - for state in self.machine.states: - graph.add_node(self._state_as_node(state)) - for transition in state.transitions: + def _graph_states(self, state, graph): + initial_node = self._initial_node(state) + initial_subgraph = pydot.Subgraph( + graph_name=f"{initial_node.get_name()}_initial", + label="", + peripheries=0, + margin=0, + ) + atomic_states_subgraph = pydot.Subgraph( + graph_name=f"cluster_{initial_node.get_name()}_atomic", + label="", + peripheries=0, + cluster="true", + ) + initial_subgraph.add_node(initial_node) + graph.add_subgraph(initial_subgraph) + graph.add_subgraph(atomic_states_subgraph) + + initial = next(s for s in state.states if s.initial) + graph.add_edge(self._initial_edge(initial_node, initial)) + + for substate in state.states: + if substate.states: + subgraph = self._get_subgraph(substate) + self._graph_states(substate, subgraph) + graph.add_subgraph(subgraph) + else: + atomic_states_subgraph.add_node(self._state_as_node(substate)) + + for transition in substate.transitions: if transition.internal: continue graph.add_edge(self._transition_as_edge(transition)) - return graph - def __call__(self): return self.get_graph() @@ -165,7 +224,8 @@ def quickchart_write_svg(sm: StateMachine, path: str): >>> from tests.examples.order_control_machine import OrderControl >>> sm = OrderControl() >>> print(sm._graph().to_string()) - digraph list { + digraph OrderControl { + compound=true; fontname=Arial; fontsize="10pt"; label=OrderControl; diff --git a/statemachine/factory.py b/statemachine/factory.py index 22005a8c..6a7ac026 100644 --- a/statemachine/factory.py +++ b/statemachine/factory.py @@ -32,6 +32,7 @@ def __init__( super().__init__(name, bases, attrs) registry.register(cls) cls.name = cls.__name__ + cls.id = cls.name.lower() cls.states: States = States() cls.states_map: Dict[Any, State] = {} """Map of ``state.value`` to the corresponding :ref:`state`.""" @@ -46,6 +47,9 @@ def __init__( if not cls.states: return + + cls._initials_by_document_order(cls.states) + initials = [s for s in cls.states if s.initial] parallels = [s.id for s in cls.states if s.parallel] root_only_has_parallels = len(cls.states) == len(parallels) @@ -59,11 +63,7 @@ def __init__( ) try: - if root_only_has_parallels: - # TODO: Temp, whe should fix initial, and current state design - cls.initial_state: State = next(s for s in cls.states if s.initial) - else: - cls.initial_state: State = next(s for s in initials if s.initial) + cls.initial_state: State = next(s for s in initials if s.initial) except StopIteration: cls.initial_state = None # Abstract SM still don't have states @@ -77,6 +77,16 @@ def __init__( def __getattr__(self, attribute: str) -> Any: ... + def _initials_by_document_order(cls, states): + has_initial = False + for s in states: + cls._initials_by_document_order(s.states) + if s.initial: + has_initial = True + break + if not has_initial and states: + states[0]._initial = True + def _check(cls): has_states = bool(cls.states) has_events = bool(cls._events) @@ -233,7 +243,7 @@ def add_state(cls, id, state: State): for event in state.transitions.unique_events: cls.add_event(event) - for substate in state.substates: + for substate in state.states: cls.add_state(substate.id, substate) def add_event(cls, event, transitions=None): diff --git a/statemachine/state.py b/statemachine/state.py index ebec41ec..0a52b0a4 100644 --- a/statemachine/state.py +++ b/statemachine/state.py @@ -22,15 +22,15 @@ def __new__( # type: ignore [misc] if not bases: return super().__new__(cls, classname, bases, attrs) # type: ignore [return-value] - substates = [] + states = [] for key, value in attrs.items(): if isinstance(value, State): value._set_id(key) - substates.append(value) + states.append(value) if isinstance(value, TransitionList): value.add_event(key) - return State(name=name, substates=substates, **kwargs) + return State(name=name, states=states, **kwargs) class State: @@ -141,14 +141,15 @@ def __init__( initial: bool = False, final: bool = False, parallel: bool = False, - substates: Any = None, + states: Any = None, enter: Any = None, exit: Any = None, ): self.name = name self.value = value self.parallel = parallel - self.substates = substates or [] + self.states = states or [] + self.is_atomic = bool(not self.states) self._initial = initial self._final = final self._id: str = "" @@ -161,12 +162,12 @@ def __init__( self.exit = self._specs.grouper(CallbackGroup.EXIT).add( exit, priority=CallbackPriority.INLINE ) - self._init_substates() + self._init_states() - def _init_substates(self): - for substate in self.substates: - substate.parent = self - setattr(self, substate.id, substate) + def _init_states(self): + for state in self.states: + state.parent = self + setattr(self, state.id, state) def __eq__(self, other): return isinstance(other, State) and self.name == other.name and self.id == other.id @@ -268,6 +269,7 @@ def __init__( ): self._state = ref(state) self._machine = ref(machine) + self._init_states() @property def name(self): @@ -313,3 +315,15 @@ def id(self) -> str: @property def is_active(self): return self._machine().current_state == self + + @property + def is_atomic(self): + return self._state().is_atomic + + @property + def parent(self): + return self._state().parent + + @property + def states(self): + return self._state().states diff --git a/statemachine/states.py b/statemachine/states.py index 1f5c2257..d91e702e 100644 --- a/statemachine/states.py +++ b/statemachine/states.py @@ -61,6 +61,9 @@ def __getattr__(self, name: str): def __len__(self): return len(self._states) + def __getitem__(self, index): + return list(self)[index] + def __iter__(self): return iter(self._states.values()) diff --git a/tests/test_compound.py b/tests/test_compound.py index c2eb8a11..f26044a7 100644 --- a/tests/test_compound.py +++ b/tests/test_compound.py @@ -1,6 +1,7 @@ import pytest from statemachine import State +from statemachine.statemachine import StateMachine @pytest.fixture() @@ -20,7 +21,7 @@ def assert_state(s, name, initial=False, final=False, parallel=False, substates= assert s.final is final assert s.parallel is parallel assert isinstance(s, State) - assert set(s.substates) == set(substates) + assert set(s.states) == set(substates) class TestNestedSyntax: @@ -56,7 +57,7 @@ def test_capture_constructor_arguments(self, microwave_cls): def test_list_children_states(self, microwave_cls): sm = microwave_cls() - assert [s.id for s in sm.oven.engine.substates] == ["off", "on"] + assert [s.id for s in sm.oven.engine.states] == ["off", "on"] def test_list_events(self, microwave_cls): sm = microwave_cls() @@ -66,3 +67,42 @@ def test_list_events(self, microwave_cls): "door_open", "door_close", ] + + +class TestLCCAProperties: + def test_should_enter_initial_state(self, capsys): # noqa: C901 + class Machine(StateMachine): + class S(State.Builder): + class s1(State.Builder): + s11 = State(initial=True) + + def on_exit_s11(self): + print("leaving s11") + + def on_exit_s1(self): + print("leaving s1") + + class s2(State.Builder): + s21 = State(initial=True) + + def on_enter_s21(self): + print("entering s21") + + def on_enter_s2(self): + print("entering s2") + + def on_enter_s(self): + print("entering s") + + def on_exit_s(self): + print("leaving s") + + e = S.s1.to(S.s2.s21) + + def on_e(self): + print("executing transition") + + m = Machine() + m.send("e") + out, err = capsys.readouterr() + assert out == "leaving s11\nleaving s1\nexecuting transition\nentering s2\nentering s21\n" diff --git a/tests/test_contrib_diagram.py b/tests/test_contrib_diagram.py index b54a43d3..46cd6eef 100644 --- a/tests/test_contrib_diagram.py +++ b/tests/test_contrib_diagram.py @@ -47,7 +47,7 @@ def test_machine_dot(OrderControl): dot = graph() dot_str = dot.to_string() # or dot.to_string() - assert dot_str.startswith("digraph list {") + assert dot_str.startswith("digraph OrderControl {") class TestDiagramCmdLine: From 0e363ce839eb6343f546479ac0d54ea2547f632c Mon Sep 17 00:00:00 2001 From: Fernando Macedo Date: Thu, 11 Jul 2024 10:39:42 -0300 Subject: [PATCH 3/3] feat: New statechartengine for experimentation without breaking all the tests --- docs/_static/custom_machine.css | 1 + docs/states.md | 1 + statemachine/engines/async_.py | 22 ++--- statemachine/engines/base.py | 34 ++++++++ statemachine/engines/statechart.py | 130 +++++++++++++++++++++++++++++ statemachine/engines/sync.py | 25 ++---- statemachine/factory.py | 11 +++ statemachine/graph.py | 9 ++ statemachine/state.py | 10 ++- statemachine/statemachine.py | 18 +--- 10 files changed, 213 insertions(+), 48 deletions(-) create mode 100644 statemachine/engines/base.py create mode 100644 statemachine/engines/statechart.py diff --git a/docs/_static/custom_machine.css b/docs/_static/custom_machine.css index 76c99cc6..7eebd625 100644 --- a/docs/_static/custom_machine.css +++ b/docs/_static/custom_machine.css @@ -28,6 +28,7 @@ } + /* Gallery Donwload buttons */ div.sphx-glr-download a { color: #404040 !important; diff --git a/docs/states.md b/docs/states.md index 6b1d43e2..b127be35 100644 --- a/docs/states.md +++ b/docs/states.md @@ -17,6 +17,7 @@ How to define and attach [](actions.md) to {ref}`States`. A {ref}`StateMachine` should have one and only one `initial` {ref}`state`. +If not specified, the default initial state is the first child state in document order. The initial {ref}`state` is entered when the machine starts and the corresponding entering state {ref}`actions` are called if defined. diff --git a/statemachine/engines/async_.py b/statemachine/engines/async_.py index 84310836..bb363ed9 100644 --- a/statemachine/engines/async_.py +++ b/statemachine/engines/async_.py @@ -1,25 +1,17 @@ -from threading import Lock -from typing import TYPE_CHECKING -from weakref import proxy - from ..event_data import EventData from ..event_data import TriggerData from ..exceptions import InvalidDefinition from ..exceptions import TransitionNotAllowed from ..i18n import _ from ..transition import Transition - -if TYPE_CHECKING: - from ..statemachine import StateMachine +from .base import BaseEngine -class AsyncEngine: - def __init__(self, sm: "StateMachine", rtc: bool = True): - self.sm = proxy(sm) - self._sentinel = object() +class AsyncEngine(BaseEngine): + def __init__(self, sm, rtc: bool = True): if not rtc: raise InvalidDefinition(_("Only RTC is supported on async engine")) - self._processing = Lock() + super().__init__(sm, rtc) async def activate_initial_state(self): """ @@ -63,8 +55,8 @@ async def processing_loop(self): first_result = self._sentinel try: # Execute the triggers in the queue in FIFO order until the queue is empty - while self.sm._external_queue: - trigger_data = self.sm._external_queue.popleft() + while self._external_queue: + trigger_data = self._external_queue.popleft() try: result = await self._trigger(trigger_data) if first_result is self._sentinel: @@ -72,7 +64,7 @@ async def processing_loop(self): except Exception: # Whe clear the queue as we don't have an expected behavior # and cannot keep processing - self.sm._external_queue.clear() + self._external_queue.clear() raise finally: self._processing.release() diff --git a/statemachine/engines/base.py b/statemachine/engines/base.py new file mode 100644 index 00000000..0d3e8c67 --- /dev/null +++ b/statemachine/engines/base.py @@ -0,0 +1,34 @@ +from collections import deque +from threading import Lock +from typing import TYPE_CHECKING +from weakref import proxy + +from ..event_data import TriggerData + +if TYPE_CHECKING: + from ..statemachine import StateMachine + + +class BaseEngine: + def __init__(self, sm: "StateMachine", rtc: bool = True) -> None: + self.sm = proxy(sm) + self._external_queue: deque = deque() + self._sentinel = object() + self._rtc = rtc + self._processing = Lock() + self._put_initial_activation_trigger_on_queue() + + def _put_nonblocking(self, trigger_data: TriggerData): + """Put the trigger on the queue without blocking the caller.""" + self._external_queue.append(trigger_data) + + def _put_initial_activation_trigger_on_queue(self): + # Activate the initial state, this only works if the outer scope is sync code. + # for async code, the user should manually call `await sm.activate_initial_state()` + # after state machine creation. + if self.sm.current_state_value is None: + trigger_data = TriggerData( + machine=self.sm, + event="__initial__", + ) + self._put_nonblocking(trigger_data) diff --git a/statemachine/engines/statechart.py b/statemachine/engines/statechart.py new file mode 100644 index 00000000..f7be7a09 --- /dev/null +++ b/statemachine/engines/statechart.py @@ -0,0 +1,130 @@ +from ..event_data import EventData +from ..event_data import TriggerData +from ..exceptions import TransitionNotAllowed +from ..transition import Transition +from .base import BaseEngine + + +class StateChartEngine(BaseEngine): + def __init__(self, sm, rtc: bool = True): + super().__init__(sm, rtc) + self.activate_initial_state() + + def activate_initial_state(self): + """ + Activate the initial state. + + Called automatically on state machine creation from sync code, but in + async code, the user must call this method explicitly. + + Given how async works on python, there's no built-in way to activate the initial state that + may depend on async code from the StateMachine.__init__ method. + """ + return self.processing_loop() + + def processing_loop(self): + """Process event triggers. + + The simplest implementation is the non-RTC (synchronous), + where the trigger will be run immediately and the result collected as the return. + + .. note:: + + While processing the trigger, if others events are generated, they + will also be processed immediately, so a "nested" behavior happens. + + If the machine is on ``rtc`` model (queued), the event is put on a queue, and only the + first event will have the result collected. + + .. note:: + While processing the queue items, if others events are generated, they + will be processed sequentially (and not nested). + + """ + if not self._rtc: + # The machine is in "synchronous" mode + trigger_data = self._external_queue.popleft() + return self._trigger(trigger_data) + + # We make sure that only the first event enters the processing critical section, + # next events will only be put on the queue and processed by the same loop. + if not self._processing.acquire(blocking=False): + return None + + # We will collect the first result as the processing result to keep backwards compatibility + # so we need to use a sentinel object instead of `None` because the first result may + # be also `None`, and on this case the `first_result` may be overridden by another result. + first_result = self._sentinel + try: + # Execute the triggers in the queue in FIFO order until the queue is empty + while self._external_queue: + trigger_data = self._external_queue.popleft() + try: + result = self._trigger(trigger_data) + if first_result is self._sentinel: + first_result = result + except Exception: + # Whe clear the queue as we don't have an expected behavior + # and cannot keep processing + self._external_queue.clear() + raise + finally: + self._processing.release() + return first_result if first_result is not self._sentinel else None + + def _trigger(self, trigger_data: TriggerData): + event_data = None + if trigger_data.event == "__initial__": + transition = Transition(None, self.sm._get_initial_state(), event="__initial__") + transition._specs.clear() + event_data = EventData(trigger_data=trigger_data, transition=transition) + self._activate(event_data) + return self._sentinel + + state = self.sm.current_state + for transition in state.transitions: + if not transition.match(trigger_data.event): + continue + + event_data = EventData(trigger_data=trigger_data, transition=transition) + args, kwargs = event_data.args, event_data.extended_kwargs + self.sm._get_callbacks(transition.validators.key).call(*args, **kwargs) + if not self.sm._get_callbacks(transition.cond.key).all(*args, **kwargs): + continue + + result = self._activate(event_data) + event_data.result = result + event_data.executed = True + break + else: + if not self.sm.allow_event_without_transition: + raise TransitionNotAllowed(trigger_data.event, state) + + return event_data.result if event_data else None + + def _activate(self, event_data: EventData): + args, kwargs = event_data.args, event_data.extended_kwargs + transition = event_data.transition + source = event_data.state + target = transition.target + + result = self.sm._get_callbacks(transition.before.key).call(*args, **kwargs) + if source is not None and not transition.internal: + self.sm._get_callbacks(source.exit.key).call(*args, **kwargs) + + result += self.sm._get_callbacks(transition.on.key).call(*args, **kwargs) + + self.sm.current_state = target + event_data.state = target + kwargs["state"] = target + + if not transition.internal: + self.sm._get_callbacks(target.enter.key).call(*args, **kwargs) + self.sm._get_callbacks(transition.after.key).call(*args, **kwargs) + + if len(result) == 0: + result = None + elif len(result) == 1: + result = result[0] + + return result diff --git a/statemachine/engines/sync.py b/statemachine/engines/sync.py index c89c7570..74697b00 100644 --- a/statemachine/engines/sync.py +++ b/statemachine/engines/sync.py @@ -1,22 +1,13 @@ -from threading import Lock -from typing import TYPE_CHECKING -from weakref import proxy - from ..event_data import EventData from ..event_data import TriggerData from ..exceptions import TransitionNotAllowed from ..transition import Transition - -if TYPE_CHECKING: - from ..statemachine import StateMachine +from .base import BaseEngine -class SyncEngine: - def __init__(self, sm: "StateMachine", rtc: bool = True): - self.sm = proxy(sm) - self._sentinel = object() - self._rtc = rtc - self._processing = Lock() +class SyncEngine(BaseEngine): + def __init__(self, sm, rtc: bool = True): + super().__init__(sm, rtc) self.activate_initial_state() def activate_initial_state(self): @@ -52,7 +43,7 @@ def processing_loop(self): """ if not self._rtc: # The machine is in "synchronous" mode - trigger_data = self.sm._external_queue.popleft() + trigger_data = self._external_queue.popleft() return self._trigger(trigger_data) # We make sure that only the first event enters the processing critical section, @@ -66,8 +57,8 @@ def processing_loop(self): first_result = self._sentinel try: # Execute the triggers in the queue in FIFO order until the queue is empty - while self.sm._external_queue: - trigger_data = self.sm._external_queue.popleft() + while self._external_queue: + trigger_data = self._external_queue.popleft() try: result = self._trigger(trigger_data) if first_result is self._sentinel: @@ -75,7 +66,7 @@ def processing_loop(self): except Exception: # Whe clear the queue as we don't have an expected behavior # and cannot keep processing - self.sm._external_queue.clear() + self._external_queue.clear() raise finally: self._processing.release() diff --git a/statemachine/factory.py b/statemachine/factory.py index 6a7ac026..b93b9db6 100644 --- a/statemachine/factory.py +++ b/statemachine/factory.py @@ -10,6 +10,7 @@ from .event import Event from .event import trigger_event_factory from .exceptions import InvalidDefinition +from .graph import iterate_states from .graph import iterate_states_and_transitions from .graph import visit_connected_states from .i18n import _ @@ -44,6 +45,7 @@ def __init__( cls.add_inherited(bases) cls.add_from_attributes(attrs) + cls._unpack_builders_callbacks() if not cls.states: return @@ -196,6 +198,15 @@ def _setup(cls): "send", } | {s.id for s in cls.states} + def _unpack_builders_callbacks(cls): + callbacks = {} + for state in iterate_states(cls.states): + if state._callbacks: + callbacks.update(state._callbacks) + del state._callbacks + for key, value in callbacks.items(): + setattr(cls, key, value) + def add_inherited(cls, bases): for base in bases: for state in getattr(base, "states", []): diff --git a/statemachine/graph.py b/statemachine/graph.py index ef3c013a..3d6598c6 100644 --- a/statemachine/graph.py +++ b/statemachine/graph.py @@ -18,3 +18,12 @@ def iterate_states_and_transitions(states): for state in states: yield state yield from state.transitions + if state.states: + yield from iterate_states_and_transitions(state.states) + + +def iterate_states(states): + for state in states: + yield state + if state.states: + yield from iterate_states(state.states) diff --git a/statemachine/state.py b/statemachine/state.py index 0a52b0a4..2ee29e61 100644 --- a/statemachine/state.py +++ b/statemachine/state.py @@ -23,14 +23,17 @@ def __new__( # type: ignore [misc] return super().__new__(cls, classname, bases, attrs) # type: ignore [return-value] states = [] + callbacks = {} for key, value in attrs.items(): if isinstance(value, State): value._set_id(key) states.append(value) - if isinstance(value, TransitionList): + elif isinstance(value, TransitionList): value.add_event(key) + elif callable(value): + callbacks[key] = value - return State(name=name, states=states, **kwargs) + return State(name=name, states=states, _callbacks=callbacks, **kwargs) class State: @@ -51,6 +54,7 @@ class State: value. initial: Set ``True`` if the ``State`` is the initial one. There must be one and only one initial state in a statemachine. Defaults to ``False``. + If not specified, the default initial state is the first child state in document order. final: Set ``True`` if represents a final state. A machine can have optionally many final states. Final states have no :ref:`transition` starting from It. Defaults to ``False``. @@ -144,6 +148,7 @@ def __init__( states: Any = None, enter: Any = None, exit: Any = None, + _callbacks: Any = None, ): self.name = name self.value = value @@ -153,6 +158,7 @@ def __init__( self._initial = initial self._final = final self._id: str = "" + self._callbacks = _callbacks self.parent: "State" = None self.transitions = TransitionList() self._specs = CallbackSpecList() diff --git a/statemachine/statemachine.py b/statemachine/statemachine.py index a2e750aa..7a5c376c 100644 --- a/statemachine/statemachine.py +++ b/statemachine/statemachine.py @@ -1,5 +1,4 @@ import warnings -from collections import deque from copy import deepcopy from functools import partial from inspect import isawaitable @@ -17,6 +16,7 @@ from .dispatcher import Listener from .dispatcher import Listeners from .engines.async_ import AsyncEngine +from .engines.statechart import StateChartEngine from .engines.sync import SyncEngine from .event import Event from .event_data import TriggerData @@ -83,7 +83,6 @@ def __init__( self.state_field = state_field self.start_value = start_value self.allow_event_without_transition = allow_event_without_transition - self._external_queue: deque = deque() self._callbacks_registry = CallbacksRegistry() self._states_for_instance: Dict[State, State] = {} @@ -94,22 +93,13 @@ def __init__( raise InvalidDefinition(_("There are no states or transitions.")) self._register_callbacks(listeners or []) - - # Activate the initial state, this only works if the outer scope is sync code. - # for async code, the user should manually call `await sm.activate_initial_state()` - # after state machine creation. - if self.current_state_value is None: - trigger_data = TriggerData( - machine=self, - event="__initial__", - ) - self._put_nonblocking(trigger_data) - self._engine = self._get_engine(rtc) def _get_engine(self, rtc: bool): if self._callbacks_registry.has_async_callbacks: return AsyncEngine(self, rtc=rtc) + elif any(bool(s.states) for s in self.states): + return StateChartEngine(self, rtc=rtc) else: return SyncEngine(self, rtc=rtc) @@ -305,7 +295,7 @@ def allowed_events(self): def _put_nonblocking(self, trigger_data: TriggerData): """Put the trigger on the queue without blocking the caller.""" - self._external_queue.append(trigger_data) + self._engine._put_nonblocking(trigger_data) def send(self, event: str, *args, **kwargs): """Send an :ref:`Event` to the state machine.