dirigent-examples 0.20.0__tar.gz → 0.21.0__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 (232) hide show
  1. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/PKG-INFO +3 -3
  2. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/pyproject.toml +3 -3
  3. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/pyproject.toml.orig +3 -3
  4. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/README.md +1 -1
  5. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/queues/README.md +3 -1
  6. dirigent_examples-0.21.0/src/dirigent_examples/shelves/queues/kafka-watch-then-transform.yaml +88 -0
  7. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/triggers/README.md +6 -5
  8. dirigent_examples-0.21.0/src/dirigent_examples/shelves/triggers/watch-a-sensor.yaml +85 -0
  9. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/LICENSE +0 -0
  10. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/README.md +0 -0
  11. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/__init__.py +0 -0
  12. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/py.typed +0 -0
  13. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/composition/README.md +0 -0
  14. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/composition/chained-instances.yaml +0 -0
  15. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/composition/composition-child.yaml +0 -0
  16. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/composition/composition-parent.yaml +0 -0
  17. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/connections.yaml +0 -0
  18. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/demo/README.md +0 -0
  19. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/demo/markdown-showcase.yaml +0 -0
  20. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/demo/params-showcase.yaml +0 -0
  21. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/demo/requires.yaml +0 -0
  22. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/demo/weekly-import-malawi.yaml +0 -0
  23. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/demo/weekly-import-nepal.yaml +0 -0
  24. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/README.md +0 -0
  25. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-build-push.yaml +0 -0
  26. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-build-run.yaml +0 -0
  27. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-compose-database.yaml +0 -0
  28. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-compose-failing-up.yaml +0 -0
  29. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-compose-file.yaml +0 -0
  30. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-compose-profiles-env.yaml +0 -0
  31. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-compose-stack.yaml +0 -0
  32. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-hello.yaml +0 -0
  33. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-remote-daemon.yaml +0 -0
  34. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-run-failing-teardown.yaml +0 -0
  35. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/docker/docker-ticker.yaml +0 -0
  36. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/execute/README.md +0 -0
  37. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/execute/long-log.yaml +0 -0
  38. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/failure/README.md +0 -0
  39. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/failure/error-handler.yaml +0 -0
  40. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/failure/optional-step.yaml +0 -0
  41. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/failure/retries.yaml +0 -0
  42. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/failure/retry-budget.yaml +0 -0
  43. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/failure/step-timeout.yaml +0 -0
  44. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/git/README.md +0 -0
  45. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/git/git-checkout-build.yaml +0 -0
  46. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/git/git-checkout-compose.yaml +0 -0
  47. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/git/git-checkout-public.yaml +0 -0
  48. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/README.md +0 -0
  49. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/deep-chain.yaml +0 -0
  50. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/fan-in.yaml +0 -0
  51. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/fan-out.yaml +0 -0
  52. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/linear.yaml +0 -0
  53. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/parallel-branches.yaml +0 -0
  54. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/parallel-sleep.yaml +0 -0
  55. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/skip-diamond.yaml +0 -0
  56. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/graph/wide-fan.yaml +0 -0
  57. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/hello-world.yaml +0 -0
  58. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/README.md +0 -0
  59. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/feeds-composition.yaml +0 -0
  60. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/gdacs-disaster-updates.yaml +0 -0
  61. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/github-releases-relay.yaml +0 -0
  62. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/hdx-dataset-watch.yaml +0 -0
  63. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/kobo-submissions-to-csv.yaml +0 -0
  64. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/nominatim-geocode-facilities.yaml +0 -0
  65. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/odk-central-submissions.yaml +0 -0
  66. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/open-meteo-weekly-report.yaml +0 -0
  67. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/overpass-health-facilities.yaml +0 -0
  68. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/usgs-earthquakes-alert.yaml +0 -0
  69. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/who-gho-indicators-to-parquet.yaml +0 -0
  70. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/wikidata-country-reference.yaml +0 -0
  71. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/open-data/world-bank-population-trend.yaml +0 -0
  72. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/README.md +0 -0
  73. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/concurrency-queue.yaml +0 -0
  74. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/concurrency-replace.yaml +0 -0
  75. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/concurrency-skip.yaml +0 -0
  76. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/connections-referenced-vs-carried.yaml +0 -0
  77. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/deadline-on-a-sensor.yaml +0 -0
  78. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/fan-out-continue.yaml +0 -0
  79. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/fan-out-fail-fast.yaml +0 -0
  80. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/fan-out-from-params.yaml +0 -0
  81. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/fan-out-item-wise.yaml +0 -0
  82. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/fan-out-literal-list.yaml +0 -0
  83. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/fan-out-nested-objects.yaml +0 -0
  84. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/fan-out-then-join.yaml +0 -0
  85. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/importance-critical.yaml +0 -0
  86. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/log-levels.yaml +0 -0
  87. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/outputs-inline-vs-storage.yaml +0 -0
  88. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/params-every-type.yaml +0 -0
  89. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/params-validation-refuses.yaml +0 -0
  90. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/pipeline-run-child.yaml +0 -0
  91. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/pipeline-run-fire-and-forget.yaml +0 -0
  92. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/pipeline-run-strict.yaml +0 -0
  93. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/pipeline-run-wait.yaml +0 -0
  94. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/pipeline-run-with-params.yaml +0 -0
  95. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/poll-cadence.yaml +0 -0
  96. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/priority-layered.yaml +0 -0
  97. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/references-cheat-sheet.yaml +0 -0
  98. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/retry-budget-exhausted.yaml +0 -0
  99. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/retry-exponential-backoff.yaml +0 -0
  100. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/retry-only-transient.yaml +0 -0
  101. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/retry-with-jitter.yaml +0 -0
  102. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/rule-all-done.yaml +0 -0
  103. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/rule-all-success.yaml +0 -0
  104. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/rule-always.yaml +0 -0
  105. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/rule-one-failed.yaml +0 -0
  106. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/schedule-at-once.yaml +0 -0
  107. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/schedule-cron-timezone.yaml +0 -0
  108. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/schedule-interval.yaml +0 -0
  109. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/schedule-window-half-open.yaml +0 -0
  110. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/sensor-http-ready.yaml +0 -0
  111. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/sensor-storage-exists.yaml +0 -0
  112. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/step-names-and-keys.yaml +0 -0
  113. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/timeout-fails-the-step.yaml +0 -0
  114. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/timeout-skips-the-step.yaml +0 -0
  115. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/webhook-mapping-nested-payload.yaml +0 -0
  116. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/patterns/webhook-signed.yaml +0 -0
  117. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/playground/README.md +0 -0
  118. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/playground/a-gate-catching-drift.yaml +0 -0
  119. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/playground/a-page-at-a-time.yaml +0 -0
  120. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/playground/a-stream-to-read.yaml +0 -0
  121. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/playground/generated-rows.yaml +0 -0
  122. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/playground/in-the-middle-of-a-flow.yaml +0 -0
  123. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/playground/retry-that-really-retries.yaml +0 -0
  124. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/playground/waiting-for-a-batch.yaml +0 -0
  125. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/preview/s3-parquet-to-ingestion.yaml +0 -0
  126. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/python/README.md +0 -0
  127. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/python/apply_and_run.py +0 -0
  128. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/python/ci_gate.py +0 -0
  129. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/python/connections.py +0 -0
  130. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/python/error_handling.py +0 -0
  131. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/python/follow_logs.py +0 -0
  132. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/python/list_and_filter.py +0 -0
  133. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/queues/kafka-consume-then-transform.yaml +0 -0
  134. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/queues/kafka-produce-then-consume.yaml +0 -0
  135. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/queues/rabbitmq-consume-ack-on-success.yaml +0 -0
  136. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/queues/report-to-kafka.yaml +0 -0
  137. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/queues/report-to-rabbitmq.yaml +0 -0
  138. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/README.md +0 -0
  139. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/csv-header-rules.yaml +0 -0
  140. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/csv-to-ndjson.yaml +0 -0
  141. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/etl-csv-clean-validate-parquet.yaml +0 -0
  142. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/filter-by-predicate.yaml +0 -0
  143. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/filter-then-map-then-reduce.yaml +0 -0
  144. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-fetch-validate-post.yaml +0 -0
  145. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-follow-redirects.yaml +0 -0
  146. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-get-with-query.yaml +0 -0
  147. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-headers-and-auth-connection.yaml +0 -0
  148. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-post-file-from-storage.yaml +0 -0
  149. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-post-json-body.yaml +0 -0
  150. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-post-report.yaml +0 -0
  151. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-save-body-to-storage.yaml +0 -0
  152. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-success-status-list.yaml +0 -0
  153. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/http-timeout-override.yaml +0 -0
  154. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-dedupe-by-key.yaml +0 -0
  155. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-defaults-and-nulls.yaml +0 -0
  156. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-group-by-and-sum.yaml +0 -0
  157. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-join-two-lists.yaml +0 -0
  158. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-long-to-wide.yaml +0 -0
  159. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-nested-to-flat.yaml +0 -0
  160. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-pivot-wide-to-long.yaml +0 -0
  161. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-running-totals.yaml +0 -0
  162. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-string-cleaning.yaml +0 -0
  163. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-top-n.yaml +0 -0
  164. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-validate-in-jq-vs-schema.yaml +0 -0
  165. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/jq-window-dates.yaml +0 -0
  166. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/json-to-csv-flattening.yaml +0 -0
  167. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/large-output-to-storage.yaml +0 -0
  168. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/map-enrich-with-lookup.yaml +0 -0
  169. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/ndjson-to-parquet.yaml +0 -0
  170. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/pagination-by-fan-out.yaml +0 -0
  171. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/parquet-round-trip-types.yaml +0 -0
  172. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/reconcile-two-sources.yaml +0 -0
  173. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/report-built-in.yaml +0 -0
  174. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/report-daily-digest.yaml +0 -0
  175. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/report-to-file.yaml +0 -0
  176. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/report-to-webhook.yaml +0 -0
  177. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/schema-carried.yaml +0 -0
  178. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/schema-formats.yaml +0 -0
  179. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/schema-referenced.yaml +0 -0
  180. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/schema-refuses-then-rule.yaml +0 -0
  181. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/storage-copy-dated-archive.yaml +0 -0
  182. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/storage-exists-gate.yaml +0 -0
  183. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/storage-keep-past-the-run.yaml +0 -0
  184. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/storage-manifest-of-a-fan-out.yaml +0 -0
  185. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/storage-write-then-read.yaml +0 -0
  186. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/webhook-post-hmac.yaml +0 -0
  187. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/recipes/webhook-post-summary.yaml +0 -0
  188. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/s3/README.md +0 -0
  189. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/s3/report-to-s3.yaml +0 -0
  190. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/s3/s3-copy-and-verify.yaml +0 -0
  191. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/s3/s3-csv-report.yaml +0 -0
  192. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/s3/s3-parquet-report.yaml +0 -0
  193. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/s3/s3-round-trip.yaml +0 -0
  194. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/schemas/README.md +0 -0
  195. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/schemas/ou-record.json +0 -0
  196. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/schemas/playground-reading.json +0 -0
  197. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/schemas/station-reading.json +0 -0
  198. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sensors/README.md +0 -0
  199. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sensors/sensor-gate.yaml +0 -0
  200. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sensors/time-window.yaml +0 -0
  201. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/showcase/README.md +0 -0
  202. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/showcase/morning-briefing.yaml +0 -0
  203. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/showcase/nightly-regional-load.yaml +0 -0
  204. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/showcase/one-region-refuses.yaml +0 -0
  205. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sql/README.md +0 -0
  206. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sql/duckdb-parquet-to-report.yaml +0 -0
  207. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sql/sql-postgres-readonly.yaml +0 -0
  208. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sql/sql-query-to-storage.yaml +0 -0
  209. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sql/sql-sqlite-roundtrip.yaml +0 -0
  210. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/sql/warehouse.sql +0 -0
  211. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/README.md +0 -0
  212. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/csv-report.yaml +0 -0
  213. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/jq-filter-and-map.yaml +0 -0
  214. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/jq-group-and-aggregate.yaml +0 -0
  215. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/jq-join-two-sources.yaml +0 -0
  216. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/jq-reshape.yaml +0 -0
  217. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/jq-stream-through-storage.yaml +0 -0
  218. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/ndjson-round-trip.yaml +0 -0
  219. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/parquet-round-trip.yaml +0 -0
  220. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/std-convert-fan-out.yaml +0 -0
  221. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/xml-feed-to-ndjson.yaml +0 -0
  222. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/transform/yaml-config-to-json.yaml +0 -0
  223. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/triggers/at-one-time.yaml +0 -0
  224. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/triggers/cron-nightly.yaml +0 -0
  225. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/triggers/cron-windowed.yaml +0 -0
  226. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/triggers/document-nightly.yaml +0 -0
  227. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/triggers/interval-rolling.yaml +0 -0
  228. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/triggers/managed-and-manual.yaml +0 -0
  229. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/triggers/webhook-trigger.yaml +0 -0
  230. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/validate/README.md +0 -0
  231. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/src/dirigent_examples/shelves/validate/expects-a-shape.yaml +0 -0
  232. {dirigent_examples-0.20.0 → dirigent_examples-0.21.0}/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.20.0
3
+ Version: 0.21.0
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.20.0
10
- Requires-Dist: dirigent-plugin==0.20.0
9
+ Requires-Dist: dirigent-client==0.21.0
10
+ Requires-Dist: dirigent-plugin==0.21.0
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.20.0"
3
+ version = "0.21.0"
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.20.0",
15
- "dirigent-plugin==0.20.0",
14
+ "dirigent-client==0.21.0",
15
+ "dirigent-plugin==0.21.0",
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.20.0"
3
+ version = "0.21.0"
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.20.0",
16
- "dirigent-plugin==0.20.0",
15
+ "dirigent-client==0.21.0",
16
+ "dirigent-plugin==0.21.0",
17
17
  ]
18
18
 
19
19
  [project.entry-points."dirigent.plugins.v1"]
@@ -18,7 +18,7 @@ The documents live on topic shelves, each with its own README:
18
18
  | [`failure/`](failure) | Retries, budgets, timeouts, tolerated failures, and the cleanup edge. |
19
19
  | [`transform/`](transform) | The reshaping verbs: jq programs and the `convert.std` codec, no allowlist anywhere. |
20
20
  | [`recipes/`](recipes) | One question per file: how to group, join, pivot, clean, convert, check, store, and call. |
21
- | [`triggers/`](triggers) | What starts a run on its own: the three clocks, and the inbound webhook. |
21
+ | [`triggers/`](triggers) | What starts a run on its own: the three clocks, the inbound webhook, and a watch on a sensor. |
22
22
  | [`sensors/`](sensors) | Steps that wait for the world: a drop landing, a clock window opening. |
23
23
  | [`queues/`](queues) | A run started by a message: a Kafka topic and a RabbitMQ queue, waited on as sensors. |
24
24
  | [`execute/`](execute) | Code on the worker: a shell step behind the allowlist. |
@@ -42,6 +42,7 @@ On the compose stack the brokers are the `infra/compose.brokers.yaml` overlay in
42
42
  | File | What it teaches |
43
43
  | --- | --- |
44
44
  | [kafka-consume-then-transform.yaml](kafka-consume-then-transform.yaml) | Waiting on a topic: `min_messages` and `max_messages`, why the cursor rather than a consumer group holds the offsets, and the batch read by a downstream transform. |
45
+ | [kafka-watch-then-transform.yaml](kafka-watch-then-transform.yaml) | A topic read as a stream: a watch keeps one run waiting on `kafka.consume` and starts the next from where each batch ended, with no consumer group, while every batch is reshaped in the run that took it. |
45
46
  | [kafka-produce-then-consume.yaml](kafka-produce-then-consume.yaml) | Publishing: the two shapes an element of `records` may take, where a message key comes from, what `acks: all` and an idempotent producer do and do not promise, and why this one consumes from `earliest`. |
46
47
  | [report-to-kafka.yaml](report-to-kafka.yaml) | Publishing a rendered page: `report.render` hands its text on, and `kafka.produce` puts it on the topic as one keyed record. |
47
48
  | [rabbitmq-consume-ack-on-success.yaml](rabbitmq-consume-ack-on-success.yaml) | When a message is acknowledged: why `ack: on_success` is the default, what a poke that parks does with the messages it took, and what `always` gives up in exchange. |
@@ -56,4 +57,5 @@ the state there. It replaces rather than merges, it is stored by the transaction
56
57
  attempt -- which makes advancing it at-least-once, so a poke may read the same ground twice --
57
58
  and it lives only as long as the waiting attempt, because a poke that succeeds ends the step.
58
59
  Anything a later step needs is in the output, which is why `kafka.consume` reports the offsets
59
- it ended at there.
60
+ it ended at there. A watch is the one thing that carries a cursor past a success: it stores
61
+ where the batch ended and starts its next run there.
@@ -0,0 +1,88 @@
1
+ # A topic read as a stream: a watch keeps one run waiting on it, and each batch it takes arms
2
+ # the next run from where that batch ended.
3
+ #
4
+ # NEEDS A BROKER, and a topic to read:
5
+ # docker compose -f infra/compose.queues.yaml up -d --wait
6
+ # docker exec -it dirigent-queues-redpanda-1 rpk topic create orders
7
+ # dg connection create kafka orders-topic --set bootstrap_servers='["127.0.0.1:9092"]'
8
+ # dg apply examples/queues/kafka-watch-then-transform.yaml
9
+ # Then produce to the topic in another shell, as often as you like, and watch the runs line up:
10
+ # docker exec -it dirigent-queues-redpanda-1 \
11
+ # rpk topic produce orders --format '%v\n' # then type JSON lines and press ctrl-d
12
+ # dg runs list --pipeline kafka-watch-then-transform
13
+ # On the compose stack the broker is the infra/compose.brokers.yaml overlay and the connection
14
+ # names it as `redpanda:9092`; docs/queues.md is the family's home.
15
+ #
16
+ # Two hops, and what each one hands on:
17
+ # take kafka.consume, the watched step. It parks until there is a batch, then hands on
18
+ # the messages, their count, and the offsets it ended at.
19
+ # summarise a jq transform over that batch, in the run that took it -- while the next run
20
+ # is already waiting on the topic.
21
+ #
22
+ # THE WATCH OWNS THE CURSOR, SO NO group_id. kafka.consume says where a batch ended, the watch
23
+ # stores it, and the next run's first poke reads on from exactly there. Nothing is committed
24
+ # to the broker, nothing on the cluster has to be arranged, and a second pipeline over the same
25
+ # topic still sees every message. Set a group_id as well if the broker should know how far this
26
+ # pipeline has read; the watch's cursor stays what the next run starts from.
27
+ #
28
+ # start: earliest APPLIES ONCE. It says where the very first run begins, which here is the
29
+ # oldest message the broker still holds. Every run after it starts from the watch's cursor, so
30
+ # nothing is replayed and nothing is skipped between two runs.
31
+ #
32
+ # NO deadline. A watched sensor waits as long as the topic is quiet, and that costs a row with a
33
+ # due time, not a worker. `dg watch pause kafka-watch-then-transform follow` stops it, cancelling
34
+ # the run that is waiting and keeping the cursor for `dg watch resume`.
35
+ #
36
+ # READING THE SAME GROUND TWICE. The cursor is stored by the transaction that settles the
37
+ # batch, so a worker that dies before that commit leaves the older offsets behind and the next
38
+ # poke reads those messages again. A step that must not act twice on a message makes itself
39
+ # idempotent; this one only reshapes, so it does not care.
40
+ #
41
+ # TO MAKE IT YOURS: point the connection at your own cluster, change the topic, and replace the
42
+ # summarise step with whatever consumes the batch.
43
+
44
+ format: dirigent/v1
45
+ kind: pipeline
46
+ code: kafka-watch-then-transform
47
+ name: Watch a Kafka topic, then transform each batch
48
+ description: |
49
+ A watch on kafka.consume reads a topic run after run from where the last batch ended, with
50
+ no consumer group, and each batch is reshaped in the run that took it.
51
+
52
+ tags: [queues, kafka, sensor, transform, triggers]
53
+
54
+ requires:
55
+ blocks:
56
+ - kafka.consume
57
+ - transform.jq
58
+ connections:
59
+ - orders-topic
60
+
61
+ steps:
62
+ take:
63
+ block: kafka.consume
64
+ poll: 5s
65
+ config:
66
+ connection: orders-topic
67
+ topic: orders
68
+ min_messages: 1
69
+ # Bounds what one run carries: a burst of a thousand messages becomes ten runs of a
70
+ # hundred, each summarised on its own while the next one is taken.
71
+ max_messages: 100
72
+ start: earliest
73
+ value_format: json
74
+
75
+ summarise:
76
+ block: transform.jq
77
+ depends_on: [take]
78
+ config:
79
+ input: ${steps.take.output}
80
+ program: >-
81
+ {count: .count, first_offset: (.messages | map(.offset) | min),
82
+ last_offset: (.messages | map(.offset) | max), resume_from: .cursor}
83
+
84
+ triggers:
85
+ watches:
86
+ - code: follow
87
+ name: Follow the orders
88
+ step: take
@@ -1,10 +1,10 @@
1
1
  # Trigger examples
2
2
 
3
- What starts a run on its own: a clock, or an inbound webhook. A trigger is declared in the
4
- document and materialised by `dg apply`; the scheduler fires the clocks and the server
5
- answers the hooks, on the instance the document was applied to. Operational state -- paused,
6
- last fired, the firing and delivery history -- stays in the instance, so none of it appears
7
- in these files. [docs/design.md](../../docs/design.md#the-misfire-policy) is the page behind
3
+ What starts a run on its own: a clock, an inbound webhook, or a watch. A trigger is declared
4
+ in the document and materialised by `dg apply`; the scheduler fires the clocks, the server
5
+ answers the hooks, and a watch keeps a run waiting on its sensor, on the instance the document
6
+ was applied to. Operational state -- paused, last fired, the firing and delivery history, the
7
+ cursor a watch holds -- stays in the instance, so none of it appears in these files. [docs/design.md](../../docs/design.md#the-misfire-policy) is the page behind
8
8
  the clocks.
9
9
 
10
10
  Each file is prefixed with the clock kind it teaches, the way `transform/`'s files are
@@ -34,6 +34,7 @@ dg run --local examples/triggers/cron-windowed.yaml --window 2026-06-01..2026-06
34
34
  | [managed-and-manual.yaml](managed-and-manual.yaml) | Against a real instance: what an apply materialises, what it removes, and the hand-made schedule it leaves alone. |
35
35
  | [document-nightly.yaml](document-nightly.yaml) | A `kind: triggers` document: clocks for a pipeline defined elsewhere, owning its own rows and refusing a pipeline no instance holds. |
36
36
  | [webhook-trigger.yaml](webhook-trigger.yaml) | The inbound trigger: a token minted at apply, a strict payload-to-parameter mapping, and everything else in the POST ignored. |
37
+ | [watch-a-sensor.yaml](watch-a-sensor.yaml) | A watch: one run always waiting on `playground.arrive`, the next armed the moment a batch arrives, the runs overlapping and the offsets carrying on from batch to batch. |
37
38
 
38
39
  A pipeline carries as many schedules as it needs, each with its own zone and its own
39
40
  parameters: nightly against production and hourly against staging is two schedules on one
@@ -0,0 +1,85 @@
1
+ # A sensor made a continuous source: one run always waiting on it, the next armed the moment
2
+ # it succeeds.
3
+ #
4
+ # A schedule starts a run at a moment and a webhook when somebody calls. A watch starts one
5
+ # whenever the last one has what it was waiting for: it keeps exactly one run of this pipeline
6
+ # waiting on the `arrive` step, and the transaction that settles that step's success arms the
7
+ # next run. The run that succeeded carries on downstream while the next one waits, so the runs
8
+ # overlap -- batch N is being summarised while batch N+1 is being waited for -- and the run list
9
+ # fills the way a topic being consumed does. Nothing here needs a network or an allowlist:
10
+ #
11
+ # dg apply examples/triggers/watch-a-sensor.yaml
12
+ # dg watch list watch-a-sensor # the run it has waiting, and where it left off
13
+ # dg runs list --pipeline watch-a-sensor # a new run every five seconds or so
14
+ # dg watch pause watch-a-sensor follow # cancels the waiting run, keeps the cursor
15
+ # dg watch resume watch-a-sensor follow # arms a run that reads on from there
16
+ #
17
+ # `dg run --local` runs the pipeline once, as an ordinary run: a throwaway instance runs the
18
+ # one run it was asked for, so the watch lands paused there.
19
+ #
20
+ # Hop by hop:
21
+ #
22
+ # arrive playground.arrive, parked for five seconds, then a batch of three generated
23
+ # readings. Under the watch its offsets carry on from the batch before: the
24
+ # first run's are 0 to 2, the next run's 3 to 5, and so on.
25
+ # summarise a jq transform over the batch, which reads it the way a step downstream of a
26
+ # topic would: how many, and the first and last offset.
27
+ #
28
+ # THE WATCH OWNS THE CURSOR. playground.arrive says where a batch ended, and the watch stores
29
+ # that and hands it to the next run's first poke. kafka.consume does the same with its
30
+ # offsets, which is how a watched topic is read on without a consumer group:
31
+ # examples/queues/kafka-watch-then-transform.yaml is the same shape against a real broker.
32
+ #
33
+ # A WAIT THAT FAILS BACKS OFF. Were `arrive` to fail after its retries, the watch would record
34
+ # why (`dg watch show watch-a-sensor follow` reads it as last_error) and arm again after five
35
+ # seconds, doubling up to five minutes, from the last cursor a success stored. A deadline
36
+ # that ran out under on_timeout: skip found nothing, which is no failure: it arms at once.
37
+
38
+ format: dirigent/v1
39
+ kind: pipeline
40
+ code: watch-a-sensor
41
+ name: Watch a sensor
42
+ description: |
43
+ A watch keeps one run waiting on a generated batch and arms the next the moment it
44
+ arrives, so the runs overlap and the offsets carry on from one batch to the next.
45
+
46
+ tags: [triggers, playground, sensor, jq, starter]
47
+
48
+ requires:
49
+ blocks:
50
+ - playground.arrive
51
+ - transform.jq
52
+
53
+ steps:
54
+ arrive:
55
+ block: playground.arrive
56
+ # A watch waits on a root step, one that depends on nothing, and on a sensor: the watch
57
+ # is refused at apply otherwise.
58
+ poll: 1s
59
+ deadline: 1m
60
+ config:
61
+ # Five seconds from when the attempt started, so a new batch lands every five seconds
62
+ # or so. after_pokes is zero because the clock is what this wait is about.
63
+ after: 5s
64
+ after_pokes: 0
65
+ rows: 3
66
+ fields:
67
+ station: city
68
+ reading: pyfloat
69
+
70
+ summarise:
71
+ block: transform.jq
72
+ depends_on: [arrive]
73
+ config:
74
+ input: ${steps.arrive.output}
75
+ program: >-
76
+ {count: .count, first_offset: .messages[0].offset,
77
+ last_offset: .messages[-1].offset, next_offset: .next_offset}
78
+
79
+ triggers:
80
+ watches:
81
+ - code: follow
82
+ name: Follow the arrivals
83
+ # The step every armed run waits on. Its success arms the next run; everything
84
+ # downstream of it runs in the run that succeeded.
85
+ step: arrive