Durable execution for arvel — Temporal-native, framework-ergonomic.
Project description
arvel-workflow
Durable execution for the arvel framework — backed by Temporal, with arvel's ergonomics instead of Temporal's setup tax.
Some work outlives a single request: an order that moves through authorize → fulfil → ship over hours, a multi-step job that has to survive a restart halfway through. arvel's queue is fire-and-forget; this is for work that must remember where it got to. You write plain workflows and activities, run one command, and drive them through a facade — no Temporal boilerplate.
uv add 'arvel-workflow[temporal]'
Installing auto-registers the provider through arvel's entry-point mechanism — no wiring.
The idea in one screen
An activity does the I/O (and can use any arvel facade); a workflow orchestrates activities and stays pure. Both autoload from their folders.
# app/activities/greet.py
from arvel_workflow import activity
from arvel import Cache
@activity
async def greet(name: str) -> str:
count = await Cache.increment("greet:count") # activities do I/O — arvel DI works here
return f"hello {name} (#{count})"
# app/workflows/greet.py
from arvel_workflow import workflow, run_activity
from app.activities.greet import greet # a plain import — no ceremony
@workflow
class Greet:
async def run(self, name: str) -> str:
return await run_activity(greet, name)
Run the worker (--dev boots a throwaway local Temporal server — nothing to install first):
arvel workflow:work --dev
Start work and read the result from anywhere you have the app:
handle = await app.make("workflow").start(Greet, "world")
print(await app.make("workflow").result(handle)) # hello world (#1)
No with workflow.unsafe.imports_passed_through() anywhere — the framework configures Temporal's
sandbox so plain imports work.
Documentation
| Guide | What's in it |
|---|---|
| Getting Started | install → define → run → drive → test, end to end |
| Concepts & Best Practices | the workflow/activity split, the determinism rule, the sandbox, and the habits that keep you correct |
| Configuration | every config("workflow") key and default |
| Testing | run the real engine, fake the world — the test pattern |
Scope & roadmap
This release ships the durable-execution core: define workflows and activities, run a worker, start work, and read its result. Documented capabilities are the ones that actually run today.
Coming next (not shipped yet — so the docs never promise what the code can't do):
- signals / queries / updates — send events into a running workflow, read its live state, drive human-in-the-loop approvals
- child workflows & fan-out, sagas / compensation, durable timers, scheduled workflows
- per-activity retry & timeout sugar and a time-skipping test harness
Requirements
- Python 3.14+
- arvel (installed with the package)
- The engine extra:
arvel-workflow[temporal].--devdownloads a local Temporal dev-server binary on first run.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file arvel_workflow-0.2.0.tar.gz.
File metadata
- Download URL: arvel_workflow-0.2.0.tar.gz
- Upload date:
- Size: 123.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1cc86e348164a2f0c0a629f609efa4d0fdd0bbb946bba5bcd0eb16dc91d6a3d6
|
|
| MD5 |
4185b865442557cbe868caaf4a933d47
|
|
| BLAKE2b-256 |
d437d6368c874f809e7e0b76c79859d58064db0ffa11c8a6606eab21687ee4b3
|
Provenance
The following attestation bundles were made for arvel_workflow-0.2.0.tar.gz:
Publisher:
publish.yml on mohamed-rekiba/arvel-workflow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arvel_workflow-0.2.0.tar.gz -
Subject digest:
1cc86e348164a2f0c0a629f609efa4d0fdd0bbb946bba5bcd0eb16dc91d6a3d6 - Sigstore transparency entry: 2192250913
- Sigstore integration time:
-
Permalink:
mohamed-rekiba/arvel-workflow@99385a7a26a71a8c5aba2dd9416bd8889934b6ef -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/mohamed-rekiba
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@99385a7a26a71a8c5aba2dd9416bd8889934b6ef -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file arvel_workflow-0.2.0-py3-none-any.whl.
File metadata
- Download URL: arvel_workflow-0.2.0-py3-none-any.whl
- Upload date:
- Size: 11.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48829bff888e28bae814ce6b615cbce744a8a6fc9bf4e911517f17d9255a58c1
|
|
| MD5 |
38bfcddd2c69b159b5dca28d8fbebbc4
|
|
| BLAKE2b-256 |
98e6fd30529ac899ace12d73a8d8ea6297a85bb7b6d04d109d1d505dfdc169b1
|
Provenance
The following attestation bundles were made for arvel_workflow-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on mohamed-rekiba/arvel-workflow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arvel_workflow-0.2.0-py3-none-any.whl -
Subject digest:
48829bff888e28bae814ce6b615cbce744a8a6fc9bf4e911517f17d9255a58c1 - Sigstore transparency entry: 2192251025
- Sigstore integration time:
-
Permalink:
mohamed-rekiba/arvel-workflow@99385a7a26a71a8c5aba2dd9416bd8889934b6ef -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/mohamed-rekiba
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@99385a7a26a71a8c5aba2dd9416bd8889934b6ef -
Trigger Event:
workflow_dispatch
-
Statement type: