pyworkflow-engine 0.1.24__tar.gz → 0.1.26__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 (196) hide show
  1. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/PKG-INFO +1 -1
  2. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyproject.toml +1 -1
  3. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/__init__.py +1 -1
  4. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/celery/app.py +88 -53
  5. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/postgres.py +32 -12
  6. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/CLAUDE.md +0 -0
  7. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/DISTRIBUTED.md +0 -0
  8. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/LICENSE +0 -0
  9. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/MANIFEST.in +0 -0
  10. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/README.md +0 -0
  11. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/RELEASING.md +0 -0
  12. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/cancellation.mdx +0 -0
  13. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/continue-as-new.mdx +0 -0
  14. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/events.mdx +0 -0
  15. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/fault-tolerance.mdx +0 -0
  16. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/hooks.mdx +0 -0
  17. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/limitations.mdx +0 -0
  18. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/schedules.mdx +0 -0
  19. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/sleep.mdx +0 -0
  20. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/step-context.mdx +0 -0
  21. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/steps.mdx +0 -0
  22. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/concepts/workflows.mdx +0 -0
  23. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/guides/brokers.mdx +0 -0
  24. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/guides/cli.mdx +0 -0
  25. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/guides/configuration.mdx +0 -0
  26. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/introduction.mdx +0 -0
  27. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/docs/quickstart.mdx +0 -0
  28. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/__init__.py +0 -0
  29. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/__init__.py +0 -0
  30. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/docker-compose.yml +0 -0
  31. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/pyworkflow.config.yaml +0 -0
  32. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/__init__.py +0 -0
  33. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/basic.py +0 -0
  34. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/batch_processing.py +0 -0
  35. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/cancellation.py +0 -0
  36. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/child_workflow_patterns.py +0 -0
  37. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/child_workflows.py +0 -0
  38. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/continue_as_new.py +0 -0
  39. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/fault_tolerance.py +0 -0
  40. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/hooks.py +0 -0
  41. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/idempotency.py +0 -0
  42. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/long_running.py +0 -0
  43. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/retries.py +0 -0
  44. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/schedules.py +0 -0
  45. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/durable/workflows/step_context.py +0 -0
  46. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/transient/01_basic_workflow.py +0 -0
  47. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/transient/02_fault_tolerance.py +0 -0
  48. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/transient/__init__.py +0 -0
  49. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/celery/transient/pyworkflow.config.yaml +0 -0
  50. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/__init__.py +0 -0
  51. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/01_basic_workflow.py +0 -0
  52. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/02_file_storage.py +0 -0
  53. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/03_retries.py +0 -0
  54. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/04_long_running.py +0 -0
  55. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/05_event_log.py +0 -0
  56. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/06_idempotency.py +0 -0
  57. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/07_hooks.py +0 -0
  58. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/08_cancellation.py +0 -0
  59. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/09_child_workflows.py +0 -0
  60. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/10_child_workflow_patterns.py +0 -0
  61. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/11_continue_as_new.py +0 -0
  62. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/12_schedules.py +0 -0
  63. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/13_step_context.py +0 -0
  64. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/durable/__init__.py +0 -0
  65. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/transient/01_quick_tasks.py +0 -0
  66. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/transient/02_retries.py +0 -0
  67. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/transient/03_sleep.py +0 -0
  68. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/examples/local/transient/__init__.py +0 -0
  69. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/aws/__init__.py +0 -0
  70. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/aws/context.py +0 -0
  71. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/aws/handler.py +0 -0
  72. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/aws/testing.py +0 -0
  73. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/celery/__init__.py +0 -0
  74. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/celery/loop.py +0 -0
  75. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/celery/scheduler.py +0 -0
  76. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/celery/singleton.py +0 -0
  77. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/celery/tasks.py +0 -0
  78. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/__init__.py +0 -0
  79. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/__main__.py +0 -0
  80. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/__init__.py +0 -0
  81. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/hooks.py +0 -0
  82. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/quickstart.py +0 -0
  83. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/runs.py +0 -0
  84. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/scheduler.py +0 -0
  85. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/schedules.py +0 -0
  86. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/setup.py +0 -0
  87. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/worker.py +0 -0
  88. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/commands/workflows.py +0 -0
  89. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/output/__init__.py +0 -0
  90. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/output/formatters.py +0 -0
  91. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/output/styles.py +0 -0
  92. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/utils/__init__.py +0 -0
  93. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/utils/async_helpers.py +0 -0
  94. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/utils/config.py +0 -0
  95. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/utils/config_generator.py +0 -0
  96. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/utils/discovery.py +0 -0
  97. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/utils/docker_manager.py +0 -0
  98. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/utils/interactive.py +0 -0
  99. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/cli/utils/storage.py +0 -0
  100. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/config.py +0 -0
  101. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/context/__init__.py +0 -0
  102. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/context/aws.py +0 -0
  103. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/context/base.py +0 -0
  104. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/context/local.py +0 -0
  105. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/context/mock.py +0 -0
  106. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/context/step_context.py +0 -0
  107. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/core/__init__.py +0 -0
  108. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/core/exceptions.py +0 -0
  109. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/core/registry.py +0 -0
  110. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/core/scheduled.py +0 -0
  111. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/core/step.py +0 -0
  112. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/core/validation.py +0 -0
  113. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/core/workflow.py +0 -0
  114. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/discovery.py +0 -0
  115. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/engine/__init__.py +0 -0
  116. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/engine/events.py +0 -0
  117. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/engine/executor.py +0 -0
  118. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/engine/replay.py +0 -0
  119. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/observability/__init__.py +0 -0
  120. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/observability/logging.py +0 -0
  121. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/__init__.py +0 -0
  122. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/child_handle.py +0 -0
  123. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/child_workflow.py +0 -0
  124. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/continue_as_new.py +0 -0
  125. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/define_hook.py +0 -0
  126. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/hooks.py +0 -0
  127. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/resume_hook.py +0 -0
  128. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/schedule.py +0 -0
  129. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/shield.py +0 -0
  130. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/primitives/sleep.py +0 -0
  131. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/runtime/__init__.py +0 -0
  132. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/runtime/base.py +0 -0
  133. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/runtime/celery.py +0 -0
  134. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/runtime/factory.py +0 -0
  135. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/runtime/local.py +0 -0
  136. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/scheduler/__init__.py +0 -0
  137. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/scheduler/local.py +0 -0
  138. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/serialization/__init__.py +0 -0
  139. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/serialization/decoder.py +0 -0
  140. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/serialization/encoder.py +0 -0
  141. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/__init__.py +0 -0
  142. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/base.py +0 -0
  143. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/cassandra.py +0 -0
  144. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/config.py +0 -0
  145. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/dynamodb.py +0 -0
  146. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/file.py +0 -0
  147. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/memory.py +0 -0
  148. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/migrations/__init__.py +0 -0
  149. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/migrations/base.py +0 -0
  150. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/mysql.py +0 -0
  151. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/schemas.py +0 -0
  152. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/storage/sqlite.py +0 -0
  153. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/utils/__init__.py +0 -0
  154. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/utils/duration.py +0 -0
  155. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow/utils/schedule.py +0 -0
  156. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/pyworkflow_engine.egg-info/SOURCES.txt +0 -0
  157. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/setup.cfg +0 -0
  158. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/__init__.py +0 -0
  159. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_cancellation.py +0 -0
  160. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_cassandra_storage.py +0 -0
  161. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_child_workflows.py +0 -0
  162. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_continue_as_new.py +0 -0
  163. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_dynamodb_storage.py +0 -0
  164. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_fault_tolerance.py +0 -0
  165. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_schedule_storage.py +0 -0
  166. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_schema_migrations.py +0 -0
  167. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_singleton.py +0 -0
  168. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/integration/test_workflow_suspended.py +0 -0
  169. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/__init__.py +0 -0
  170. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/backends/__init__.py +0 -0
  171. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/backends/test_cassandra_storage.py +0 -0
  172. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/backends/test_dynamodb_storage.py +0 -0
  173. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/backends/test_postgres_storage.py +0 -0
  174. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/backends/test_sqlite_storage.py +0 -0
  175. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/conftest.py +0 -0
  176. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/storage/__init__.py +0 -0
  177. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/storage/test_migrations.py +0 -0
  178. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_cancellation.py +0 -0
  179. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_child_workflows.py +0 -0
  180. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_cli_worker.py +0 -0
  181. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_continue_as_new.py +0 -0
  182. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_event_limits.py +0 -0
  183. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_executor.py +0 -0
  184. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_fault_tolerance.py +0 -0
  185. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_hooks.py +0 -0
  186. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_registry.py +0 -0
  187. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_replay.py +0 -0
  188. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_schedule_schemas.py +0 -0
  189. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_schedule_utils.py +0 -0
  190. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_scheduled_workflow.py +0 -0
  191. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_singleton.py +0 -0
  192. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_step.py +0 -0
  193. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_step_context.py +0 -0
  194. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_validation.py +0 -0
  195. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_workflow.py +0 -0
  196. {pyworkflow_engine-0.1.24 → pyworkflow_engine-0.1.26}/tests/unit/test_workflow_suspended.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyworkflow-engine
3
- Version: 0.1.24
3
+ Version: 0.1.26
4
4
  Summary: A Python implementation of durable, event-sourced workflows inspired by Vercel Workflow
5
5
  Author: PyWorkflow Contributors
6
6
  License: MIT
@@ -7,7 +7,7 @@ packages = [{include = "pyworkflow"}]
7
7
 
8
8
  [project]
9
9
  name = "pyworkflow-engine"
10
- version = "0.1.24"
10
+ version = "0.1.26"
11
11
  description = "A Python implementation of durable, event-sourced workflows inspired by Vercel Workflow"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.11"
@@ -29,7 +29,7 @@ Quick Start:
29
29
  >>> run_id = await start(my_workflow, "Alice")
30
30
  """
31
31
 
32
- __version__ = "0.1.24"
32
+ __version__ = "0.1.26"
33
33
 
34
34
  # Configuration
35
35
  from pyworkflow.config import (
@@ -202,11 +202,16 @@ def create_celery_app(
202
202
  """
203
203
  # Priority: parameter > environment variable > hardcoded default
204
204
  broker_url = broker_url or os.getenv("PYWORKFLOW_CELERY_BROKER") or "redis://localhost:6379/0"
205
- result_backend = (
206
- result_backend
207
- or os.getenv("PYWORKFLOW_CELERY_RESULT_BACKEND")
208
- or "redis://localhost:6379/1"
209
- )
205
+
206
+ # Result backend defaults to None (disabled) unless explicitly set
207
+ if result_backend is None and "PYWORKFLOW_CELERY_RESULT_BACKEND" not in os.environ:
208
+ result_backend = None # Disabled by default
209
+ else:
210
+ result_backend = (
211
+ result_backend
212
+ or os.getenv("PYWORKFLOW_CELERY_RESULT_BACKEND")
213
+ or "redis://localhost:6379/1"
214
+ )
210
215
 
211
216
  # Worker memory limits (KB) - prevents memory leaks from accumulating
212
217
  # Priority: parameter > env var > None (no limit by default)
@@ -218,7 +223,7 @@ def create_celery_app(
218
223
 
219
224
  # Detect broker and backend types
220
225
  is_sentinel_broker = is_sentinel_url(broker_url)
221
- is_sentinel_backend = is_sentinel_url(result_backend)
226
+ is_sentinel_backend = is_sentinel_url(result_backend) if result_backend else False
222
227
  is_redis_broker = broker_url.startswith("redis://") or broker_url.startswith("rediss://")
223
228
 
224
229
  # Get Sentinel master name from param, env, or default
@@ -255,34 +260,44 @@ def create_celery_app(
255
260
  **(result_backend_transport_options or {}),
256
261
  }
257
262
 
258
- app = Celery(
259
- app_name,
260
- broker=broker_url,
261
- backend=result_backend,
262
- include=[
263
- "pyworkflow.celery.tasks",
264
- ],
265
- )
263
+ # Create Celery app - only set backend if result_backend is enabled
264
+ if result_backend is not None:
265
+ app = Celery(
266
+ app_name,
267
+ broker=broker_url,
268
+ backend=result_backend,
269
+ include=[
270
+ "pyworkflow.celery.tasks",
271
+ ],
272
+ )
273
+ else:
274
+ # No result backend - Celery will not store task results
275
+ app = Celery(
276
+ app_name,
277
+ broker=broker_url,
278
+ include=[
279
+ "pyworkflow.celery.tasks",
280
+ ],
281
+ )
266
282
 
267
- # Configure Celery
268
- app.conf.update(
283
+ # Build configuration dict
284
+ config_dict = {
269
285
  # Task execution settings
270
- task_serializer="json",
271
- result_serializer="json",
272
- accept_content=["json"],
273
- timezone="UTC",
274
- enable_utc=True,
286
+ "task_serializer": "json",
287
+ "result_serializer": "json",
288
+ "accept_content": ["json"],
289
+ "timezone": "UTC",
290
+ "enable_utc": True,
275
291
  # Broker transport options - prevent task redelivery
276
292
  # See: https://github.com/celery/celery/issues/5935
277
- broker_transport_options=final_broker_opts,
278
- result_backend_transport_options=final_backend_opts,
293
+ "broker_transport_options": final_broker_opts,
279
294
  # Task routing
280
- task_default_queue="pyworkflow.default",
281
- task_default_exchange="pyworkflow",
282
- task_default_exchange_type="topic",
283
- task_default_routing_key="workflow.default",
295
+ "task_default_queue": "pyworkflow.default",
296
+ "task_default_exchange": "pyworkflow",
297
+ "task_default_exchange_type": "topic",
298
+ "task_default_routing_key": "workflow.default",
284
299
  # Task queues
285
- task_queues=(
300
+ "task_queues": (
286
301
  Queue(
287
302
  "pyworkflow.default",
288
303
  Exchange("pyworkflow", type="topic"),
@@ -304,42 +319,62 @@ def create_celery_app(
304
319
  routing_key="workflow.schedule.#",
305
320
  ),
306
321
  ),
307
- # Result backend settings
308
- result_expires=3600, # 1 hour
309
- result_persistent=True,
310
322
  # Task execution
311
- task_acks_late=True,
312
- task_reject_on_worker_lost=True,
313
- worker_prefetch_multiplier=1, # Fair task distribution
323
+ "task_acks_late": True,
324
+ "task_reject_on_worker_lost": True,
325
+ "worker_prefetch_multiplier": 1, # Fair task distribution
314
326
  # Retry settings
315
- task_autoretry_for=(),
316
- task_retry_backoff=True,
317
- task_retry_backoff_max=600, # 10 minutes max
318
- task_retry_jitter=True,
327
+ "task_autoretry_for": (),
328
+ "task_retry_backoff": True,
329
+ "task_retry_backoff_max": 600, # 10 minutes max
330
+ "task_retry_jitter": True,
319
331
  # Monitoring
320
- worker_send_task_events=True,
321
- task_send_sent_event=True,
332
+ "worker_send_task_events": True,
333
+ "task_send_sent_event": True,
322
334
  # Beat scheduler (for sleep resumption)
323
- beat_schedule={},
335
+ "beat_schedule": {},
324
336
  # Logging
325
- worker_log_format="[%(asctime)s: %(levelname)s/%(processName)s] %(message)s",
326
- worker_task_log_format="[%(asctime)s: %(levelname)s/%(processName)s] [%(task_name)s(%(task_id)s)] %(message)s",
337
+ "worker_log_format": "[%(asctime)s: %(levelname)s/%(processName)s] %(message)s",
338
+ "worker_task_log_format": "[%(asctime)s: %(levelname)s/%(processName)s] [%(task_name)s(%(task_id)s)] %(message)s",
327
339
  # Worker memory management - prevents memory leaks from accumulating
328
340
  # When set, workers are recycled after exceeding these limits
329
- worker_max_memory_per_child=max_memory, # KB, None = no limit
330
- worker_max_tasks_per_child=max_tasks, # None = no limit
331
- )
341
+ "worker_max_memory_per_child": max_memory, # KB, None = no limit
342
+ "worker_max_tasks_per_child": max_tasks, # None = no limit
343
+ }
344
+
345
+ # Only add result backend settings if enabled
346
+ if result_backend is not None:
347
+ config_dict.update(
348
+ {
349
+ "result_backend_transport_options": final_backend_opts,
350
+ "result_expires": 3600, # 1 hour
351
+ "result_persistent": True,
352
+ }
353
+ )
354
+ else:
355
+ # Disable task result storage when no backend configured
356
+ config_dict.update(
357
+ {
358
+ "task_ignore_result": True, # Don't try to store task results
359
+ "task_store_errors_even_if_ignored": False, # Don't store errors either
360
+ }
361
+ )
362
+
363
+ # Configure Celery
364
+ app.conf.update(config_dict)
332
365
 
333
366
  # Configure singleton locking for Redis or Sentinel brokers
334
367
  # This enables distributed locking to prevent duplicate task execution
368
+ # Uses broker URL since result backend may be disabled
335
369
  if is_redis_broker or is_sentinel_broker:
336
- app.conf.update(
337
- singleton_backend_url=broker_url,
338
- singleton_backend_is_sentinel=is_sentinel_broker,
339
- singleton_sentinel_master=master_name if is_sentinel_broker else None,
340
- singleton_key_prefix="pyworkflow:lock:",
341
- singleton_lock_expiry=3600, # 1 hour TTL (safety net)
342
- )
370
+ singleton_config = {
371
+ "singleton_backend_url": broker_url, # Use broker, not result backend
372
+ "singleton_backend_is_sentinel": is_sentinel_broker,
373
+ "singleton_sentinel_master": master_name if is_sentinel_broker else None,
374
+ "singleton_key_prefix": "pyworkflow:lock:",
375
+ "singleton_lock_expiry": 3600, # 1 hour TTL (safety net)
376
+ }
377
+ app.conf.update(singleton_config)
343
378
 
344
379
  # Note: Logging is configured via Celery signals (worker_init, worker_process_init)
345
380
  # to ensure proper initialization AFTER process forking.
@@ -16,6 +16,7 @@ the pool is automatically recreated when a loop change is detected.
16
16
  import asyncio
17
17
  import contextlib
18
18
  import json
19
+ import os
19
20
  from datetime import UTC, datetime
20
21
  from typing import Any
21
22
 
@@ -163,10 +164,10 @@ class PostgresStorageBackend(StorageBackend):
163
164
  user: str = "pyworkflow",
164
165
  password: str = "",
165
166
  database: str = "pyworkflow",
166
- min_pool_size: int = 1,
167
- max_pool_size: int = 10,
168
- max_inactive_connection_lifetime: float = 1800.0,
169
- command_timeout: float | None = 60.0,
167
+ min_pool_size: int | None = None,
168
+ max_pool_size: int | None = None,
169
+ max_inactive_connection_lifetime: float | None = None,
170
+ command_timeout: float | None = None,
170
171
  ):
171
172
  """
172
173
  Initialize PostgreSQL storage backend.
@@ -178,11 +179,13 @@ class PostgresStorageBackend(StorageBackend):
178
179
  user: Database user (used if dsn not provided)
179
180
  password: Database password (used if dsn not provided)
180
181
  database: Database name (used if dsn not provided)
181
- min_pool_size: Minimum connections in pool
182
- max_pool_size: Maximum connections in pool
182
+ min_pool_size: Minimum connections in pool (defaults to env var PYWORKFLOW_POSTGRES_MIN_POOL_SIZE or 1)
183
+ max_pool_size: Maximum connections in pool (defaults to env var PYWORKFLOW_POSTGRES_MAX_POOL_SIZE or 10)
183
184
  max_inactive_connection_lifetime: How long (seconds) an idle connection can
184
- stay in the pool before being closed. Default 1800s (30 min).
185
- command_timeout: Default timeout (seconds) for queries. None for no timeout. Default 60s.
185
+ stay in the pool before being closed.
186
+ Defaults to env var PYWORKFLOW_POSTGRES_MAX_INACTIVE_LIFETIME or 1800s (30 min).
187
+ command_timeout: Default timeout (seconds) for queries. None for no timeout.
188
+ Defaults to env var PYWORKFLOW_POSTGRES_COMMAND_TIMEOUT or 60s.
186
189
  """
187
190
  self.dsn = dsn
188
191
  self.host = host
@@ -190,10 +193,27 @@ class PostgresStorageBackend(StorageBackend):
190
193
  self.user = user
191
194
  self.password = password
192
195
  self.database = database
193
- self.min_pool_size = min_pool_size
194
- self.max_pool_size = max_pool_size
195
- self.max_inactive_connection_lifetime = max_inactive_connection_lifetime
196
- self.command_timeout = command_timeout
196
+
197
+ # Read from env vars if not provided
198
+ self.min_pool_size = min_pool_size or int(
199
+ os.getenv("PYWORKFLOW_POSTGRES_MIN_POOL_SIZE", "1")
200
+ )
201
+ self.max_pool_size = max_pool_size or int(
202
+ os.getenv("PYWORKFLOW_POSTGRES_MAX_POOL_SIZE", "10")
203
+ )
204
+ self.max_inactive_connection_lifetime = max_inactive_connection_lifetime or float(
205
+ os.getenv("PYWORKFLOW_POSTGRES_MAX_INACTIVE_LIFETIME", "1800.0")
206
+ )
207
+ self.command_timeout = (
208
+ command_timeout
209
+ if command_timeout is not None
210
+ else (
211
+ float(os.getenv("PYWORKFLOW_POSTGRES_COMMAND_TIMEOUT", "60.0"))
212
+ if os.getenv("PYWORKFLOW_POSTGRES_COMMAND_TIMEOUT")
213
+ else 60.0
214
+ )
215
+ )
216
+
197
217
  self._pool: asyncpg.Pool | None = None
198
218
  self._pool_loop_id: int | None = None # Track which loop the pool was created on
199
219
  self._initialized = False