dirigent-examples 0.18.2__tar.gz → 0.18.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/PKG-INFO +3 -3
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/pyproject.toml +3 -3
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/pyproject.toml.orig +3 -3
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/README.md +3 -1
- dirigent_examples-0.18.4/src/dirigent_examples/shelves/showcase/README.md +55 -0
- dirigent_examples-0.18.4/src/dirigent_examples/shelves/showcase/morning-briefing.yaml +258 -0
- dirigent_examples-0.18.4/src/dirigent_examples/shelves/showcase/nightly-regional-load.yaml +343 -0
- dirigent_examples-0.18.4/src/dirigent_examples/shelves/showcase/one-region-refuses.yaml +283 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/LICENSE +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/__init__.py +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/py.typed +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/composition/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/composition/chained-instances.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/composition/composition-child.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/composition/composition-parent.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/connections.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/demo/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/demo/markdown-showcase.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/demo/params-showcase.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/demo/requires.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/demo/weekly-import-malawi.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/demo/weekly-import-nepal.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-build-push.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-build-run.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-compose-database.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-compose-failing-up.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-compose-file.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-compose-profiles-env.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-compose-stack.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-hello.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-remote-daemon.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-run-failing-teardown.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/docker/docker-ticker.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/execute/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/execute/long-log.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/failure/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/failure/error-handler.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/failure/optional-step.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/failure/retries.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/failure/retry-budget.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/failure/step-timeout.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/git/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/git/git-checkout-build.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/git/git-checkout-compose.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/git/git-checkout-public.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/deep-chain.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/fan-in.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/fan-out.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/linear.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/parallel-branches.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/parallel-sleep.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/skip-diamond.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/graph/wide-fan.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/hello-world.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/feeds-composition.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/gdacs-disaster-updates.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/github-releases-relay.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/hdx-dataset-watch.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/kobo-submissions-to-csv.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/nominatim-geocode-facilities.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/odk-central-submissions.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/open-meteo-weekly-report.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/overpass-health-facilities.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/usgs-earthquakes-alert.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/who-gho-indicators-to-parquet.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/wikidata-country-reference.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/open-data/world-bank-population-trend.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/concurrency-queue.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/concurrency-replace.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/concurrency-skip.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/connections-referenced-vs-carried.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/deadline-on-a-sensor.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/fan-out-continue.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/fan-out-fail-fast.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/fan-out-from-params.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/fan-out-item-wise.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/fan-out-literal-list.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/fan-out-nested-objects.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/fan-out-then-join.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/importance-critical.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/log-levels.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/outputs-inline-vs-storage.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/params-every-type.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/params-validation-refuses.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/pipeline-run-child.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/pipeline-run-fire-and-forget.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/pipeline-run-strict.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/pipeline-run-wait.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/pipeline-run-with-params.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/poll-cadence.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/priority-layered.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/references-cheat-sheet.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/retry-budget-exhausted.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/retry-exponential-backoff.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/retry-only-transient.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/retry-with-jitter.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/rule-all-done.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/rule-all-success.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/rule-always.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/rule-one-failed.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/schedule-at-once.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/schedule-cron-timezone.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/schedule-interval.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/schedule-window-half-open.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/sensor-http-ready.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/sensor-storage-exists.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/step-names-and-keys.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/timeout-fails-the-step.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/timeout-skips-the-step.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/webhook-mapping-nested-payload.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/patterns/webhook-signed.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/preview/s3-parquet-to-ingestion.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/python/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/python/apply_and_run.py +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/python/ci_gate.py +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/python/connections.py +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/python/error_handling.py +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/python/follow_logs.py +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/python/list_and_filter.py +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/queues/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/queues/kafka-consume-then-transform.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/queues/kafka-produce-then-consume.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/queues/rabbitmq-consume-ack-on-success.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/queues/report-to-kafka.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/queues/report-to-rabbitmq.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/csv-header-rules.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/csv-to-ndjson.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/etl-csv-clean-validate-parquet.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/filter-by-predicate.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/filter-then-map-then-reduce.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-fetch-validate-post.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-follow-redirects.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-get-with-query.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-headers-and-auth-connection.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-post-file-from-storage.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-post-json-echo.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-post-report.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-save-body-to-storage.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-success-status-list.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/http-timeout-override.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-dedupe-by-key.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-defaults-and-nulls.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-group-by-and-sum.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-join-two-lists.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-long-to-wide.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-nested-to-flat.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-pivot-wide-to-long.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-running-totals.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-string-cleaning.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-top-n.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-validate-in-jq-vs-schema.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/jq-window-dates.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/json-to-csv-flattening.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/large-output-to-storage.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/map-enrich-with-lookup.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/ndjson-to-parquet.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/pagination-by-fan-out.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/parquet-round-trip-types.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/reconcile-two-sources.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/report-built-in.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/report-daily-digest.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/report-to-file.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/report-to-webhook.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/schema-carried.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/schema-formats.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/schema-referenced.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/schema-refuses-then-rule.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/storage-copy-dated-archive.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/storage-exists-gate.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/storage-keep-past-the-run.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/storage-manifest-of-a-fan-out.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/storage-write-then-read.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/webhook-post-hmac.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/recipes/webhook-post-summary.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/s3/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/s3/report-to-s3.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/s3/s3-copy-and-verify.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/s3/s3-csv-report.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/s3/s3-parquet-report.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/s3/s3-round-trip.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/schemas/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/schemas/echo-reading.json +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/schemas/ou-record.json +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/schemas/station-reading.json +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sensors/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sensors/sensor-gate.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sensors/time-window.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sql/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sql/duckdb-parquet-to-report.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sql/sql-postgres-readonly.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sql/sql-query-to-storage.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sql/sql-sqlite-roundtrip.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/sql/warehouse.sql +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/csv-report.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/jq-filter-and-map.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/jq-group-and-aggregate.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/jq-join-two-sources.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/jq-reshape.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/jq-stream-through-storage.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/ndjson-round-trip.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/parquet-round-trip.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/std-convert-fan-out.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/xml-feed-to-ndjson.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/transform/yaml-config-to-json.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/triggers/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/triggers/at-one-time.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/triggers/cron-nightly.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/triggers/cron-windowed.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/triggers/document-nightly.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/triggers/interval-rolling.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/triggers/managed-and-manual.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/triggers/webhook-trigger.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/validate/README.md +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/validate/expects-a-shape.yaml +0 -0
- {dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/validate/the-shape-is-wrong.yaml +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dirigent-examples
|
|
3
|
-
Version: 0.18.
|
|
3
|
+
Version: 0.18.4
|
|
4
4
|
Summary: The dirigent example corpus: the shelves of runnable documents, installed.
|
|
5
5
|
License-Expression: LicenseRef-Proprietary
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Classifier: Programming Language :: Python :: 3
|
|
8
8
|
Classifier: Programming Language :: Python :: 3.13
|
|
9
|
-
Requires-Dist: dirigent-client==0.18.
|
|
10
|
-
Requires-Dist: dirigent-plugin==0.18.
|
|
9
|
+
Requires-Dist: dirigent-client==0.18.4
|
|
10
|
+
Requires-Dist: dirigent-plugin==0.18.4
|
|
11
11
|
Requires-Python: >=3.13
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "dirigent-examples"
|
|
3
|
-
version = "0.18.
|
|
3
|
+
version = "0.18.4"
|
|
4
4
|
description = "The dirigent example corpus: the shelves of runnable documents, installed."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.13"
|
|
@@ -11,8 +11,8 @@ classifiers = [
|
|
|
11
11
|
"Programming Language :: Python :: 3.13",
|
|
12
12
|
]
|
|
13
13
|
dependencies = [
|
|
14
|
-
"dirigent-client==0.18.
|
|
15
|
-
"dirigent-plugin==0.18.
|
|
14
|
+
"dirigent-client==0.18.4",
|
|
15
|
+
"dirigent-plugin==0.18.4",
|
|
16
16
|
]
|
|
17
17
|
|
|
18
18
|
[project.entry-points."dirigent.plugins.v1"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "dirigent-examples"
|
|
3
|
-
version = "0.18.
|
|
3
|
+
version = "0.18.4"
|
|
4
4
|
description = "The dirigent example corpus: the shelves of runnable documents, installed."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.13"
|
|
@@ -12,8 +12,8 @@ classifiers = [
|
|
|
12
12
|
]
|
|
13
13
|
dependencies = [
|
|
14
14
|
# The python/ shelf is SDK scripts a reader runs, so the corpus carries the client.
|
|
15
|
-
"dirigent-client==0.18.
|
|
16
|
-
"dirigent-plugin==0.18.
|
|
15
|
+
"dirigent-client==0.18.4",
|
|
16
|
+
"dirigent-plugin==0.18.4",
|
|
17
17
|
]
|
|
18
18
|
|
|
19
19
|
[project.entry-points."dirigent.plugins.v1"]
|
{dirigent_examples-0.18.2 → dirigent_examples-0.18.4}/src/dirigent_examples/shelves/README.md
RENAMED
|
@@ -27,6 +27,7 @@ The documents live on topic shelves, each with its own README:
|
|
|
27
27
|
| [`composition/`](composition) | Pipelines made of pipelines, and the handoff to a second instance. |
|
|
28
28
|
| [`s3/`](s3) | Object storage through the `s3://` scheme, with no S3 block anywhere. |
|
|
29
29
|
| [`demo/`](demo) | Surfaces shown off: the run form, rendered markdown, the requires preflight, the weekly-import shared-name pair. |
|
|
30
|
+
| [`showcase/`](showcase) | Pipelines sized like the work: fifteen steps, eight-wide fan-outs, gates in the middle and a page at the end. |
|
|
30
31
|
| [`open-data/`](open-data) | Real feeds against public, mostly keyless APIs: acme, health indicators, maps, earthquakes, humanitarian data. |
|
|
31
32
|
| [`validate/`](validate) | A gate that checks a value's shape and passes it through: `validate.schema`, with the shape carried and named. |
|
|
32
33
|
| [`schemas/`](schemas) | Not documents but the shapes they are held to: plain JSON Schemas, applied on their own and referenced by code. |
|
|
@@ -97,6 +98,7 @@ Not every one of them succeeds, and that is the point of three of them:
|
|
|
97
98
|
| `failure/retry-budget.yaml` | `failed` | A command that always exits 1, given three attempts to prove it |
|
|
98
99
|
| `failure/step-timeout.yaml` | `failed` | A thirty-second sleep against a two-second budget, so it fails in about two |
|
|
99
100
|
| `graph/skip-diamond.yaml` | `succeeded` | Green, with one step skipped: the handler had nothing to handle |
|
|
101
|
+
| `showcase/one-region-refuses.yaml` | `completed_with_errors` | One region's export answers 500 until its retry budget is spent; the other seven load |
|
|
100
102
|
|
|
101
103
|
`dg run --local` applies and runs the document in a throwaway SQLite instance that is
|
|
102
104
|
deleted afterwards -- no server, no Docker, no database. When a step fails it prints the
|
|
@@ -280,7 +282,7 @@ what a failure looks like, so the seeded one is deliberately mixed:
|
|
|
280
282
|
|
|
281
283
|
| What lands | How many | Why |
|
|
282
284
|
| --- | --- | --- |
|
|
283
|
-
| Pipelines stored |
|
|
285
|
+
| Pipelines stored | 162 | Every document here that an instance will hold, including the ones that carry their own connections or schemas: the seed creates what they carry and applies the rest, which is the only form an instance stores |
|
|
284
286
|
| Documents refused | 18 | Nine in [docker/](docker) and two in [git/](git) name a compose or a build block the seed does not allowlist, some of them also a connection it does not create; four name a connection that does not exist, one of them (`warehouse-nobody-created`) built by the seed on purpose; one names a schema no instance here holds; and two require a pipeline or a target applied after them |
|
|
285
287
|
| Schedules | 17, all paused | `--paused` is what stops seventeen clocks starting to fire at somebody who has not looked at them |
|
|
286
288
|
| Runs | 3 succeeded, 1 with errors, 2 failed | `hello-world`, `transform/jq-reshape.yaml` and `triggers/cron-windowed.yaml` settle green; `optional-step.yaml` settles `completed_with_errors`, which is a third status rather than a shade of failed; `error-handler.yaml` fails by design, and `s3-round-trip.yaml` cannot reach an object store nobody started |
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Showcase
|
|
2
|
+
|
|
3
|
+
Pipelines sized like the work, rather than cut down to one lesson. Every other shelf is
|
|
4
|
+
deliberately small -- one behaviour per file, so nothing distracts from it. This one is the
|
|
5
|
+
other extreme: documents with fifteen steps, eight-wide fan-outs, gates in the middle and a
|
|
6
|
+
page at the end, because that is what an operated pipeline looks like and it is what the
|
|
7
|
+
screens in [the screens page](../../docs/screens.md) are photographed on.
|
|
8
|
+
|
|
9
|
+
Nothing here needs infrastructure, a credential, or an allowlist entry. The HTTP calls go to
|
|
10
|
+
[Postman Echo](https://postman-echo.com), the schemas are carried in the documents, and the
|
|
11
|
+
files land under the run's own scratch prefix.
|
|
12
|
+
|
|
13
|
+
| File | What it shows | Ends as |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| [nightly-regional-load.yaml](nightly-regional-load.yaml) | Fifteen steps: a maintenance window, a gated catalogue read, submit-then-probe per region, a per-region gate and write, two joins, and a page | `succeeded` |
|
|
16
|
+
| [one-region-refuses.yaml](one-region-refuses.yaml) | Eight exports where one answers 500 until its retry budget is spent, the gap named rather than implied, and a report template of its own | `completed_with_errors` |
|
|
17
|
+
| [morning-briefing.yaml](morning-briefing.yaml) | The three jq verbs one per hop -- `filter.jq`, `map.jq`, `transform.jq` -- four feeds each narrowed and banded, joined and gated | `succeeded` |
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
dg run --local examples/showcase/nightly-regional-load.yaml
|
|
21
|
+
dg run --local examples/showcase/one-region-refuses.yaml # completed_with_errors, by design
|
|
22
|
+
dg run --local examples/showcase/morning-briefing.yaml
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Watching one happen
|
|
26
|
+
|
|
27
|
+
A run that is green before the screen has drawn it teaches nothing about what a fan-out looks
|
|
28
|
+
like while it is in flight. `nightly-regional-load.yaml` carries a `pace` for that: it is the
|
|
29
|
+
seconds each region's export takes before its readiness probe answers, so eight items sit in
|
|
30
|
+
progress for as long as you ask them to.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
dg run --local examples/showcase/nightly-regional-load.yaml -p pace=6
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
On an instance, the same knob is what the run screen is photographed through:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
dg apply examples/showcase/nightly-regional-load.yaml
|
|
40
|
+
dg run nightly-regional-load -p pace=8 --watch
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## What each one carries
|
|
44
|
+
|
|
45
|
+
All three carry their own `schemas:`, so a `--local` run has the shapes without an instance
|
|
46
|
+
holding them. An instance refuses a document that carries a schema, which is why
|
|
47
|
+
`dg pipeline new` moves a carried section into `requires:` when it copies a starter.
|
|
48
|
+
|
|
49
|
+
Two of them carry a `triggers:` section with a clock -- `nightly-regional-load` at 03:00 Oslo
|
|
50
|
+
time, `morning-briefing` at 06:30 -- so applying either brings its schedule with it. `dg dev
|
|
51
|
+
--seed` applies them paused.
|
|
52
|
+
|
|
53
|
+
All three declare a `report:`, so every run of them writes its own account of itself:
|
|
54
|
+
`one-region-refuses` brings a template that leads with the items that did not make it, and the
|
|
55
|
+
other two take the page the engine ships.
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# Four feeds, filtered and banded one feed at a time, joined into the page somebody reads.
|
|
2
|
+
#
|
|
3
|
+
# The other two documents on this shelf are about the night the data arrives. This is about
|
|
4
|
+
# the morning after it: four feeds already collected, each narrowed to what is worth reading,
|
|
5
|
+
# each reading labelled, and the four summaries joined into one briefing with a gate on it.
|
|
6
|
+
#
|
|
7
|
+
# In: a day, and four feeds each carrying its own readings.
|
|
8
|
+
# Out: a markdown briefing under the run's scratch prefix, read back and logged.
|
|
9
|
+
#
|
|
10
|
+
# THE DATA IS THE DOCUMENT'S OWN, AND IT MAKES A REAL ROUND TRIP. Postman Echo has no health
|
|
11
|
+
# feed to serve, so each feed's readings are written here and posted to /post, which hands
|
|
12
|
+
# them back. What is being taught is the shape of the flow, and nothing about it changes when
|
|
13
|
+
# the url becomes a real one.
|
|
14
|
+
#
|
|
15
|
+
# THE JQ FAMILY IS THREE VERBS, AND EACH IS ONE HOP HERE:
|
|
16
|
+
#
|
|
17
|
+
# filter.jq keeps the elements a program answers true for. A list in, a shorter list out.
|
|
18
|
+
# map.jq replaces every element with what a program makes of it. Same length, new shape.
|
|
19
|
+
# transform.jq runs one program over the whole value, which is how a list becomes an object.
|
|
20
|
+
#
|
|
21
|
+
# HOP BY HOP:
|
|
22
|
+
#
|
|
23
|
+
# pull http.request, once per feed. The readings go out and come back.
|
|
24
|
+
# recent filter.jq, once per feed: drop everything under the threshold.
|
|
25
|
+
# banded map.jq, once per feed: label each surviving reading.
|
|
26
|
+
# feed_summary transform.jq, once per feed: the list becomes one object.
|
|
27
|
+
# briefing transform.jq, the join, with no for_each of its own.
|
|
28
|
+
# check_briefing validate.schema, the gate the page is built from rather than around.
|
|
29
|
+
# page report.render, the markdown.
|
|
30
|
+
# save storage.write, the page under the run's scratch prefix.
|
|
31
|
+
# back storage.read, the same URI, so the round trip is proven rather than assumed.
|
|
32
|
+
# announce log.write, the page's text onto the run's own timeline.
|
|
33
|
+
#
|
|
34
|
+
# EXPECT THIS RUN TO SUCCEED in about a second, with four feeds in the briefing.
|
|
35
|
+
#
|
|
36
|
+
# TO CHANGE IT: raise `threshold` and watch feeds empty out, or hand it your own feeds. A feed
|
|
37
|
+
# whose readings all fall below the threshold summarises as zero rather than failing, which is
|
|
38
|
+
# what makes the gate below worth having: an empty feed is a shape, not an error.
|
|
39
|
+
#
|
|
40
|
+
# dg run --local examples/showcase/morning-briefing.yaml
|
|
41
|
+
# dg run --local examples/showcase/morning-briefing.yaml -p threshold=70
|
|
42
|
+
#
|
|
43
|
+
# dg apply examples/showcase/morning-briefing.yaml
|
|
44
|
+
# dg run morning-briefing --watch
|
|
45
|
+
|
|
46
|
+
format: dirigent/v1
|
|
47
|
+
kind: pipeline
|
|
48
|
+
code: morning-briefing
|
|
49
|
+
name: The morning briefing
|
|
50
|
+
description: |
|
|
51
|
+
Four feeds, each filtered to what clears a threshold, each reading banded, each summarised,
|
|
52
|
+
and the four summaries joined into one gated briefing that is rendered, saved and read back.
|
|
53
|
+
|
|
54
|
+
The three jq verbs in one document: `filter.jq` narrows a list, `map.jq` reshapes its
|
|
55
|
+
elements, and `transform.jq` turns the list into an object.
|
|
56
|
+
|
|
57
|
+
tags: [showcase, http, transform, validate, storage, report, fan-out, jq, filter, map, briefing, schedule, starter]
|
|
58
|
+
|
|
59
|
+
requires:
|
|
60
|
+
blocks:
|
|
61
|
+
- http.request
|
|
62
|
+
- filter.jq
|
|
63
|
+
- map.jq
|
|
64
|
+
- transform.jq
|
|
65
|
+
- validate.schema
|
|
66
|
+
- storage.write
|
|
67
|
+
- storage.read
|
|
68
|
+
- report.render
|
|
69
|
+
- log.write
|
|
70
|
+
|
|
71
|
+
params:
|
|
72
|
+
type: object
|
|
73
|
+
properties:
|
|
74
|
+
day:
|
|
75
|
+
type: string
|
|
76
|
+
format: date
|
|
77
|
+
default: "2026-03-01"
|
|
78
|
+
description: The day the briefing covers.
|
|
79
|
+
threshold:
|
|
80
|
+
type: integer
|
|
81
|
+
default: 40
|
|
82
|
+
minimum: 0
|
|
83
|
+
description: Readings under this are dropped before anything is said about them.
|
|
84
|
+
band_at:
|
|
85
|
+
type: integer
|
|
86
|
+
default: 60
|
|
87
|
+
minimum: 0
|
|
88
|
+
description: Readings at or above this are banded high rather than watch.
|
|
89
|
+
feeds:
|
|
90
|
+
type: array
|
|
91
|
+
description: One element per feed, each carrying the readings that feed reported.
|
|
92
|
+
minItems: 1
|
|
93
|
+
maxItems: 12
|
|
94
|
+
default:
|
|
95
|
+
- { feed: cases, readings: [18, 42, 61, 39, 77, 54, 23] }
|
|
96
|
+
- { feed: climate, readings: [31, 29, 44, 58, 66, 72, 19, 48] }
|
|
97
|
+
- { feed: stockouts, readings: [5, 12, 63, 81, 47, 22] }
|
|
98
|
+
- { feed: attendance, readings: [88, 91, 64, 59, 73, 45] }
|
|
99
|
+
items:
|
|
100
|
+
type: object
|
|
101
|
+
required: [feed, readings]
|
|
102
|
+
properties:
|
|
103
|
+
feed: { type: string }
|
|
104
|
+
readings:
|
|
105
|
+
type: array
|
|
106
|
+
items: { type: integer }
|
|
107
|
+
|
|
108
|
+
# Carried, so `dg run --local` has the shape without an instance holding it.
|
|
109
|
+
schemas:
|
|
110
|
+
daily-briefing:
|
|
111
|
+
type: object
|
|
112
|
+
required: [day, feeds]
|
|
113
|
+
additionalProperties: false
|
|
114
|
+
properties:
|
|
115
|
+
day: { type: string, format: date }
|
|
116
|
+
readings: { type: integer, minimum: 0 }
|
|
117
|
+
feeds:
|
|
118
|
+
type: array
|
|
119
|
+
minItems: 1
|
|
120
|
+
items:
|
|
121
|
+
type: object
|
|
122
|
+
required: [feed, reported, kept, high]
|
|
123
|
+
additionalProperties: false
|
|
124
|
+
properties:
|
|
125
|
+
feed: { type: string, minLength: 1 }
|
|
126
|
+
reported: { type: integer, minimum: 0 }
|
|
127
|
+
kept: { type: integer, minimum: 0 }
|
|
128
|
+
high: { type: integer, minimum: 0 }
|
|
129
|
+
peak: { type: [integer, "null"] }
|
|
130
|
+
|
|
131
|
+
steps:
|
|
132
|
+
pull:
|
|
133
|
+
block: http.request
|
|
134
|
+
for_each: "${params.feeds}"
|
|
135
|
+
items: continue
|
|
136
|
+
retry:
|
|
137
|
+
max_attempts: 3
|
|
138
|
+
backoff: 1s
|
|
139
|
+
multiplier: 2.0
|
|
140
|
+
jitter: 0.2
|
|
141
|
+
config:
|
|
142
|
+
url: https://postman-echo.com/post
|
|
143
|
+
method: POST
|
|
144
|
+
body:
|
|
145
|
+
feed: "${item.feed}"
|
|
146
|
+
day: "${params.day}"
|
|
147
|
+
readings: "${item.readings}"
|
|
148
|
+
|
|
149
|
+
recent:
|
|
150
|
+
block: filter.jq
|
|
151
|
+
depends_on: [pull]
|
|
152
|
+
# pull's grid, so feed three here is feed three there.
|
|
153
|
+
for_each: "${steps.pull.items}"
|
|
154
|
+
config:
|
|
155
|
+
input: "${steps.pull.item.output.body.data.readings}"
|
|
156
|
+
# A filter program answers true or false for one element; the elements it answers true
|
|
157
|
+
# for are the output, in the order they arrived.
|
|
158
|
+
program: ". >= ${params.threshold}"
|
|
159
|
+
|
|
160
|
+
banded:
|
|
161
|
+
block: map.jq
|
|
162
|
+
depends_on: [recent]
|
|
163
|
+
for_each: "${steps.recent.items}"
|
|
164
|
+
config:
|
|
165
|
+
input: "${steps.recent.item.output.value}"
|
|
166
|
+
# A map program is run per element and its answer replaces the element, so an integer
|
|
167
|
+
# becomes the object the page wants to read.
|
|
168
|
+
program: "{value: ., band: (if . >= ${params.band_at} then \"high\" else \"watch\" end)}"
|
|
169
|
+
|
|
170
|
+
feed_summary:
|
|
171
|
+
block: transform.jq
|
|
172
|
+
depends_on: [pull, banded]
|
|
173
|
+
for_each: "${steps.banded.items}"
|
|
174
|
+
config:
|
|
175
|
+
input:
|
|
176
|
+
feed: "${item.feed}"
|
|
177
|
+
reported: "${steps.pull.item.output.body.data.readings}"
|
|
178
|
+
kept: "${steps.banded.item.output.value}"
|
|
179
|
+
# One program over the whole value, which is what turns a list into an object.
|
|
180
|
+
program: |
|
|
181
|
+
{feed: .feed,
|
|
182
|
+
reported: (.reported | length),
|
|
183
|
+
kept: (.kept | length),
|
|
184
|
+
high: ([.kept[] | select(.band == "high")] | length),
|
|
185
|
+
peak: (if (.kept | length) > 0 then ([.kept[].value] | max) else null end)}
|
|
186
|
+
|
|
187
|
+
briefing:
|
|
188
|
+
block: transform.jq
|
|
189
|
+
depends_on: [feed_summary]
|
|
190
|
+
# No for_each, so this is the join: one attempt over every feed's summary.
|
|
191
|
+
config:
|
|
192
|
+
input:
|
|
193
|
+
day: "${params.day}"
|
|
194
|
+
feeds: "${steps.feed_summary.output}"
|
|
195
|
+
program: |
|
|
196
|
+
{day: .day,
|
|
197
|
+
readings: ([.feeds[].value.kept] | add),
|
|
198
|
+
feeds: [.feeds[].value]}
|
|
199
|
+
|
|
200
|
+
check_briefing:
|
|
201
|
+
block: validate.schema
|
|
202
|
+
depends_on: [briefing]
|
|
203
|
+
config:
|
|
204
|
+
input: "${steps.briefing.output.value}"
|
|
205
|
+
schema: daily-briefing
|
|
206
|
+
|
|
207
|
+
page:
|
|
208
|
+
block: report.render
|
|
209
|
+
depends_on: [check_briefing]
|
|
210
|
+
config:
|
|
211
|
+
values:
|
|
212
|
+
# The gate's output, not the raw join: every value the page words is one the gate
|
|
213
|
+
# already passed.
|
|
214
|
+
briefing: "${steps.check_briefing.output.value}"
|
|
215
|
+
threshold: "${params.threshold}"
|
|
216
|
+
content_type: text/markdown
|
|
217
|
+
template: |
|
|
218
|
+
# Morning briefing for {{ briefing.day }}
|
|
219
|
+
|
|
220
|
+
{{ briefing.feeds | length }} feeds, and {{ briefing.readings }} readings that cleared {{ threshold }}.
|
|
221
|
+
|
|
222
|
+
| Feed | Reported | Kept | High | Peak |
|
|
223
|
+
| --- | --- | --- | --- | --- |
|
|
224
|
+
{% for feed in briefing.feeds %}
|
|
225
|
+
| {{ feed.feed }} | {{ feed.reported }} | {{ feed.kept }} | {{ feed.high }} | {{ feed.peak }} |
|
|
226
|
+
{% endfor %}
|
|
227
|
+
|
|
228
|
+
save:
|
|
229
|
+
block: storage.write
|
|
230
|
+
depends_on: [page]
|
|
231
|
+
config:
|
|
232
|
+
target: "${run.scratch}/briefing-${params.day}.md"
|
|
233
|
+
text: "${steps.page.output.text}"
|
|
234
|
+
content_type: "${steps.page.output.content_type}"
|
|
235
|
+
|
|
236
|
+
back:
|
|
237
|
+
block: storage.read
|
|
238
|
+
depends_on: [save]
|
|
239
|
+
config:
|
|
240
|
+
source: "${steps.save.output.uri}"
|
|
241
|
+
max_size: 1mb
|
|
242
|
+
|
|
243
|
+
announce:
|
|
244
|
+
block: log.write
|
|
245
|
+
depends_on: [back]
|
|
246
|
+
config:
|
|
247
|
+
message: the morning briefing, read back out of storage
|
|
248
|
+
value: "${steps.back.output.text}"
|
|
249
|
+
|
|
250
|
+
report: {}
|
|
251
|
+
|
|
252
|
+
triggers:
|
|
253
|
+
schedules:
|
|
254
|
+
- code: every-morning
|
|
255
|
+
name: Every morning, Oslo time
|
|
256
|
+
description: Fires once the night's loads have settled.
|
|
257
|
+
cron: "30 6 * * *"
|
|
258
|
+
timezone: Europe/Oslo
|