Skip to main content

a strictly typed, flexible library for building and running state machines in Python

Project description

Statomata

Latest Version Python Supported versions MyPy Strict Test Coverage Downloads GitHub stars

Statomata is a strictly typed, flexible library for building and running finite state machines (FSMs) and automata in Python. It provides core automata implementations out of the box and lets you define custom states and state management logic.

Features

  • 🧠 State Interface & Context: Follow the state machine OOP pattern with clear, isolated state definitions.
  • ⏸️ Defer & Recall: States can defer incoming messages and recall them later, enabling complex multi-step workflows.
  • Built-in Automata: feel free to use one of the predefined automata classes from SDK (sync / async; unary / iterable)
  • 🏗 Custom Automata Support: Build your own automata with custom state management logic. You can choose declarative style or built custom automata using provided interfaces.
  • Strict Typing: Designed for type safety and clarity with full type hints.

Installation

pip install statomata

Quick Start

Use high-level declarative style:

from statomata.declarative import DeclarativeStateMachine, State


class OpenCloseExample(DeclarativeStateMachine):
    closed = State(initial=True)
    opened = State()

    @closed.to(opened)
    def open(self) -> str:
        return "Opened"

    @opened.to(closed)
    def close(self) -> str:
        return "Closed"

Run the state machine:

from contextlib import suppress
from statomata.exception import InvalidStateError

sm = OpenCloseExample()

print(sm.open())  # Output: Opened
print(sm.close())  # Output: Closed

with suppress(InvalidStateError):
    sm.close()

Or you can use low-level style:

from statomata.abc import State, Context
from statomata.exception import InvalidStateError


class OpenState(State[str, str]):
    def handle(self, income: str, context: Context[State[str, str]]) -> str:
        if income != "close":
            raise InvalidStateError(self, message="already opened")

        context.set_state(ClosedState())
        return "Closed"


class ClosedState(State[str, str]):
    def handle(self, income: str, context: Context[State[str, str]]) -> str:
        if income != "open":
            raise InvalidStateError(self, message="already closed")

        context.set_state(OpenState())
        return "Opened"

Run the state machine:

from contextlib import suppress

from statomata.exception import InvalidStateError
from statomata.sdk import create_unary_sm

sm = create_unary_sm(ClosedState())

print(sm.run("open"))  # Output: Opened
print(sm.run("close"))  # Output: Closed

with suppress(InvalidStateError):
    sm.run("close")

Examples

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

statomata-0.4.3.tar.gz (19.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

statomata-0.4.3-py3-none-any.whl (23.9 kB view details)

Uploaded Python 3

File details

Details for the file statomata-0.4.3.tar.gz.

File metadata

  • Download URL: statomata-0.4.3.tar.gz
  • Upload date:
  • Size: 19.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for statomata-0.4.3.tar.gz
Algorithm Hash digest
SHA256 c2fd70d78a786809fdb91fb12d7393d57155f3aad251287d83eb2802c21802c4
MD5 2b9f53562a319efcac0f2e2ef2d09018
BLAKE2b-256 64fa187b185fcb8f2526f64c0066aa7803934111b7aeb915767eb219b4f88fe4

See more details on using hashes here.

Provenance

The following attestation bundles were made for statomata-0.4.3.tar.gz:

Publisher: publish.yaml on zerlok/statomata

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file statomata-0.4.3-py3-none-any.whl.

File metadata

  • Download URL: statomata-0.4.3-py3-none-any.whl
  • Upload date:
  • Size: 23.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for statomata-0.4.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ef3cf2ded77cc739660fd971fadfc3ae696e89d388fad0b0c78e5e7de25ac28f
MD5 6286076c633cab89778cb3ee50b85df6
BLAKE2b-256 a15d4907bdfd40fa40029d053ee9a94c00bd1b12661df78cf7b029426c1e85ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for statomata-0.4.3-py3-none-any.whl:

Publisher: publish.yaml on zerlok/statomata

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page