Skip to content

NarrativeScience-old/sagah

Repository files navigation

sagah

License

Orchestrated, async sagas in Python

Table of Contents:

Installation

sagah requires Python 3.6 or above.

pip install sagah

Guide

Example usage:

from sagah import Saga

state = {"counter": 0}

def incr():
    state["counter"] += 1

def decr():
    state["counter"] -= 1

with Saga() as saga:
    await saga.action(incr, decr)
    await saga.action(incr, decr)

assert state["counter"] == 2

If some action fails, the compensating functions from previous transactions will be called to restore the state:

from sagah import Saga

state = {"counter": 0}

def incr():
    state["counter"] += 1

def decr():
    state["counter"] -= 1

def fail():
    raise ValueError("oops")

try:
    with Saga() as saga:
        await saga.action(incr, decr)
        await saga.action(incr, decr)
        await saga.action(fail, noop)
except Exception:
    assert state["counter"] == 0

Development

To develop sagah, install dependencies and enable the pre-commit hook:

pip install pre-commit poetry
poetry install
pre-commit install

To run tests:

poetry run pytest