A simple automation framework
Project description
Kuristo
Kuristo is a flexible, plugin-enabled automation framework designed for scientific and HPC workflows. It supports sequential and parallel job execution, workflow definition via YAML, resource-aware scheduling, custom step and action definitions, and rich output with optional headless mode.
Features
- YAML-based workflows (GitHub Actions style)
- Custom steps and actions via Python plugins
- Job dependency graph with parallel execution
- Resource-aware scheduling with core-aware limits
- Step & job timeouts
- ANSI-rich output or plain mode for CI
- Environment variable passing and output capture
- Output validation (regex, float comparisons, CSV diffing)
- Composite steps for reusable action pipelines
- Built-in log directory and run tracking
- Test coverage with
pytest - MPI support via configurable launcher (
mpirun,mpiexec, etc.)
Install
Install from PyPI:
pip install kuristo
Or clone the repo and install locally:
git clone https://github.com/andrsd/kuristo.git
cd kuristo
pip install -e .
Usage
Run all tests in a directory:
kuristo run tests/assets/
Run a specific test set:
kuristo run tests/assets/tests1
Check your environment:
kuristo doctor
Headless/CI-safe mode
kuristo run tests --no-ansi
Workflow YAML Example
jobs:
test-matrix:
strategy:
matrix:
include:
- os: ubuntu
version: 20.04
- os: ubuntu
version: 22.04
steps:
- name: Run simulation
id: simulation
run: ./simulate --config=${{ matrix.version }}
- name: Check output
uses: checks/regex
with:
input: ${{ steps.simulation.output }}
pattern: "SUCCESS"
Writing Custom Actions
Create a plugin in .kuristo/actions.py:
import kuristo
@kuristo.action("my/special-step")
class MyAction(kuristo.ProcessAction):
def __init__(self, name, context: kuristo.Context, **kwargs):
super().__init__(name, context, **kwargs)
self.input = kwargs["input"]
def create_command(self):
return f"echo Hello {self.input}"
Then, use in the workflow as:
jobs:
test:
steps:
- name: My special test
uses: my/special-step
with:
input: "world"
Kuristo will auto-discover .py files in .kuristo/.
Logging & Output
All logs and run data are saved in:
.kuristo-out/
├── runs/
│ ├── latest → 20250620_101500/
│ └── 20250620_101500/
Set logging retention and cleanup in config.yaml:
log:
dir-name: .kuristo-out
history: 5
cleanup: on_success
Configuration
You can define a global config at .kuristo/config.yaml:
resources:
num-cores: 8
runner:
mpi-launcher: mpiexec
Or override via environment variable:
KURISTO_MPI_LAUNCHER=mpiexec2 kuristo run tests/
Testing & Coverage
Run tests:
pytest -v
With coverage:
pytest --cov=kuristo --cov-report=term-missing
Philosophy
Kuristo is inspired by the structure of GitHub Actions but tailored for local and HPC workflows. It aims to be lightweight, extensible, and scriptable — with strong support for reproducibility and numerical simulation validation.
License
MIT
Fun Fact
"Kuristo" means "runner" in Esperanto. Because that’s what it does — it runs your stuff.
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 kuristo-0.9.0.tar.gz.
File metadata
- Download URL: kuristo-0.9.0.tar.gz
- Upload date:
- Size: 1.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
782d46441877c840b582ef89a9ea206e03e0fbc539a51fd3a3a1b2c384672ef5
|
|
| MD5 |
211f78667833a65f3084b10849918e5f
|
|
| BLAKE2b-256 |
12302995172b9a4e0de800d92c68fccb318b00c530745ed55e56ca4555522eb8
|
File details
Details for the file kuristo-0.9.0-py3-none-any.whl.
File metadata
- Download URL: kuristo-0.9.0-py3-none-any.whl
- Upload date:
- Size: 45.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2484c72a53b51451861f510730b90200bc70f274c7a438db8d66d036aebbffd6
|
|
| MD5 |
04b28af097172eeb1d93fcb642b67ed6
|
|
| BLAKE2b-256 |
a4fa99aa0305145d05c818ad1074a24a5106e260f64aca94006fbbc1f126f25a
|