Workflow trigger model. v0.6.0's centralised depends_on={dict} is replaced
by a richer trigger surface on the workflow plus per-job depends_on for the
within-workflow DAG. Hard break, no backwards compat (we're in alpha).
Highlights
-
triggered_by=accepts a workflow/job name, a list (AND-conjoined), or a
boolean expression built fromAllOf(...)/AnyOf(...)for arbitrarily
nested AND/OR composition. Example:ematix.workflow( name="combined_report", triggered_by=AllOf("workflow_A", AnyOf("workflow_B", "workflow_C")), schedule="0 21 * * *", timezone="America/New_York", jobs=[...], )
-
schedule=+timezone=on the workflow (not per-job). Cron tick is one
trigger condition; AND-conjoined withtriggered_by/on_message. -
on_message=<source>for per-message firing (mutually exclusive with
triggered_by/schedule). -
Per-job
depends_on=[…]declares the within-workflow DAG.
Web UI
- Per-element trigger pills on every Workflows card — colored dot per leaf
AND per composite (ALL/ANY) showing the rolled-up state
(🟢 ready · 🟡 pending · 🔴 failed). ▶ Run nowbutton on every workflow card (with job-subset checkboxes)
and every job card (with optional cascade-downstream toggle).- Endpoints:
POST /api/workflows/{name}/run-now,POST /api/jobs/{name}/run-now.
Migration from v0.6.0
# old
ematix.workflow(name="W", jobs=["a","b","c"], depends_on={"b":["a"], "c":["b"]})
# new
@ematix.job(name="b", depends_on=["a"], ...)
@ematix.job(name="c", depends_on=["b"], ...)
ematix.workflow(name="W", jobs=["a","b","c"], schedule="0 * * * *")register_workflow raises with a pointer to the new model if it sees the
old shape.
Docs
- USER_GUIDE: trigger surface + AllOf/AnyOf composite section.
- ematix.dev: scheduling page rewritten with 6 real-world scenarios + honest
competitive framing (dbt / Airflow Datasets / Prefect Automations / Dagster
sensors).
Full changelog: https://github.com/ryan-evans-git/ematix-flow/blob/v0.7.0/CHANGELOG.md