PyStateMachine is a Framework that support state machines in Python
- Python3
How do we import the framework?
-
Insure that Python3 is installed:
-
Install the PyStateMachines framework
- pip3 install PyStateMachines
After framework is installed, import and create a small example. Create xml file from sample with the State machine states.
myStateMachine.xml
<?xml version="1.0"?>
<x:States xmlns:x="pystatemachine:sm">
<State>
<Name>State1</Name>
<Event>
<Name>ToState2</Name>
<ToState>State2</ToState>
</Event>
</State>
<State>
<Name>State2</Name>
<Event>
<Name>ToState3</Name>
<ToState>State3</ToState>
</Event>
</State>
<State>
<Name>State3</Name>
<Event>
<Name>ToState1</Name>
<ToState>State1</ToState>
</Event>
</State>
<Initial_State>State1</Initial_State>
</x:States>
Create Python Script to run state machine pyStateMachine.py
# importing necessary packages
from StateMachine import StateMachine
"""Test StateMachine"""
sm = StateMachine("myStateMachine.xml")
sm.LoadStateMachine()
# print initial state
print(sm.get_current_state()) # current_state == State1
sm.InjectEvent("ToState2")
print(sm.get_current_state()) # current_state == State2
sm.InjectEvent("ToState3")
print(sm.get_current_state()) # current_state == State3
sm.InjectEvent("ToState1")
print(sm.get_current_state()) # current_state == State1
run Python script to execute state machine
python pyStateMachine.py
pyStateMachineUnitTest.py
## Test Suite
# importing necessary packages
from StateMachine import StateMachine
import unittest
class TestBaseStateMachine(unittest.TestCase):
"""Test state machine using various samples"""
# test all valid state transitions
def test1(self):
"""Test Statemachine"""
sm = StateMachine("myStateMachine.xml")
sm.LoadStateMachine()
self.assertEqual(sm.get_current_state(), "State1", "Should be State1")
# OK Event
sm.InjectEvent("ToState2")
self.assertEqual(sm.get_current_state(), "State2", "Should be State2")
# OK Event
sm.InjectEvent("ToState3")
self.assertEqual(sm.get_current_state(), "State3", "Should be State3")
# OK Event
sm.InjectEvent("ToState1")
self.assertEqual(sm.get_current_state(), "State1", "Should be State1")
# test invalid State1 transitions
def test2(self):
"""Test Statemachine"""
sm = StateMachine("myStateMachine.xml")
sm.LoadStateMachine()
self.assertEqual(sm.get_current_state(), "State1", "Should be State1")
# Invalid transition
sm.InjectEvent("ToState3")
self.assertEqual(sm.get_current_state(), "State1", "Should be State1")
# test invalid State2 transitions
def test3(self):
"""Test Statemachine"""
sm = StateMachine("myStateMachine.xml")
sm.LoadStateMachine()
self.assertEqual(sm.get_current_state(), "State1", "Should be State1")
# OK Event
sm.InjectEvent("ToState2")
self.assertEqual(sm.get_current_state(), "State2", "Should be State2")
# Invalid transition
sm.InjectEvent("ToState1")
self.assertEqual(sm.get_current_state(), "State2", "Should be State2")
# test invalid State3 transitions
def test4(self):
"""Test Statemachine"""
sm = StateMachine("myStateMachine.xml")
sm.LoadStateMachine()
self.assertEqual(sm.get_current_state(), "State1", "Should be State1")
# OK Event
sm.InjectEvent("ToState2")
self.assertEqual(sm.get_current_state(), "State2", "Should be State2")
# OK Event
sm.InjectEvent("ToState3")
self.assertEqual(sm.get_current_state(), "State3", "Should be State3")
# Invalid transition
sm.InjectEvent("ToState2")
self.assertEqual(sm.get_current_state(), "State3", "Should be State3")
if __name__ == '__main__':
unittest.main()
run unit tests
python pyStateMachineUnitTest.py
Read the CONTRIBUTING GUIDE
We are pleased to inform you that this repository is participating in the #Hacktoberfest!
Happy Coding!
E-Mail : [email protected]
To support me just add Star the project or follow me