From 20c352e9c9e667d1436b3952ee5b4c6d23303d26 Mon Sep 17 00:00:00 2001 From: gabewillen Date: Fri, 15 Dec 2023 20:17:03 -0600 Subject: [PATCH] Clean up state machine examples and update package version Removed redundant or unnecessary state machine examples from the project. Additionally, renamed some classes in other examples for better readability. Also, the package version number has been updated in the pyproject.toml file. Minor modifications were made to the functional state machine code and the collection creation function for better conformance to naming conventions. --- examples/behavior_inheritance_example.py | 11 -------- examples/complete_statemachine.py | 10 +++---- examples/dynamic_machine.py | 19 ------------- examples/initial_state_example.py | 35 ++---------------------- examples/pickle_example.py | 6 ---- pyproject.toml | 2 +- stateforward/model/collection.py | 2 +- stateforward/model/element.py | 6 ++-- stateforward/state_machine/functional.py | 8 ++++-- 9 files changed, 16 insertions(+), 83 deletions(-) delete mode 100644 examples/behavior_inheritance_example.py delete mode 100644 examples/dynamic_machine.py delete mode 100644 examples/pickle_example.py diff --git a/examples/behavior_inheritance_example.py b/examples/behavior_inheritance_example.py deleted file mode 100644 index c177437..0000000 --- a/examples/behavior_inheritance_example.py +++ /dev/null @@ -1,11 +0,0 @@ -import stateforward as sf - - -class Print(sf.Behavior): - def activity(self, event: sf.Event): - print(f"{self.qualified_name} -> {event.qualified_name}") - - -class AsyncPrint(sf.Behavior): - async def activity(self, event: sf.Event): - print(f"{self.qualified_name} -> {event.qualified_name}") diff --git a/examples/complete_statemachine.py b/examples/complete_statemachine.py index b4b314c..c42a397 100644 --- a/examples/complete_statemachine.py +++ b/examples/complete_statemachine.py @@ -13,7 +13,7 @@ class e2(sf.Event): e3 = sf.event("e3") -class Sample(sf.AsyncStateMachine): +class SampleMachine(sf.AsyncStateMachine): class s2(sf.State): class r1(sf.Region): class s1(sf.State): @@ -71,7 +71,7 @@ class CompleteSM(sf.AsyncStateMachine): # sf.when(lambda self: self.model.a1), source=r2.s1, target=r2.s2 # ) - s2 = sf.submachine_state(Sample, name="s2") + s2 = sf.submachine_state(SampleMachine) initial = sf.initial(s0) # s0_fork = sf.fork(sf.transition(target=s1.r1.s1), sf.transition(target=s1.r2.s2)) @@ -89,12 +89,10 @@ class CompleteSM(sf.AsyncStateMachine): import asyncio async def main(): - # sf.dump(CompleteSM) sm = CompleteSM() # # - await sm.__interpreter__.start() - # print(sm.state) + await sm.interpreter.start() await sf.send(e3(), sm) - print(sm.state) + # print(sm.state) asyncio.run(main()) diff --git a/examples/dynamic_machine.py b/examples/dynamic_machine.py deleted file mode 100644 index a901589..0000000 --- a/examples/dynamic_machine.py +++ /dev/null @@ -1,19 +0,0 @@ -import stateforward as sf - - -def create_sm(regions: int): - class SM(sf.AsyncStateMachine): - for x in range(regions): - exec( - f"""class r{x}(sf.Region): - class s1(sf.State): - pass - initial = sf.initial(s1) - """ - ) - - print("here", SM.r0.initial) - return SM - - -sf.dump(create_sm(1)) diff --git a/examples/initial_state_example.py b/examples/initial_state_example.py index b692509..1f7fab8 100644 --- a/examples/initial_state_example.py +++ b/examples/initial_state_example.py @@ -1,36 +1,5 @@ import stateforward as sf -import asyncio -def make_region(initial_state: str = "S1"): - class R(sf.Region): - class S1(sf.State): - pass - - class S2(sf.State): - pass - - class S3(sf.State): - pass - - initial = sf.initial( - S1 if initial_state == "S1" else S2 if initial_state == "S2" else S3 - ) - - return R - - -class SM(sf.AsyncStateMachine): - R1 = make_region() - R2 = make_region("S2") - R3 = make_region("S3") - - -async def main(): - sf.dump(SM) - sm = SM() - await sm.__interpreter__.start() - assert sm.state == (sm.R1.S1, sm.R2.S2, sm.R3.S3) - - -asyncio.run(main()) +class A(sf.Event): + pass diff --git a/examples/pickle_example.py b/examples/pickle_example.py deleted file mode 100644 index 5181c70..0000000 --- a/examples/pickle_example.py +++ /dev/null @@ -1,6 +0,0 @@ -from examples.light_switch import LightSwitch -from examples.element_example import Family -import pickle - -tree = LightSwitch() -pickle.dumps(tree) diff --git a/pyproject.toml b/pyproject.toml index 7f17053..73dceff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "stateforward" -version = "0.2.3" +version = "0.2.4" description = "" authors = ["leonwilly101 "] readme = "README.md" diff --git a/stateforward/model/collection.py b/stateforward/model/collection.py index 7cda5bb..b13ddb3 100644 --- a/stateforward/model/collection.py +++ b/stateforward/model/collection.py @@ -15,7 +15,7 @@ def is_collection(value: typing.Any) -> bool: def collection(*elements: ElementType) -> type["Collection"]: new_collection = type( - "Collection", + "collection", (Collection,), { "length": len(elements), diff --git a/stateforward/model/element.py b/stateforward/model/element.py index f77a8bc..112155b 100644 --- a/stateforward/model/element.py +++ b/stateforward/model/element.py @@ -428,12 +428,12 @@ def specialize(base: ElementType, derived: ElementType, **kwargs): ) for index, element in enumerate(base_elements): + new_element = new_elements[index] for name, element_id in element.__associations__.items(): - new_element = new_elements[index] - associated_element = new_element.__associations__[name] = element_map[ + associated_id = new_element.__associations__[name] = element_map[ element_id ] - setattr(new_element, name, associated_element) + setattr(new_element, name, new_element.__all_elements__[associated_id]) return None diff --git a/stateforward/state_machine/functional.py b/stateforward/state_machine/functional.py index 62c68bb..5122d2d 100644 --- a/stateforward/state_machine/functional.py +++ b/stateforward/state_machine/functional.py @@ -1,6 +1,7 @@ from stateforward import model from stateforward.elements import elements import typing +import asyncio def submachine_state( @@ -27,9 +28,10 @@ def send( ) -> typing.Union[typing.Awaitable, list[typing.Awaitable]]: if element is None: return [ - model.of(element).interpreter.send(event) - for element in model.all_instances().values() - ] + model.of(element).interpreter.send(event) + for element in model.all_instances().values() + ] + if isinstance(element, str): element = model.all_instances()[element] return model.of(element).interpreter.send(event)