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.
  • 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.3.1.tar.gz (18.1 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.3.1-py3-none-any.whl (23.0 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for statomata-0.3.1.tar.gz
Algorithm Hash digest
SHA256 414c82c237cc373690b38ed32869890a6bd9493545b94127389e9e9e7305fd18
MD5 c6ba442012a202a6ef8554a1beb4466d
BLAKE2b-256 f4f960b06811ef02ab6f6dca307d9b285118ba91ef7ab01d68ffa1ba8b1381d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for statomata-0.3.1.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.3.1-py3-none-any.whl.

File metadata

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

File hashes

Hashes for statomata-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7c51f7cebd360fd9952838529da25c39e44f8ee2dadab9dc777445d4fea765db
MD5 5cc499c49086b8ff6f0face1a0324b3f
BLAKE2b-256 fc2b62e6f546e6ee6ef7c5b68cd7b4caf6d5f3cbc2da0abcd199cdb8e34e36c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for statomata-0.3.1-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