Skip to main content

dsm

Damn simple finite state machine

Build Status

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
  • observable
  • six for 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)

Source distribution for dsm 0.5.3
File Size Uploaded
dsm-0.5.3.tar.gz 5.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dsm 0.5.3
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.5.3 This release

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5

2 release files

0.4

3 release files

0.3

3 release files

0.2

1 release file

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page