dsm
Damn simple finite state machine
About
DSM is a observable simple finite state machine implementation for Python. Transitions may be programmed declaratively or imperatively. Inputs and state changes are emitting observable events.
Requirements
- Python 2.7, 3.5, 3.6
observablesixfor compatibility between Python 2 and Python 3
Installation
pip install dsm
Usage
Django integration
It is possible to integrate dsm with Django models by
declaring a StateMachineField.
from django.db import models
from dsm.fields import StateMachineField
class Order(models.Model):
status = StateMachineField(
transitions=(
('new', ['confirmed'], 'processing'),
('processing', ['cancel'], 'cancelled'),
('processing', ['send'], 'sending'),
('sending', ['deliver'], 'finished'),
),
max_length=16,
choices=(
('new', _('New')),
('processing', _('Processing')),
('sending', _('Sending')),
('finished', _('Finished')),
('canceled', _('Cancelled')),
),
db_index=True,
default='new'
)
Now you can create an Order and check it's status:
>>> order = Order.objects.create()
>>> order.status
new
>>> type(order.status)
dsm.fields.MachineState
The string representation of status field is same as state name
provided in transitions declaration, but internally there is always
dsm.fields.MachineState instance.
Declarative
FSM declaration:
import string
import dsm
class SumatorMachine(dsm.StateMachine):
class Meta:
initial = 'init'
transitions = (
('init', list(string.digits), 'digit_enter'),
('digit_enter', list(string.digits), 'digit_enter'),
('digit_enter', '=', 'summarize'),
)
Usage:
Initialization:
fsm = SumatorMachine()
Processing one value:
fsm.process(value)
Processing multiple values:
fsm.process_many(iterable)
Gathering the current state:
>>> fsm.state
'summarize'
Resetting to the intial state:
fsm.reset()
Listening on events:
fsm.when('state', func)
Events example:
>>> the_sum = 0
>>> def add_digit(x): global the_sum; the_sum += int(x)
>>> def reset(x): global the_sum; the_sum = 0
>>> fsm = SumatorMachine()
>>> fsm.when('digit_enter', add_digit)
>>> fsm.when('init', reset)
>>> fsm.process_many('666=')
'summarize'
>>> the_sum
18
Events example (class based):
>>> class Sumator(object):
... def __init__(self):
... self.total = 0
... self.fsm = SumatorMachine()
... self.fsm.when('digit_enter', self.add)
... self.fsm.when('init', self.reset)
...
... def add(self, x):
... self.total += int(x)
...
... def reset(self, x):
... self.total = 0
...
... def summarize(self, values):
... self.fsm.reset()
... self.fsm.process_many(values+'=')
... return self.total
>>> s = Sumator()
>>> s.summarize('666')
18
Imperative
import string
import dsm
fsm = dsm.StateMachine(
initial='init',
transitions=dsm.Transitions((
('init', list(string.digits), 'digit_enter'),
('digit_enter', list(string.digits), 'digit_enter'),
('digit_enter', '=', 'summarize'),
))
)
License
BSD
Metadata
Release files for dsm 0.5.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dsm-0.5.3.tar.gz | 5.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dsm-0.5.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 13.8 kB
Release files / dsm-0.5.3.tar.gz
| Download URL | dsm-0.5.3.tar.gz |
|---|---|
| Size | 5.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
817292dd9ce55f552ccffa6e9dfb63892978e4118bafd9b748c182ab13e45342
|
|
BLAKE2b-256 checksum How to use checksums |
8bbf258211755bf809441635bacd7068a603fb9edfe581cefab36e1e87f1dd28
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.41.0 CPython/3.8.1
|
Release files / dsm-0.5.3-py3-none-any.whl
| Download URL | dsm-0.5.3-py3-none-any.whl |
|---|---|
| Size | 8.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
72a7d82b8b9f9aec8e97e3da7d86749e4a56df7e5626164ce26752420e4939a4
|
|
BLAKE2b-256 checksum How to use checksums |
855957e1609b3b697183d5659c7f46564d0fae65d3d11d723c8dedb516f5bd68
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.41.0 CPython/3.8.1
|