dirigent-examples 0.18.4__tar.gz → 0.19.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 (228) hide show
  1. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/PKG-INFO +3 -3
  2. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/pyproject.toml +3 -3
  3. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/pyproject.toml.orig +3 -3
  4. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/README.md +1 -0
  5. dirigent_examples-0.19.0/src/dirigent_examples/shelves/playground/README.md +42 -0
  6. dirigent_examples-0.19.0/src/dirigent_examples/shelves/playground/a-gate-catching-drift.yaml +98 -0
  7. dirigent_examples-0.19.0/src/dirigent_examples/shelves/playground/a-page-at-a-time.yaml +90 -0
  8. dirigent_examples-0.19.0/src/dirigent_examples/shelves/playground/generated-rows.yaml +80 -0
  9. dirigent_examples-0.19.0/src/dirigent_examples/shelves/playground/in-the-middle-of-a-flow.yaml +73 -0
  10. dirigent_examples-0.19.0/src/dirigent_examples/shelves/playground/retry-that-really-retries.yaml +80 -0
  11. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/LICENSE +0 -0
  12. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/README.md +0 -0
  13. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/__init__.py +0 -0
  14. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/py.typed +0 -0
  15. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/composition/README.md +0 -0
  16. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/composition/chained-instances.yaml +0 -0
  17. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/composition/composition-child.yaml +0 -0
  18. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/composition/composition-parent.yaml +0 -0
  19. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/connections.yaml +0 -0
  20. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/demo/README.md +0 -0
  21. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/demo/markdown-showcase.yaml +0 -0
  22. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/demo/params-showcase.yaml +0 -0
  23. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/demo/requires.yaml +0 -0
  24. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/demo/weekly-import-malawi.yaml +0 -0
  25. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/demo/weekly-import-nepal.yaml +0 -0
  26. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/README.md +0 -0
  27. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-build-push.yaml +0 -0
  28. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-build-run.yaml +0 -0
  29. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-compose-database.yaml +0 -0
  30. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-compose-failing-up.yaml +0 -0
  31. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-compose-file.yaml +0 -0
  32. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-compose-profiles-env.yaml +0 -0
  33. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-compose-stack.yaml +0 -0
  34. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-hello.yaml +0 -0
  35. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-remote-daemon.yaml +0 -0
  36. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-run-failing-teardown.yaml +0 -0
  37. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/docker/docker-ticker.yaml +0 -0
  38. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/execute/README.md +0 -0
  39. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/execute/long-log.yaml +0 -0
  40. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/failure/README.md +0 -0
  41. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/failure/error-handler.yaml +0 -0
  42. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/failure/optional-step.yaml +0 -0
  43. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/failure/retries.yaml +0 -0
  44. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/failure/retry-budget.yaml +0 -0
  45. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/failure/step-timeout.yaml +0 -0
  46. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/git/README.md +0 -0
  47. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/git/git-checkout-build.yaml +0 -0
  48. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/git/git-checkout-compose.yaml +0 -0
  49. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/git/git-checkout-public.yaml +0 -0
  50. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/README.md +0 -0
  51. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/deep-chain.yaml +0 -0
  52. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/fan-in.yaml +0 -0
  53. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/fan-out.yaml +0 -0
  54. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/linear.yaml +0 -0
  55. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/parallel-branches.yaml +0 -0
  56. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/parallel-sleep.yaml +0 -0
  57. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/skip-diamond.yaml +0 -0
  58. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/graph/wide-fan.yaml +0 -0
  59. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/hello-world.yaml +0 -0
  60. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/README.md +0 -0
  61. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/feeds-composition.yaml +0 -0
  62. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/gdacs-disaster-updates.yaml +0 -0
  63. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/github-releases-relay.yaml +0 -0
  64. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/hdx-dataset-watch.yaml +0 -0
  65. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/kobo-submissions-to-csv.yaml +0 -0
  66. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/nominatim-geocode-facilities.yaml +0 -0
  67. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/odk-central-submissions.yaml +0 -0
  68. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/open-meteo-weekly-report.yaml +0 -0
  69. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/overpass-health-facilities.yaml +0 -0
  70. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/usgs-earthquakes-alert.yaml +0 -0
  71. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/who-gho-indicators-to-parquet.yaml +0 -0
  72. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/wikidata-country-reference.yaml +0 -0
  73. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/open-data/world-bank-population-trend.yaml +0 -0
  74. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/README.md +0 -0
  75. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/concurrency-queue.yaml +0 -0
  76. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/concurrency-replace.yaml +0 -0
  77. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/concurrency-skip.yaml +0 -0
  78. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/connections-referenced-vs-carried.yaml +0 -0
  79. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/deadline-on-a-sensor.yaml +0 -0
  80. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/fan-out-continue.yaml +0 -0
  81. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/fan-out-fail-fast.yaml +0 -0
  82. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/fan-out-from-params.yaml +0 -0
  83. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/fan-out-item-wise.yaml +0 -0
  84. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/fan-out-literal-list.yaml +0 -0
  85. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/fan-out-nested-objects.yaml +0 -0
  86. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/fan-out-then-join.yaml +0 -0
  87. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/importance-critical.yaml +0 -0
  88. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/log-levels.yaml +0 -0
  89. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/outputs-inline-vs-storage.yaml +0 -0
  90. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/params-every-type.yaml +0 -0
  91. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/params-validation-refuses.yaml +0 -0
  92. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/pipeline-run-child.yaml +0 -0
  93. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/pipeline-run-fire-and-forget.yaml +0 -0
  94. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/pipeline-run-strict.yaml +0 -0
  95. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/pipeline-run-wait.yaml +0 -0
  96. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/pipeline-run-with-params.yaml +0 -0
  97. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/poll-cadence.yaml +0 -0
  98. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/priority-layered.yaml +0 -0
  99. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/references-cheat-sheet.yaml +0 -0
  100. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/retry-budget-exhausted.yaml +0 -0
  101. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/retry-exponential-backoff.yaml +0 -0
  102. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/retry-only-transient.yaml +0 -0
  103. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/retry-with-jitter.yaml +0 -0
  104. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/rule-all-done.yaml +0 -0
  105. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/rule-all-success.yaml +0 -0
  106. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/rule-always.yaml +0 -0
  107. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/rule-one-failed.yaml +0 -0
  108. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/schedule-at-once.yaml +0 -0
  109. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/schedule-cron-timezone.yaml +0 -0
  110. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/schedule-interval.yaml +0 -0
  111. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/schedule-window-half-open.yaml +0 -0
  112. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/sensor-http-ready.yaml +0 -0
  113. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/sensor-storage-exists.yaml +0 -0
  114. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/step-names-and-keys.yaml +0 -0
  115. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/timeout-fails-the-step.yaml +0 -0
  116. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/timeout-skips-the-step.yaml +0 -0
  117. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/webhook-mapping-nested-payload.yaml +0 -0
  118. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/patterns/webhook-signed.yaml +0 -0
  119. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/preview/s3-parquet-to-ingestion.yaml +0 -0
  120. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/python/README.md +0 -0
  121. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/python/apply_and_run.py +0 -0
  122. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/python/ci_gate.py +0 -0
  123. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/python/connections.py +0 -0
  124. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/python/error_handling.py +0 -0
  125. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/python/follow_logs.py +0 -0
  126. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/python/list_and_filter.py +0 -0
  127. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/queues/README.md +0 -0
  128. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/queues/kafka-consume-then-transform.yaml +0 -0
  129. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/queues/kafka-produce-then-consume.yaml +0 -0
  130. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/queues/rabbitmq-consume-ack-on-success.yaml +0 -0
  131. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/queues/report-to-kafka.yaml +0 -0
  132. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/queues/report-to-rabbitmq.yaml +0 -0
  133. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/README.md +0 -0
  134. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/csv-header-rules.yaml +0 -0
  135. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/csv-to-ndjson.yaml +0 -0
  136. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/etl-csv-clean-validate-parquet.yaml +0 -0
  137. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/filter-by-predicate.yaml +0 -0
  138. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/filter-then-map-then-reduce.yaml +0 -0
  139. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-fetch-validate-post.yaml +0 -0
  140. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-follow-redirects.yaml +0 -0
  141. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-get-with-query.yaml +0 -0
  142. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-headers-and-auth-connection.yaml +0 -0
  143. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-post-file-from-storage.yaml +0 -0
  144. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-post-json-echo.yaml +0 -0
  145. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-post-report.yaml +0 -0
  146. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-save-body-to-storage.yaml +0 -0
  147. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-success-status-list.yaml +0 -0
  148. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/http-timeout-override.yaml +0 -0
  149. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-dedupe-by-key.yaml +0 -0
  150. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-defaults-and-nulls.yaml +0 -0
  151. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-group-by-and-sum.yaml +0 -0
  152. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-join-two-lists.yaml +0 -0
  153. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-long-to-wide.yaml +0 -0
  154. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-nested-to-flat.yaml +0 -0
  155. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-pivot-wide-to-long.yaml +0 -0
  156. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-running-totals.yaml +0 -0
  157. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-string-cleaning.yaml +0 -0
  158. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-top-n.yaml +0 -0
  159. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-validate-in-jq-vs-schema.yaml +0 -0
  160. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/jq-window-dates.yaml +0 -0
  161. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/json-to-csv-flattening.yaml +0 -0
  162. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/large-output-to-storage.yaml +0 -0
  163. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/map-enrich-with-lookup.yaml +0 -0
  164. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/ndjson-to-parquet.yaml +0 -0
  165. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/pagination-by-fan-out.yaml +0 -0
  166. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/parquet-round-trip-types.yaml +0 -0
  167. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/reconcile-two-sources.yaml +0 -0
  168. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/report-built-in.yaml +0 -0
  169. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/report-daily-digest.yaml +0 -0
  170. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/report-to-file.yaml +0 -0
  171. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/report-to-webhook.yaml +0 -0
  172. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/schema-carried.yaml +0 -0
  173. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/schema-formats.yaml +0 -0
  174. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/schema-referenced.yaml +0 -0
  175. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/schema-refuses-then-rule.yaml +0 -0
  176. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/storage-copy-dated-archive.yaml +0 -0
  177. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/storage-exists-gate.yaml +0 -0
  178. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/storage-keep-past-the-run.yaml +0 -0
  179. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/storage-manifest-of-a-fan-out.yaml +0 -0
  180. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/storage-write-then-read.yaml +0 -0
  181. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/webhook-post-hmac.yaml +0 -0
  182. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/recipes/webhook-post-summary.yaml +0 -0
  183. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/s3/README.md +0 -0
  184. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/s3/report-to-s3.yaml +0 -0
  185. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/s3/s3-copy-and-verify.yaml +0 -0
  186. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/s3/s3-csv-report.yaml +0 -0
  187. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/s3/s3-parquet-report.yaml +0 -0
  188. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/s3/s3-round-trip.yaml +0 -0
  189. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/schemas/README.md +0 -0
  190. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/schemas/echo-reading.json +0 -0
  191. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/schemas/ou-record.json +0 -0
  192. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/schemas/station-reading.json +0 -0
  193. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sensors/README.md +0 -0
  194. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sensors/sensor-gate.yaml +0 -0
  195. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sensors/time-window.yaml +0 -0
  196. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/showcase/README.md +0 -0
  197. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/showcase/morning-briefing.yaml +0 -0
  198. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/showcase/nightly-regional-load.yaml +0 -0
  199. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/showcase/one-region-refuses.yaml +0 -0
  200. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sql/README.md +0 -0
  201. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sql/duckdb-parquet-to-report.yaml +0 -0
  202. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sql/sql-postgres-readonly.yaml +0 -0
  203. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sql/sql-query-to-storage.yaml +0 -0
  204. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sql/sql-sqlite-roundtrip.yaml +0 -0
  205. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/sql/warehouse.sql +0 -0
  206. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/README.md +0 -0
  207. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/csv-report.yaml +0 -0
  208. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/jq-filter-and-map.yaml +0 -0
  209. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/jq-group-and-aggregate.yaml +0 -0
  210. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/jq-join-two-sources.yaml +0 -0
  211. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/jq-reshape.yaml +0 -0
  212. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/jq-stream-through-storage.yaml +0 -0
  213. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/ndjson-round-trip.yaml +0 -0
  214. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/parquet-round-trip.yaml +0 -0
  215. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/std-convert-fan-out.yaml +0 -0
  216. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/xml-feed-to-ndjson.yaml +0 -0
  217. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/transform/yaml-config-to-json.yaml +0 -0
  218. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/triggers/README.md +0 -0
  219. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/triggers/at-one-time.yaml +0 -0
  220. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/triggers/cron-nightly.yaml +0 -0
  221. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/triggers/cron-windowed.yaml +0 -0
  222. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/triggers/document-nightly.yaml +0 -0
  223. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/triggers/interval-rolling.yaml +0 -0
  224. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/triggers/managed-and-manual.yaml +0 -0
  225. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/triggers/webhook-trigger.yaml +0 -0
  226. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/validate/README.md +0 -0
  227. {dirigent_examples-0.18.4 → dirigent_examples-0.19.0}/src/dirigent_examples/shelves/validate/expects-a-shape.yaml +0 -0
  228. {dirigent_examples-0.18.4 → dirigent_examples-0.19.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.18.4
3
+ Version: 0.19.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.18.4
10
- Requires-Dist: dirigent-plugin==0.18.4
9
+ Requires-Dist: dirigent-client==0.19.0
10
+ Requires-Dist: dirigent-plugin==0.19.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.18.4"
3
+ version = "0.19.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.18.4",
15
- "dirigent-plugin==0.18.4",
14
+ "dirigent-client==0.19.0",
15
+ "dirigent-plugin==0.19.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.18.4"
3
+ version = "0.19.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.18.4",
16
- "dirigent-plugin==0.18.4",
15
+ "dirigent-client==0.19.0",
16
+ "dirigent-plugin==0.19.0",
17
17
  ]
18
18
 
19
19
  [project.entry-points."dirigent.plugins.v1"]
@@ -14,6 +14,7 @@ The documents live on topic shelves, each with its own README:
14
14
  | --- | --- |
15
15
  | [`graph/`](graph) | The shapes a DAG takes: lines, branches, fans, joins, and skips. |
16
16
  | [`patterns/`](patterns) | One engine behaviour per file: rules, retries, the two clocks, item policies, triggers, concurrency, and the reference language. |
17
+ | [`playground/`](playground) | Documents that need something to happen: generated rows, a step that fails twice, a shape that drifts, a page to walk. |
17
18
  | [`failure/`](failure) | Retries, budgets, timeouts, tolerated failures, and the cleanup edge. |
18
19
  | [`transform/`](transform) | The reshaping verbs: jq programs and the `convert.std` codec, no allowlist anywhere. |
19
20
  | [`recipes/`](recipes) | One question per file: how to group, join, pivot, clean, convert, check, store, and call. |
@@ -0,0 +1,42 @@
1
+ # Playground examples
2
+
3
+ Documents that need something to *happen*, not something to call. `playground.generate` is a
4
+ node like any other: it takes an optional `input`, it emits an output, and it works at the
5
+ start of a flow, in the middle of one, or as its last step. It reaches nothing -- no
6
+ connection, no URL, no network, no file -- so a document here runs offline and runs the same
7
+ on every machine.
8
+
9
+ The knobs are what make it worth having. A fan-out needs a list to walk, a retry needs a step
10
+ that fails twice, a gate needs a shape that drifts, and an outputs-to-storage example needs a
11
+ payload over the threshold. Each of those is a knob rather than a contrivance:
12
+
13
+ | Knob | What it does |
14
+ | --- | --- |
15
+ | `fields` | Which Faker provider fills each output field. Any provider the installed Faker has. |
16
+ | `rows`, `locale`, `seed` | How many records, in which locale, from which seed. |
17
+ | `page`, `size` | Hand back one page of the records, and say how many pages there are. |
18
+ | `drift` | Emit a deliberately wrong shape: `strings`, `missing` or `extra`. |
19
+ | `payload` | Filler of a chosen size, to push an output past the inline limit. |
20
+ | `delay` | Take that long before answering, for a timeout or a deadline. |
21
+ | `fail_until` | Fail that many attempts before succeeding, for a retry. |
22
+ | `input` | A value from upstream to work from; absent, the knobs generate one. |
23
+
24
+ **Everything is seeded.** The same seed gives the same records on every run, which is what
25
+ lets a document here assert on what came out. With no seed the node draws one and reports it,
26
+ so a surprising answer can still be reproduced.
27
+
28
+ **The provider names are Faker's.** A reader cannot guess 280 of them, and a list pasted into
29
+ a page rots. `uv run faker` prints every provider the installed Faker offers with a sample of
30
+ each, and `uv run faker -l no_NO` prints them for one locale.
31
+
32
+ A document that is teaching HTTP itself -- a request with headers and a query, a status a
33
+ client has to handle, a redirect, a delay against a timeout -- wants a real HTTP hop instead,
34
+ and the instance serves one under `/api/v1/playground`.
35
+
36
+ | File | What it demonstrates |
37
+ | --- | --- |
38
+ | [generated-rows.yaml](generated-rows.yaml) | The lead case: a first step with no input, a field map, a row count and a seed. |
39
+ | [retry-that-really-retries.yaml](retry-that-really-retries.yaml) | `fail_until` reads the engine's attempt number, so the step really fails twice and really recovers. |
40
+ | [a-gate-catching-drift.yaml](a-gate-catching-drift.yaml) | `drift` makes the shape wrong on demand, so `validate.schema` is seen refusing it. |
41
+ | [a-page-at-a-time.yaml](a-page-at-a-time.yaml) | `page`/`size` give a fan-out a real page to walk, and `payload` pushes the output out to storage. |
42
+ | [in-the-middle-of-a-flow.yaml](in-the-middle-of-a-flow.yaml) | The node with an `input` from upstream, and again as the document's last step. |
@@ -0,0 +1,98 @@
1
+ # A schema gate seen catching something, because the shape drifts on demand.
2
+ #
3
+ # A gate example is only convincing if the reader sees it refuse. `drift` makes the node emit
4
+ # a shape that is deliberately wrong, in one of three documented ways:
5
+ #
6
+ # strings every number and boolean comes back as a string a typed schema refuses it
7
+ # missing the field map's first field is left out a required-field schema refuses it
8
+ # extra a field the map never named is added a closed schema refuses it
9
+ #
10
+ # The schema is carried in this document's own `schemas:` section, so `dg run --local` runs
11
+ # the file alone. A server refuses a carried schema, and an instance names one instead.
12
+ #
13
+ # Hop by hop:
14
+ #
15
+ # reading three records: a station code and a numeric value each, drifted or not.
16
+ # gate validate.schema against `reading-records`. Passes the value through when it
17
+ # fits, and fails the run naming the path when it does not.
18
+ # report reads the gate's output, so the graph records that it saw a checked shape.
19
+ #
20
+ # EXPECT THIS RUN TO END completed with the default, and failed with any other drift. Read
21
+ # the gate's error on a failure: it names the path into the payload that is wrong.
22
+ #
23
+ # dg run --local examples/playground/a-gate-catching-drift.yaml # completed
24
+ # dg run --local examples/playground/a-gate-catching-drift.yaml -p drift=strings # fails at the gate
25
+ # dg run --local examples/playground/a-gate-catching-drift.yaml -p drift=missing # fails at the gate
26
+
27
+ format: dirigent/v1
28
+ kind: pipeline
29
+ code: a-gate-catching-drift
30
+ name: A gate catching drift
31
+ description: |
32
+ Generated records against a carried JSON Schema, with a knob that makes the shape wrong.
33
+
34
+ The gate passes good records through and refuses drifted ones, naming the path.
35
+
36
+ tags: [playground, validate, transform, jq, params]
37
+
38
+ requires:
39
+ blocks:
40
+ - playground.generate
41
+ - validate.schema
42
+ - transform.jq
43
+
44
+ params:
45
+ type: object
46
+ properties:
47
+ drift:
48
+ type: string
49
+ description: How the generated records depart from the shape the gate expects.
50
+ default: none
51
+ enum: [none, strings, missing, extra]
52
+
53
+ schemas:
54
+ reading-records:
55
+ $schema: https://json-schema.org/draft/2020-12/schema
56
+ title: A page of station readings
57
+ type: array
58
+ items:
59
+ type: object
60
+ # Closed, so the `extra` drift is refused as well as the other two.
61
+ additionalProperties: false
62
+ required: [station, value]
63
+ properties:
64
+ station:
65
+ type: string
66
+ value:
67
+ type: number
68
+
69
+ steps:
70
+ reading:
71
+ block: playground.generate
72
+ config:
73
+ rows: 3
74
+ seed: 11
75
+ drift: ${params.drift}
76
+ fields:
77
+ # `station` is the map's first field, so it is the one the `missing` drift leaves out.
78
+ station: license_plate
79
+ value:
80
+ provider: pyfloat
81
+ args:
82
+ min_value: 0
83
+ max_value: 40
84
+ right_digits: 1
85
+
86
+ gate:
87
+ block: validate.schema
88
+ depends_on: [reading]
89
+ config:
90
+ input: ${steps.reading.output.records}
91
+ schema: reading-records
92
+
93
+ report:
94
+ block: transform.jq
95
+ depends_on: [gate]
96
+ config:
97
+ input: ${steps.gate.output.value}
98
+ program: '{checked: length}'
@@ -0,0 +1,90 @@
1
+ # A fan-out with something real to walk, and an output large enough to leave the database.
2
+ #
3
+ # Two things a document usually has to contrive, both knobs here:
4
+ #
5
+ # page / size the node holds `rows` records and hands back one page of them, saying how
6
+ # many pages there are, so a fan-out walks a page instead of a list somebody
7
+ # typed into the file.
8
+ # payload filler of a chosen size beside the records. An output at or under
9
+ # `inline_artifact_max` (16KB by default) is stored inline in the database,
10
+ # and one above it is written to storage and referenced -- so asking for 32KB
11
+ # crosses that threshold on purpose rather than by accident.
12
+ #
13
+ # Hop by hop:
14
+ #
15
+ # page_two records 11 to 20 of a hundred, and 32KB of filler beside them, which is what
16
+ # pushes this step's output out to storage.
17
+ # per_row one map.jq element per record on the page: a fan-out over a real page.
18
+ # totals what the page was, read off the node's own output rather than counted again.
19
+ #
20
+ # EXPECT THIS RUN TO END completed. Read `page_two`'s output in `dg runs show`: `pages: 10`,
21
+ # `page: 2`, ten records, and `payload_bytes: 32768`. The artifact it wrote is in the run's
22
+ # artifact list, because the output was too large to inline.
23
+ #
24
+ # To change it: -p payload=1kb keeps the output inline, so the same document shows both sides
25
+ # of the threshold.
26
+ #
27
+ # dg run --local examples/playground/a-page-at-a-time.yaml
28
+ # dg run --local examples/playground/a-page-at-a-time.yaml -p payload=1kb
29
+
30
+ format: dirigent/v1
31
+ kind: pipeline
32
+ code: a-page-at-a-time
33
+ name: A page at a time, and an output over the threshold
34
+ description: |
35
+ One page of a generated hundred, walked element by element, with filler that pushes the
36
+ step's output past the inline limit and out to storage.
37
+
38
+ tags: [playground, transform, jq, map, fan-out, outputs]
39
+
40
+ requires:
41
+ blocks:
42
+ - playground.generate
43
+ - map.jq
44
+ - transform.jq
45
+
46
+ params:
47
+ type: object
48
+ properties:
49
+ page:
50
+ type: integer
51
+ description: Which page of the hundred records to fetch.
52
+ default: 2
53
+ minimum: 1
54
+ maximum: 10
55
+ payload:
56
+ type: string
57
+ description: How much filler to return beside the records; 32kb crosses the inline limit.
58
+ default: 32kb
59
+
60
+ steps:
61
+ page_two:
62
+ block: playground.generate
63
+ config:
64
+ rows: 100
65
+ size: 10
66
+ page: ${params.page}
67
+ seed: 5
68
+ payload: ${params.payload}
69
+ fields:
70
+ who: name
71
+ company: company
72
+
73
+ per_row:
74
+ block: map.jq
75
+ depends_on: [page_two]
76
+ config:
77
+ input: ${steps.page_two.output.records}
78
+ program: '{who: .who, at: .company}'
79
+
80
+ totals:
81
+ block: transform.jq
82
+ depends_on: [page_two, per_row]
83
+ config:
84
+ input:
85
+ page: ${steps.page_two.output.page}
86
+ pages: ${steps.page_two.output.pages}
87
+ rows: ${steps.page_two.output.rows}
88
+ payload_bytes: ${steps.page_two.output.payload_bytes}
89
+ mapped: ${steps.per_row.output.value}
90
+ program: '{page: .page, of: .pages, from: .rows, filler_bytes: .payload_bytes, mapped: (.mapped | length)}'
@@ -0,0 +1,80 @@
1
+ # A document's first step, with nothing upstream and nothing to call.
2
+ #
3
+ # playground.generate is the node for a document that needs something to happen rather than
4
+ # something to call: no connection, no URL, no network. Its field map names a Faker provider
5
+ # per output field, so `who: name` fills `who` from Faker's `name` provider. Every provider
6
+ # the installed Faker has is reachable; `uv run faker` prints them all with a sample each,
7
+ # and `uv run faker -l no_NO` prints them for one locale.
8
+ #
9
+ # The seed is what makes an example verifiable: the same seed gives the same rows on every
10
+ # run, on every machine. Leave it out and the node draws one, and its output says which --
11
+ # so a surprising answer can still be reproduced by sending that number back.
12
+ #
13
+ # Hop by hop:
14
+ #
15
+ # people five rows of three fields, seeded, so the run is reproducible.
16
+ # shape a jq program over what came out, to show the rows are ordinary data.
17
+ #
18
+ # EXPECT THIS RUN TO END completed, at once. Read `people`'s output: `records` is the rows,
19
+ # and `seed`, `locale`, `rows` and `fields` beside them are the knobs that produced them.
20
+ #
21
+ # To change it: -p seed=99 for different rows, -p rows=50 for more of them, and
22
+ # -p locale=no_NO for Norwegian names and cities.
23
+ #
24
+ # dg run --local examples/playground/generated-rows.yaml
25
+ # dg run --local examples/playground/generated-rows.yaml -p locale=no_NO
26
+
27
+ format: dirigent/v1
28
+ kind: pipeline
29
+ code: generated-rows
30
+ name: Generated rows, from nothing
31
+ description: |
32
+ A first step that needs no input: a field map of Faker providers, a row count and a seed.
33
+
34
+ The same seed gives the same rows every run, which is what lets an example assert on them.
35
+
36
+ tags: [playground, transform, jq, params]
37
+
38
+ requires:
39
+ blocks:
40
+ - playground.generate
41
+ - transform.jq
42
+
43
+ params:
44
+ type: object
45
+ properties:
46
+ rows:
47
+ type: integer
48
+ description: How many records to generate.
49
+ default: 5
50
+ minimum: 1
51
+ maximum: 50
52
+ seed:
53
+ type: integer
54
+ description: The seed the records come from; the same seed gives the same records.
55
+ default: 42
56
+ locale:
57
+ type: string
58
+ description: The Faker locale the providers generate in.
59
+ default: en_US
60
+ enum: [en_US, no_NO, fr_FR, de_DE]
61
+
62
+ steps:
63
+ people:
64
+ block: playground.generate
65
+ config:
66
+ rows: ${params.rows}
67
+ seed: ${params.seed}
68
+ locale: ${params.locale}
69
+ # A provider name per field. The field names are ours; the provider names are Faker's.
70
+ fields:
71
+ who: name
72
+ where: city
73
+ when: date_this_decade
74
+
75
+ shape:
76
+ block: transform.jq
77
+ depends_on: [people]
78
+ config:
79
+ input: ${steps.people.output.records}
80
+ program: "{count: length, first: .[0].who, cities: [.[].where] | unique | length}"
@@ -0,0 +1,73 @@
1
+ # The node in the middle of a document, and at the end of it.
2
+ #
3
+ # The node takes an `input` the same way every transform does: a value written inline or
4
+ # referenced from an earlier step. What it does with one is decided by a single rule -- the
5
+ # input is the data, so it says how many records there are and `rows` is not consulted, and
6
+ # the field map adds columns to each element only when the document names one.
7
+ #
8
+ # an input and no `fields` the elements pass through unchanged
9
+ # an input and a `fields` map each element gains those generated columns
10
+ # no input at all the knobs generate the records, as in generated-rows.yaml
11
+ #
12
+ # Hop by hop:
13
+ #
14
+ # codes a plain list, standing in for whatever a real upstream step produced.
15
+ # enriched the node in the middle: three codes in, three enriched records out, each with
16
+ # a generated contact on it. `rows: 99` is written on purpose, to show that a
17
+ # supplied input wins and the output reports `rows: 3`.
18
+ # audited the node at the end: it takes the enriched records, adds nothing, and is the
19
+ # document's last step. A node is useful as a terminus because its output is
20
+ # the account of what happened -- the seed, the knobs, and the records.
21
+ #
22
+ # EXPECT THIS RUN TO END completed. Read `enriched`'s output: `rows: 3`, `input_rows: 3`, and
23
+ # the three codes with a name and an email added to each.
24
+ #
25
+ # dg run --local examples/playground/in-the-middle-of-a-flow.yaml
26
+
27
+ format: dirigent/v1
28
+ kind: pipeline
29
+ code: in-the-middle-of-a-flow
30
+ name: The node in the middle, and at the end
31
+ description: |
32
+ A list from upstream, enriched with generated columns, then handed to the node again as the
33
+ document's last step.
34
+
35
+ A supplied input decides how many records there are; `rows` is ignored, and the output says
36
+ so.
37
+
38
+ tags: [playground, references, conventions]
39
+
40
+ requires:
41
+ blocks:
42
+ - playground.generate
43
+ - value.const
44
+
45
+ steps:
46
+ codes:
47
+ block: value.const
48
+ config:
49
+ value:
50
+ - code: st-001
51
+ - code: st-002
52
+ - code: st-003
53
+
54
+ enriched:
55
+ block: playground.generate
56
+ depends_on: [codes]
57
+ config:
58
+ input: ${steps.codes.output.value}
59
+ # Ignored, because the input decides how many records there are. The output reports
60
+ # rows: 3, which is the number that actually came out.
61
+ rows: 99
62
+ seed: 3
63
+ fields:
64
+ contact: name
65
+ email: email
66
+
67
+ audited:
68
+ block: playground.generate
69
+ depends_on: [enriched]
70
+ config:
71
+ # No fields named, so the records pass through untouched and this step is an account of
72
+ # what it received rather than a change to it.
73
+ input: ${steps.enriched.output.records}
@@ -0,0 +1,80 @@
1
+ # A retry example that proves a retry, instead of staging one.
2
+ #
3
+ # A document teaching `retry:` used to need a remote endpoint that fails on cue, which no
4
+ # public service offers: the usual trick is an endpoint that always fails, so the reader sees
5
+ # a budget spent and never sees a recovery. `fail_until` closes that gap. The node reads the
6
+ # attempt number the engine hands it and fails while that number is inside the window, so the
7
+ # step really does fail twice and really does succeed on the third attempt.
8
+ #
9
+ # The failure is classified `transient`, which is what the engine retries. A `rejected`
10
+ # failure is refused another attempt however much budget is left, which is what
11
+ # ../patterns/retry-only-transient.yaml is about.
12
+ #
13
+ # Hop by hop:
14
+ #
15
+ # flaky fails attempts 1 and 2, succeeds on 3, and generates its rows on the way out.
16
+ # proof reads the attempt that finally worked, straight off the node's own output.
17
+ #
18
+ # EXPECT THIS RUN TO END completed, in about three seconds: one second of backoff, then two.
19
+ # Read `flaky` in `dg runs show`: three attempts, the last one successful, and `attempt: 3`
20
+ # on the output to say so in the data as well.
21
+ #
22
+ # To change it: -p fail_until=3 with the budget left at 3 and the step runs out of attempts,
23
+ # so the run fails -- which is the other half of what a budget means.
24
+ #
25
+ # dg run --local examples/playground/retry-that-really-retries.yaml
26
+ # dg run --local examples/playground/retry-that-really-retries.yaml -p fail_until=3 # fails
27
+
28
+ format: dirigent/v1
29
+ kind: pipeline
30
+ code: retry-that-really-retries
31
+ name: A retry that really retries
32
+ description: |
33
+ A step that fails its first two attempts and succeeds on the third, on purpose.
34
+
35
+ `fail_until` reads the engine's own attempt number, so the recovery is real rather than
36
+ described.
37
+
38
+ tags: [playground, transform, jq, retry, failure]
39
+
40
+ requires:
41
+ blocks:
42
+ - playground.generate
43
+ - transform.jq
44
+
45
+ params:
46
+ type: object
47
+ properties:
48
+ fail_until:
49
+ type: integer
50
+ description: How many attempts fail before one succeeds; 3 exhausts the budget below.
51
+ default: 2
52
+ minimum: 0
53
+ maximum: 4
54
+
55
+ steps:
56
+ flaky:
57
+ block: playground.generate
58
+ retry:
59
+ max_attempts: 3
60
+ backoff: 1s
61
+ multiplier: 2.0
62
+ max_backoff: 4s
63
+ # No jitter, so the timing above is the timing you see.
64
+ jitter: 0.0
65
+ config:
66
+ fail_until: ${params.fail_until}
67
+ rows: 3
68
+ seed: 7
69
+ fields:
70
+ who: name
71
+
72
+ proof:
73
+ block: transform.jq
74
+ depends_on: [flaky]
75
+ config:
76
+ input:
77
+ attempt: ${steps.flaky.output.attempt}
78
+ failed_before_it: ${steps.flaky.output.fail_until}
79
+ rows: ${steps.flaky.output.rows}
80
+ program: '{succeeded_on_attempt: .attempt, after_failures: .failed_before_it, rows: .rows}'