Skip to content
This repository has been archived by the owner on Nov 10, 2017. It is now read-only.

kyleconroy/statemachine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

statemachine

Build Status

If you aren't programming with state machines, you should be.

statemachine offers a simple and easy-to-use finite-state machine that can adapted into almost any code base.

Usage

To create a state machine, mix in the statemachine.Machine class. The only requirement is an initial state, which are represented as strings.

import statemachine

class TrafficLight(statemachine.Machine):
    initial_state = 'red'

This machine won't do much, but we can get the current state

>>> stoplight = TrafficLight()
>>> stoplight.state
'red'

We can add state transitions using the event decorator. These functions return an iterable of transitions. A transition is just a two-tuple. The first element is an iterable of states, the wilcard '*', or a single state. The second element is the target state.

import statemachine

class TrafficLight(statemachine.Machine):
    initial_state = 'red'

    @statemachine.event
    def cycle(self):
        yield 'red', 'green'
        yield 'green', 'yellow'
        yield 'yellow', 'red'

Calling the cycle method will transition the machine into the next state.

>>> stoplight = TrafficLight()
>>> stoplight.state
'red'
>>> stoplight.cycle()
>>> stoplight.state
'green'

You can listen for transition events using the before_transition and after_transition decorators`.

import statemachine

class TrafficLight(statemachine.Machine):
    initial_state = 'red'

    @statemachine.event
    def cycle(self):
        yield 'red', 'green'
        yield 'green', 'yellow'
        yield 'yellow', 'red'

    @statemachine.after_transition('red', 'green')
    def announce(self):
        print "GO GO GO"

Initiate the transition by calling cycle

>>> stoplight = TrafficLight()
>>> stoplight.cycle()
'GO GO GO'

If you only care about where you're coming from (or where you're going), use the transition_from and transition_to decorator

import statemachine

class TrafficLight(statemachine.Machine):
    initial_state = 'red'

    @statemachine.event
    def cycle(self):
        yield 'red', 'green'
        yield 'green', 'yellow'
        yield 'yellow', 'red'

    @transition_to('yellow')
    def safety(self):
        print "SLOW DOWN"

    @transition_from('red')
    def announce(self):
        print "GO GO GO"

Installation

$ pip install statemachine

About

Simple finite-state machines in Python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages