Skip to main content

Python runtime and authoring SDK for Gust DAGs, including parser and task invoker

Project description

gust_py

Python runtime/package for Gust DAG authoring, parsing, and task execution.

What This Project Provides

  • A Python authoring API:
    • Dag
    • @task(...)
    • log(...)
    • runtime calls: get_task_by_name_run(...), get_secret_by_name(...)
  • A parser that converts Python DAG files into a stable JSON spec.
  • A task invoker to execute one task from a DAG file.
  • A run-completion invoker to execute a DAG callback (run done).

Requirements

  • Python >=3.10
  • uv

Install

uv sync --dev

DAG Authoring API

from gust import Dag, task, get_task_by_name_run, get_secret_by_name, log


class MyDag(Dag):
    def __init__(self):
        super().__init__(schedule="daily", on_finished_callback="done_my_run")

    @task(deps=("prepare",), save=True)
    def hello(self, ctx):
        run_id = ctx["run_id"]
        prepare_run = get_task_by_name_run("prepare", run_id)
        secret = get_secret_by_name("SUPER_SECRET")
        log(f"prepare={prepare_run}, secret_loaded={bool(secret)}")
        return {"ok": True}

    def done_my_run(self, status, run):
        log(f"run {run['run_id']} finished with status={status}", level="info")

Runtime Messaging Protocol

gust runtime messages use a framed protocol on stdio:

  1. 4-byte big-endian frame length
  2. UTF-8 JSON payload

Helpers:

  • send_frame(payload) writes one frame to stdout.
  • _read_frame() reads one frame from stdin.

Call helpers emit messages and wait for a response:

  • get_task_by_name_run(name, run_id) emits:
    • {"type": "call", "op": "get_task_by_name_run", "run_id": run_id, "name": name}
  • get_secret_by_name(name) emits:
    • {"type": "call", "op": "get_secret_by_name", "name": name}

Logging helper emits:

  • log(msg, level="info"):
    • {"type": "log", "level": level, "msg": msg}

CLI

The package exposes a gust CLI.

Parse DAGs

gust parse --file path/to/dag_file.py

Output is JSON (printed to stdout), one list entry per discovered DAG class.

Run a Task

gust task run \
  --file path/to/dag_file.py \
  --dag MyDag \
  --task hello \
  --ctx-json '{"run_id":"123"}'

Output is a framed JSON payload:

  • Success:
    • {"type":"result","ok":true,"data":{"value": ...}}
  • Error:
    • {"type":"result","ok":false,"error":{"message":"...","type":"...","details":"..."}}

Run Completion Callback

gust run done \
  --file path/to/dag_file.py \
  --dag MyDag \
  --fn-name done_my_run \
  --status ok \
  --run-id 123

Behavior:

  • On success: no payload output.
  • On failure: process exits with code 1.

Development

Run tests:

uv run pytest -q

Run lint:

uv run ruff check .

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

gust_py-0.1.1.tar.gz (5.3 kB view details)

Uploaded Source

Built Distribution

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

gust_py-0.1.1-py3-none-any.whl (6.3 kB view details)

Uploaded Python 3

File details

Details for the file gust_py-0.1.1.tar.gz.

File metadata

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

File hashes

Hashes for gust_py-0.1.1.tar.gz
Algorithm Hash digest
SHA256 e05971520276f62888462b828e16c9d7402e6ffeecd65f0d8886cf84026c1d23
MD5 7f98792fc79bdba6eeeb31348731cbed
BLAKE2b-256 006b7b9ec3a2857f4938f89e16b3058a40a306f4ee72526e58e5dc43e1bc2512

See more details on using hashes here.

Provenance

The following attestation bundles were made for gust_py-0.1.1.tar.gz:

Publisher: ci_publish.yml on marciok/gust_py

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

File details

Details for the file gust_py-0.1.1-py3-none-any.whl.

File metadata

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

File hashes

Hashes for gust_py-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 072adbc12481f202ca6be26053a1f1ed3a12059c1f196df194422c268e37f533
MD5 170271082386947aae61e2e120a4389b
BLAKE2b-256 6d8af9df00b3ba7d18d9b9d59cbd44df0c4d7948bdb86d5ec614699288c24242

See more details on using hashes here.

Provenance

The following attestation bundles were made for gust_py-0.1.1-py3-none-any.whl:

Publisher: ci_publish.yml on marciok/gust_py

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