dirigent-examples 0.18.2__tar.gz → 0.18.3__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.
Files changed (222) hide show
  1. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/PKG-INFO +3 -3
  2. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/pyproject.toml +3 -3
  3. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/pyproject.toml.orig +3 -3
  4. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/README.md +3 -1
  5. dirigent_examples-0.18.3/src/dirigent_examples/shelves/showcase/README.md +55 -0
  6. dirigent_examples-0.18.3/src/dirigent_examples/shelves/showcase/morning-briefing.yaml +258 -0
  7. dirigent_examples-0.18.3/src/dirigent_examples/shelves/showcase/nightly-regional-load.yaml +343 -0
  8. dirigent_examples-0.18.3/src/dirigent_examples/shelves/showcase/one-region-refuses.yaml +283 -0
  9. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/LICENSE +0 -0
  10. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/README.md +0 -0
  11. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/__init__.py +0 -0
  12. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/py.typed +0 -0
  13. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/composition/README.md +0 -0
  14. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/composition/chained-instances.yaml +0 -0
  15. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/composition/composition-child.yaml +0 -0
  16. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/composition/composition-parent.yaml +0 -0
  17. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/connections.yaml +0 -0
  18. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/demo/README.md +0 -0
  19. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/demo/markdown-showcase.yaml +0 -0
  20. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/demo/params-showcase.yaml +0 -0
  21. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/demo/requires.yaml +0 -0
  22. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/demo/weekly-import-malawi.yaml +0 -0
  23. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/demo/weekly-import-nepal.yaml +0 -0
  24. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/README.md +0 -0
  25. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-build-push.yaml +0 -0
  26. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-build-run.yaml +0 -0
  27. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-compose-database.yaml +0 -0
  28. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-compose-failing-up.yaml +0 -0
  29. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-compose-file.yaml +0 -0
  30. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-compose-profiles-env.yaml +0 -0
  31. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-compose-stack.yaml +0 -0
  32. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-hello.yaml +0 -0
  33. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-remote-daemon.yaml +0 -0
  34. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-run-failing-teardown.yaml +0 -0
  35. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/docker/docker-ticker.yaml +0 -0
  36. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/execute/README.md +0 -0
  37. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/execute/long-log.yaml +0 -0
  38. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/failure/README.md +0 -0
  39. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/failure/error-handler.yaml +0 -0
  40. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/failure/optional-step.yaml +0 -0
  41. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/failure/retries.yaml +0 -0
  42. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/failure/retry-budget.yaml +0 -0
  43. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/failure/step-timeout.yaml +0 -0
  44. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/git/README.md +0 -0
  45. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/git/git-checkout-build.yaml +0 -0
  46. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/git/git-checkout-compose.yaml +0 -0
  47. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/git/git-checkout-public.yaml +0 -0
  48. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/README.md +0 -0
  49. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/deep-chain.yaml +0 -0
  50. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/fan-in.yaml +0 -0
  51. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/fan-out.yaml +0 -0
  52. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/linear.yaml +0 -0
  53. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/parallel-branches.yaml +0 -0
  54. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/parallel-sleep.yaml +0 -0
  55. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/skip-diamond.yaml +0 -0
  56. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/graph/wide-fan.yaml +0 -0
  57. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/hello-world.yaml +0 -0
  58. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/README.md +0 -0
  59. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/feeds-composition.yaml +0 -0
  60. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/gdacs-disaster-updates.yaml +0 -0
  61. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/github-releases-relay.yaml +0 -0
  62. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/hdx-dataset-watch.yaml +0 -0
  63. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/kobo-submissions-to-csv.yaml +0 -0
  64. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/nominatim-geocode-facilities.yaml +0 -0
  65. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/odk-central-submissions.yaml +0 -0
  66. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/open-meteo-weekly-report.yaml +0 -0
  67. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/overpass-health-facilities.yaml +0 -0
  68. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/usgs-earthquakes-alert.yaml +0 -0
  69. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/who-gho-indicators-to-parquet.yaml +0 -0
  70. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/wikidata-country-reference.yaml +0 -0
  71. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/open-data/world-bank-population-trend.yaml +0 -0
  72. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/README.md +0 -0
  73. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/concurrency-queue.yaml +0 -0
  74. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/concurrency-replace.yaml +0 -0
  75. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/concurrency-skip.yaml +0 -0
  76. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/connections-referenced-vs-carried.yaml +0 -0
  77. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/deadline-on-a-sensor.yaml +0 -0
  78. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/fan-out-continue.yaml +0 -0
  79. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/fan-out-fail-fast.yaml +0 -0
  80. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/fan-out-from-params.yaml +0 -0
  81. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/fan-out-item-wise.yaml +0 -0
  82. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/fan-out-literal-list.yaml +0 -0
  83. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/fan-out-nested-objects.yaml +0 -0
  84. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/fan-out-then-join.yaml +0 -0
  85. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/importance-critical.yaml +0 -0
  86. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/log-levels.yaml +0 -0
  87. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/outputs-inline-vs-storage.yaml +0 -0
  88. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/params-every-type.yaml +0 -0
  89. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/params-validation-refuses.yaml +0 -0
  90. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/pipeline-run-child.yaml +0 -0
  91. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/pipeline-run-fire-and-forget.yaml +0 -0
  92. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/pipeline-run-strict.yaml +0 -0
  93. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/pipeline-run-wait.yaml +0 -0
  94. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/pipeline-run-with-params.yaml +0 -0
  95. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/poll-cadence.yaml +0 -0
  96. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/priority-layered.yaml +0 -0
  97. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/references-cheat-sheet.yaml +0 -0
  98. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/retry-budget-exhausted.yaml +0 -0
  99. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/retry-exponential-backoff.yaml +0 -0
  100. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/retry-only-transient.yaml +0 -0
  101. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/retry-with-jitter.yaml +0 -0
  102. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/rule-all-done.yaml +0 -0
  103. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/rule-all-success.yaml +0 -0
  104. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/rule-always.yaml +0 -0
  105. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/rule-one-failed.yaml +0 -0
  106. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/schedule-at-once.yaml +0 -0
  107. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/schedule-cron-timezone.yaml +0 -0
  108. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/schedule-interval.yaml +0 -0
  109. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/schedule-window-half-open.yaml +0 -0
  110. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/sensor-http-ready.yaml +0 -0
  111. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/sensor-storage-exists.yaml +0 -0
  112. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/step-names-and-keys.yaml +0 -0
  113. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/timeout-fails-the-step.yaml +0 -0
  114. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/timeout-skips-the-step.yaml +0 -0
  115. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/webhook-mapping-nested-payload.yaml +0 -0
  116. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/patterns/webhook-signed.yaml +0 -0
  117. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/preview/s3-parquet-to-ingestion.yaml +0 -0
  118. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/python/README.md +0 -0
  119. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/python/apply_and_run.py +0 -0
  120. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/python/ci_gate.py +0 -0
  121. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/python/connections.py +0 -0
  122. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/python/error_handling.py +0 -0
  123. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/python/follow_logs.py +0 -0
  124. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/python/list_and_filter.py +0 -0
  125. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/queues/README.md +0 -0
  126. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/queues/kafka-consume-then-transform.yaml +0 -0
  127. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/queues/kafka-produce-then-consume.yaml +0 -0
  128. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/queues/rabbitmq-consume-ack-on-success.yaml +0 -0
  129. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/queues/report-to-kafka.yaml +0 -0
  130. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/queues/report-to-rabbitmq.yaml +0 -0
  131. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/README.md +0 -0
  132. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/csv-header-rules.yaml +0 -0
  133. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/csv-to-ndjson.yaml +0 -0
  134. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/etl-csv-clean-validate-parquet.yaml +0 -0
  135. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/filter-by-predicate.yaml +0 -0
  136. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/filter-then-map-then-reduce.yaml +0 -0
  137. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-fetch-validate-post.yaml +0 -0
  138. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-follow-redirects.yaml +0 -0
  139. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-get-with-query.yaml +0 -0
  140. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-headers-and-auth-connection.yaml +0 -0
  141. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-post-file-from-storage.yaml +0 -0
  142. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-post-json-echo.yaml +0 -0
  143. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-post-report.yaml +0 -0
  144. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-save-body-to-storage.yaml +0 -0
  145. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-success-status-list.yaml +0 -0
  146. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/http-timeout-override.yaml +0 -0
  147. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-dedupe-by-key.yaml +0 -0
  148. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-defaults-and-nulls.yaml +0 -0
  149. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-group-by-and-sum.yaml +0 -0
  150. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-join-two-lists.yaml +0 -0
  151. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-long-to-wide.yaml +0 -0
  152. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-nested-to-flat.yaml +0 -0
  153. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-pivot-wide-to-long.yaml +0 -0
  154. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-running-totals.yaml +0 -0
  155. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-string-cleaning.yaml +0 -0
  156. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-top-n.yaml +0 -0
  157. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-validate-in-jq-vs-schema.yaml +0 -0
  158. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/jq-window-dates.yaml +0 -0
  159. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/json-to-csv-flattening.yaml +0 -0
  160. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/large-output-to-storage.yaml +0 -0
  161. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/map-enrich-with-lookup.yaml +0 -0
  162. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/ndjson-to-parquet.yaml +0 -0
  163. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/pagination-by-fan-out.yaml +0 -0
  164. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/parquet-round-trip-types.yaml +0 -0
  165. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/reconcile-two-sources.yaml +0 -0
  166. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/report-built-in.yaml +0 -0
  167. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/report-daily-digest.yaml +0 -0
  168. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/report-to-file.yaml +0 -0
  169. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/report-to-webhook.yaml +0 -0
  170. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/schema-carried.yaml +0 -0
  171. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/schema-formats.yaml +0 -0
  172. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/schema-referenced.yaml +0 -0
  173. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/schema-refuses-then-rule.yaml +0 -0
  174. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/storage-copy-dated-archive.yaml +0 -0
  175. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/storage-exists-gate.yaml +0 -0
  176. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/storage-keep-past-the-run.yaml +0 -0
  177. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/storage-manifest-of-a-fan-out.yaml +0 -0
  178. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/storage-write-then-read.yaml +0 -0
  179. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/webhook-post-hmac.yaml +0 -0
  180. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/recipes/webhook-post-summary.yaml +0 -0
  181. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/s3/README.md +0 -0
  182. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/s3/report-to-s3.yaml +0 -0
  183. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/s3/s3-copy-and-verify.yaml +0 -0
  184. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/s3/s3-csv-report.yaml +0 -0
  185. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/s3/s3-parquet-report.yaml +0 -0
  186. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/s3/s3-round-trip.yaml +0 -0
  187. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/schemas/README.md +0 -0
  188. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/schemas/echo-reading.json +0 -0
  189. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/schemas/ou-record.json +0 -0
  190. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/schemas/station-reading.json +0 -0
  191. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sensors/README.md +0 -0
  192. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sensors/sensor-gate.yaml +0 -0
  193. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sensors/time-window.yaml +0 -0
  194. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sql/README.md +0 -0
  195. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sql/duckdb-parquet-to-report.yaml +0 -0
  196. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sql/sql-postgres-readonly.yaml +0 -0
  197. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sql/sql-query-to-storage.yaml +0 -0
  198. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sql/sql-sqlite-roundtrip.yaml +0 -0
  199. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/sql/warehouse.sql +0 -0
  200. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/README.md +0 -0
  201. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/csv-report.yaml +0 -0
  202. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/jq-filter-and-map.yaml +0 -0
  203. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/jq-group-and-aggregate.yaml +0 -0
  204. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/jq-join-two-sources.yaml +0 -0
  205. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/jq-reshape.yaml +0 -0
  206. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/jq-stream-through-storage.yaml +0 -0
  207. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/ndjson-round-trip.yaml +0 -0
  208. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/parquet-round-trip.yaml +0 -0
  209. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/std-convert-fan-out.yaml +0 -0
  210. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/xml-feed-to-ndjson.yaml +0 -0
  211. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/transform/yaml-config-to-json.yaml +0 -0
  212. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/triggers/README.md +0 -0
  213. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/triggers/at-one-time.yaml +0 -0
  214. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/triggers/cron-nightly.yaml +0 -0
  215. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/triggers/cron-windowed.yaml +0 -0
  216. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/triggers/document-nightly.yaml +0 -0
  217. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/triggers/interval-rolling.yaml +0 -0
  218. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/triggers/managed-and-manual.yaml +0 -0
  219. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/triggers/webhook-trigger.yaml +0 -0
  220. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/validate/README.md +0 -0
  221. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/src/dirigent_examples/shelves/validate/expects-a-shape.yaml +0 -0
  222. {dirigent_examples-0.18.2 → dirigent_examples-0.18.3}/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.2
3
+ Version: 0.18.3
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.2
10
- Requires-Dist: dirigent-plugin==0.18.2
9
+ Requires-Dist: dirigent-client==0.18.3
10
+ Requires-Dist: dirigent-plugin==0.18.3
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.2"
3
+ version = "0.18.3"
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.2",
15
- "dirigent-plugin==0.18.2",
14
+ "dirigent-client==0.18.3",
15
+ "dirigent-plugin==0.18.3",
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.2"
3
+ version = "0.18.3"
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.2",
16
- "dirigent-plugin==0.18.2",
15
+ "dirigent-client==0.18.3",
16
+ "dirigent-plugin==0.18.3",
17
17
  ]
18
18
 
19
19
  [project.entry-points."dirigent.plugins.v1"]
@@ -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 | 159 | 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 |
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