taskflow 6.0.1__tar.gz → 6.1.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 (362) hide show
  1. {taskflow-6.0.1 → taskflow-6.1.0}/.pre-commit-config.yaml +4 -10
  2. {taskflow-6.0.1 → taskflow-6.1.0}/AUTHORS +1 -0
  3. {taskflow-6.0.1 → taskflow-6.1.0}/ChangeLog +20 -0
  4. {taskflow-6.0.1 → taskflow-6.1.0}/PKG-INFO +19 -39
  5. {taskflow-6.0.1 → taskflow-6.1.0}/README.rst +6 -7
  6. taskflow-6.1.0/pyproject.toml +89 -0
  7. taskflow-6.1.0/releasenotes/notes/remove-py39-b6f3ce23fc9ea9b9.yaml +5 -0
  8. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2024.1.rst +1 -1
  9. taskflow-6.1.0/releasenotes/source/2025.2.rst +6 -0
  10. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/index.rst +1 -0
  11. {taskflow-6.0.1 → taskflow-6.1.0}/setup-etcd-env.sh +1 -1
  12. taskflow-6.1.0/setup.cfg +7 -0
  13. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/atom.py +2 -2
  14. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/backends/impl_executor.py +8 -18
  15. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/base.py +24 -0
  16. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/compiler.py +1 -1
  17. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/proxy.py +1 -1
  18. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/create_parallel_volume.py +2 -2
  19. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/dump_memory_backend.py +1 -1
  20. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/fake_billing.py +1 -1
  21. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/graph_flow.py +2 -2
  22. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/hello_world.py +1 -1
  23. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/jobboard_produce_consume_colors.py +3 -3
  24. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/pseudo_scoping.py +2 -2
  25. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_from_backend.py +1 -1
  26. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows/resume_all.py +1 -1
  27. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_vm_boot.py +2 -2
  28. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/run_by_iter_enumerate.py +1 -1
  29. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/share_engine_thread.py +1 -1
  30. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/switch_graph_flow.py +1 -1
  31. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/tox_conductor.py +1 -1
  32. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/formatters.py +2 -2
  33. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/backends/impl_etcd.py +3 -3
  34. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/backends/impl_redis.py +2 -9
  35. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/timing.py +1 -1
  36. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/__init__.py +1 -1
  37. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/test.py +1 -1
  38. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/base.py +1 -1
  39. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/test_sql_persistence.py +1 -1
  40. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_proxy.py +1 -1
  41. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/graph.py +3 -3
  42. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/sets.py +1 -1
  43. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/banner.py +2 -2
  44. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/kazoo_utils.py +2 -2
  45. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/misc.py +1 -3
  46. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/version.py +1 -1
  47. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/PKG-INFO +19 -39
  48. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/SOURCES.txt +2 -0
  49. taskflow-6.1.0/taskflow.egg-info/pbr.json +1 -0
  50. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/requires.txt +0 -19
  51. {taskflow-6.0.1 → taskflow-6.1.0}/tools/state_graph.py +1 -1
  52. {taskflow-6.0.1 → taskflow-6.1.0}/tox.ini +4 -0
  53. taskflow-6.0.1/pyproject.toml +0 -3
  54. taskflow-6.0.1/setup.cfg +0 -77
  55. taskflow-6.0.1/taskflow.egg-info/pbr.json +0 -1
  56. {taskflow-6.0.1 → taskflow-6.1.0}/.coveragerc +0 -0
  57. {taskflow-6.0.1 → taskflow-6.1.0}/.mailmap +0 -0
  58. {taskflow-6.0.1 → taskflow-6.1.0}/.pylintrc +0 -0
  59. {taskflow-6.0.1 → taskflow-6.1.0}/.stestr.conf +0 -0
  60. {taskflow-6.0.1 → taskflow-6.1.0}/.zuul.yaml +0 -0
  61. {taskflow-6.0.1 → taskflow-6.1.0}/CONTRIBUTING.rst +0 -0
  62. {taskflow-6.0.1 → taskflow-6.1.0}/LICENSE +0 -0
  63. {taskflow-6.0.1 → taskflow-6.1.0}/bindep.txt +0 -0
  64. {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/area_of_influence.graffle.tgz +0 -0
  65. {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/core.graffle.tgz +0 -0
  66. {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/jobboard.graffle.tgz +0 -0
  67. {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/tasks.graffle.tgz +0 -0
  68. {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/worker-engine.graffle.tgz +0 -0
  69. {taskflow-6.0.1 → taskflow-6.1.0}/doc/requirements.txt +0 -0
  70. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/conf.py +0 -0
  71. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/index.rst +0 -0
  72. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/templates/layout.html +0 -0
  73. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/arguments_and_results.rst +0 -0
  74. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/atoms.rst +0 -0
  75. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/conductors.rst +0 -0
  76. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/engines.rst +0 -0
  77. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/examples.rst +0 -0
  78. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/exceptions.rst +0 -0
  79. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/history.rst +0 -0
  80. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/area_of_influence.svg +0 -0
  81. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/conductor.png +0 -0
  82. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/conductor_cycle.png +0 -0
  83. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/distributed_flow_rpc.png +0 -0
  84. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/engine_states.svg +0 -0
  85. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/flow_states.svg +0 -0
  86. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/job_states.svg +0 -0
  87. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/jobboard.png +0 -0
  88. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/mandelbrot.png +0 -0
  89. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/retry_states.svg +0 -0
  90. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/task_states.svg +0 -0
  91. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/tasks.png +0 -0
  92. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/wbe_request_states.svg +0 -0
  93. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/worker-engine.svg +0 -0
  94. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/index.rst +0 -0
  95. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/inputs_and_outputs.rst +0 -0
  96. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/jobs.rst +0 -0
  97. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/notifications.rst +0 -0
  98. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/patterns.rst +0 -0
  99. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/persistence.rst +0 -0
  100. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/resumption.rst +0 -0
  101. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/shelf.rst +0 -0
  102. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/states.rst +0 -0
  103. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/types.rst +0 -0
  104. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/utils.rst +0 -0
  105. {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/workers.rst +0 -0
  106. {taskflow-6.0.1 → taskflow-6.1.0}/playbooks/tests/functional/Debian.yaml +0 -0
  107. {taskflow-6.0.1 → taskflow-6.1.0}/playbooks/tests/functional/RedHat.yaml +0 -0
  108. {taskflow-6.0.1 → taskflow-6.1.0}/playbooks/tests/functional/pre.yml +0 -0
  109. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/.placeholder +0 -0
  110. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml +0 -0
  111. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml +0 -0
  112. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/deprecate-eventlet-df4a34a7d56acc47.yaml +0 -0
  113. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/disable-process_executor-python-312-d1074c816bc8303e.yaml +0 -0
  114. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml +0 -0
  115. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/etcd-jobboard-backend-8a9fea2238fb0f12.yaml +0 -0
  116. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml +0 -0
  117. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml +0 -0
  118. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-revert-all-revert-a0310cd7beaa7409.yaml +0 -0
  119. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml +0 -0
  120. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml +0 -0
  121. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/mask-keys-74b9bb5c420d8091.yaml +0 -0
  122. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/redis-username-df0eb33869db09a2.yaml +0 -0
  123. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/remove-process_executor-f59d40a5dd287cd7.yaml +0 -0
  124. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/remove-py38-15af791146f479e1.yaml +0 -0
  125. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/remove-strict-redis-f2a5a924b314de41.yaml +0 -0
  126. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/sentinel-fallbacks-6fe2ab0d68959cdf.yaml +0 -0
  127. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/sentinel-ssl-399c56ed7067d282.yaml +0 -0
  128. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/sentinel-use-redis-creds-63f58b12ad46a2b5.yaml +0 -0
  129. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/zookeeper-ssl-support-b9abf24a39096b62.yaml +0 -0
  130. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2023.1.rst +0 -0
  131. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2023.2.rst +0 -0
  132. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2024.2.rst +0 -0
  133. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2025.1.rst +0 -0
  134. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/_static/.placeholder +0 -0
  135. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/_templates/.placeholder +0 -0
  136. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/conf.py +0 -0
  137. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/ocata.rst +0 -0
  138. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/pike.rst +0 -0
  139. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/queens.rst +0 -0
  140. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/rocky.rst +0 -0
  141. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/stein.rst +0 -0
  142. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/train.rst +0 -0
  143. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/unreleased.rst +0 -0
  144. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/ussuri.rst +0 -0
  145. {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/victoria.rst +0 -0
  146. {taskflow-6.0.1 → taskflow-6.1.0}/requirements.txt +0 -0
  147. {taskflow-6.0.1 → taskflow-6.1.0}/run_tests.sh +0 -0
  148. {taskflow-6.0.1 → taskflow-6.1.0}/setup.py +0 -0
  149. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/__init__.py +0 -0
  150. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/__init__.py +0 -0
  151. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/backends/__init__.py +0 -0
  152. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/backends/impl_blocking.py +0 -0
  153. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/backends/impl_nonblocking.py +0 -0
  154. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/contrib/__init__.py +0 -0
  155. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/deciders.py +0 -0
  156. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/__init__.py +0 -0
  157. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/__init__.py +0 -0
  158. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/actions/__init__.py +0 -0
  159. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/actions/base.py +0 -0
  160. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/actions/retry.py +0 -0
  161. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/actions/task.py +0 -0
  162. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/builder.py +0 -0
  163. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/completer.py +0 -0
  164. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/deciders.py +0 -0
  165. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/engine.py +0 -0
  166. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/executor.py +0 -0
  167. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/runtime.py +0 -0
  168. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/scheduler.py +0 -0
  169. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/scopes.py +0 -0
  170. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/selector.py +0 -0
  171. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/traversal.py +0 -0
  172. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/base.py +0 -0
  173. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/helpers.py +0 -0
  174. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/__init__.py +0 -0
  175. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/dispatcher.py +0 -0
  176. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/endpoint.py +0 -0
  177. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/engine.py +0 -0
  178. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/executor.py +0 -0
  179. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/protocol.py +0 -0
  180. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/server.py +0 -0
  181. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/types.py +0 -0
  182. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/worker.py +0 -0
  183. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/99_bottles.py +0 -0
  184. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/alphabet_soup.py +0 -0
  185. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/build_a_car.py +0 -0
  186. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/buildsystem.py +0 -0
  187. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/calculate_in_parallel.py +0 -0
  188. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/calculate_linear.py +0 -0
  189. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/delayed_return.py +0 -0
  190. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/distance_calculator.py +0 -0
  191. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/echo_listener.py +0 -0
  192. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/example_utils.py +0 -0
  193. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/parallel_table_multiply.py +0 -0
  194. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/persistence_example.py +0 -0
  195. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/pseudo_scoping.out.txt +0 -0
  196. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_from_backend.out.txt +0 -0
  197. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows/my_flows.py +0 -0
  198. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows/run_flow.py +0 -0
  199. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows.out.txt +0 -0
  200. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows.py +0 -0
  201. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_volume_create.py +0 -0
  202. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/retry_flow.out.txt +0 -0
  203. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/retry_flow.py +0 -0
  204. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/reverting_linear.out.txt +0 -0
  205. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/reverting_linear.py +0 -0
  206. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/run_by_iter.out.txt +0 -0
  207. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/run_by_iter.py +0 -0
  208. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/run_by_iter_enumerate.out.txt +0 -0
  209. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear.out.txt +0 -0
  210. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear.py +0 -0
  211. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear_listening.out.txt +0 -0
  212. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear_listening.py +0 -0
  213. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear_pass.out.txt +0 -0
  214. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear_pass.py +0 -0
  215. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_map_reduce.py +0 -0
  216. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/timing_listener.py +0 -0
  217. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_event_sender.py +0 -0
  218. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_mandelbrot.out.txt +0 -0
  219. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_mandelbrot.py +0 -0
  220. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_simple_linear.out.txt +0 -0
  221. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_simple_linear.py +0 -0
  222. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wrapped_exception.py +0 -0
  223. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/exceptions.py +0 -0
  224. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/flow.py +0 -0
  225. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/__init__.py +0 -0
  226. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/backends/__init__.py +0 -0
  227. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/backends/impl_zookeeper.py +0 -0
  228. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/base.py +0 -0
  229. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/__init__.py +0 -0
  230. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/base.py +0 -0
  231. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/capturing.py +0 -0
  232. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/claims.py +0 -0
  233. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/logging.py +0 -0
  234. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/printing.py +0 -0
  235. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/logging.py +0 -0
  236. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/patterns/__init__.py +0 -0
  237. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/patterns/graph_flow.py +0 -0
  238. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/patterns/linear_flow.py +0 -0
  239. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/patterns/unordered_flow.py +0 -0
  240. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/__init__.py +0 -0
  241. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/impl_dir.py +0 -0
  242. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/impl_memory.py +0 -0
  243. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/impl_sqlalchemy.py +0 -0
  244. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/impl_zookeeper.py +0 -0
  245. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/__init__.py +0 -0
  246. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/README +0 -0
  247. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/alembic.ini +0 -0
  248. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/env.py +0 -0
  249. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/script.py.mako +0 -0
  250. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/00af93df9d77_add_unique_into_all_indexes.py +0 -0
  251. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/0bc3e1a3c135_set_result_meduimtext_type.py +0 -0
  252. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/14b227d79a87_add_intention_column.py +0 -0
  253. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1c783c0c2875_replace_exception_an.py +0 -0
  254. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1cea328f0f65_initial_logbook_deta.py +0 -0
  255. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/2ad4984f2864_switch_postgres_to_json_native.py +0 -0
  256. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/3162c0f3f8e4_add_revert_results_and_revert_failure_.py +0 -0
  257. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/40fc8c914bd2_fix_atomdetails_failure_size.py +0 -0
  258. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/589dccdf2b6e_rename_taskdetails_to_atomdetails.py +0 -0
  259. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/6df9422fcb43_fix_flowdetails_meta_size.py +0 -0
  260. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/84d6e888850_add_task_detail_type.py +0 -0
  261. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/README +0 -0
  262. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/migration.py +0 -0
  263. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/tables.py +0 -0
  264. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/base.py +0 -0
  265. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/models.py +0 -0
  266. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/path_based.py +0 -0
  267. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/retry.py +0 -0
  268. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/states.py +0 -0
  269. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/storage.py +0 -0
  270. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/task.py +0 -0
  271. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/__init__.py +0 -0
  272. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/fixtures.py +0 -0
  273. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/test_examples.py +0 -0
  274. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/__init__.py +0 -0
  275. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/__init__.py +0 -0
  276. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/test_builder.py +0 -0
  277. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/test_compile.py +0 -0
  278. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/test_creation.py +0 -0
  279. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/test_scoping.py +0 -0
  280. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/__init__.py +0 -0
  281. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/base.py +0 -0
  282. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/test_entrypoint.py +0 -0
  283. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/test_etcd_job.py +0 -0
  284. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/test_redis_job.py +0 -0
  285. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/test_zk_job.py +0 -0
  286. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/patterns/__init__.py +0 -0
  287. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/patterns/test_graph_flow.py +0 -0
  288. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/patterns/test_linear_flow.py +0 -0
  289. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/patterns/test_unordered_flow.py +0 -0
  290. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/__init__.py +0 -0
  291. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/test_dir_persistence.py +0 -0
  292. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/test_memory_persistence.py +0 -0
  293. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/test_zk_persistence.py +0 -0
  294. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_arguments_passing.py +0 -0
  295. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_check_transition.py +0 -0
  296. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_conductors.py +0 -0
  297. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_deciders.py +0 -0
  298. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_engine_helpers.py +0 -0
  299. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_engines.py +0 -0
  300. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_exceptions.py +0 -0
  301. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_failure.py +0 -0
  302. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_flow_dependencies.py +0 -0
  303. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_formatters.py +0 -0
  304. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_functor_task.py +0 -0
  305. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_listeners.py +0 -0
  306. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_mapfunctor_task.py +0 -0
  307. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_notifier.py +0 -0
  308. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_progress.py +0 -0
  309. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_reducefunctor_task.py +0 -0
  310. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_retries.py +0 -0
  311. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_states.py +0 -0
  312. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_storage.py +0 -0
  313. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_suspend.py +0 -0
  314. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_task.py +0 -0
  315. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_types.py +0 -0
  316. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils.py +0 -0
  317. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_async_utils.py +0 -0
  318. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_binary.py +0 -0
  319. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_iter_utils.py +0 -0
  320. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_kazoo_utils.py +0 -0
  321. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_threading_utils.py +0 -0
  322. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/__init__.py +0 -0
  323. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_creation.py +0 -0
  324. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_dispatcher.py +0 -0
  325. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_endpoint.py +0 -0
  326. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_executor.py +0 -0
  327. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_message_pump.py +0 -0
  328. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_pipeline.py +0 -0
  329. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_protocol.py +0 -0
  330. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_server.py +0 -0
  331. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_types.py +0 -0
  332. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_worker.py +0 -0
  333. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/utils.py +0 -0
  334. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/__init__.py +0 -0
  335. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/entity.py +0 -0
  336. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/failure.py +0 -0
  337. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/latch.py +0 -0
  338. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/notifier.py +0 -0
  339. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/timing.py +0 -0
  340. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/tree.py +0 -0
  341. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/__init__.py +0 -0
  342. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/async_utils.py +0 -0
  343. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/eventlet_utils.py +0 -0
  344. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/iter_utils.py +0 -0
  345. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/kombu_utils.py +0 -0
  346. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/persistence_utils.py +0 -0
  347. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/redis_utils.py +0 -0
  348. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/schema_utils.py +0 -0
  349. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/threading_utils.py +0 -0
  350. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/dependency_links.txt +0 -0
  351. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/entry_points.txt +0 -0
  352. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/not-zip-safe +0 -0
  353. {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/top_level.txt +0 -0
  354. {taskflow-6.0.1 → taskflow-6.1.0}/test-requirements.txt +0 -0
  355. {taskflow-6.0.1 → taskflow-6.1.0}/tools/clear_zk.sh +0 -0
  356. {taskflow-6.0.1 → taskflow-6.1.0}/tools/env_builder.sh +0 -0
  357. {taskflow-6.0.1 → taskflow-6.1.0}/tools/pretty_tox.sh +0 -0
  358. {taskflow-6.0.1 → taskflow-6.1.0}/tools/schema_generator.py +0 -0
  359. {taskflow-6.0.1 → taskflow-6.1.0}/tools/speed_test.py +0 -0
  360. {taskflow-6.0.1 → taskflow-6.1.0}/tools/subunit_trace.py +0 -0
  361. {taskflow-6.0.1 → taskflow-6.1.0}/tools/test-setup.sh +0 -0
  362. {taskflow-6.0.1 → taskflow-6.1.0}/tools/update_states.sh +0 -0
@@ -1,20 +1,14 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v5.0.0
3
+ rev: v6.0.0
4
4
  hooks:
5
5
  - id: trailing-whitespace
6
- # Replaces or checks mixed line ending
7
6
  - id: mixed-line-ending
8
7
  args: ['--fix', 'lf']
9
8
  exclude: '.*\.(svg)$'
10
- # Forbid files which have a UTF-8 byte-order marker
11
- - id: check-byte-order-marker
12
- # Checks that non-binary executables have a proper shebang
9
+ - id: fix-byte-order-marker
13
10
  - id: check-executables-have-shebangs
14
- # Check for files that contain merge conflict strings.
15
11
  - id: check-merge-conflict
16
- # Check for debugger imports and py37+ breakpoint()
17
- # calls in python source
18
12
  - id: debug-statements
19
13
  - id: check-yaml
20
14
  files: .*\.(yaml|yml)$
@@ -25,7 +19,7 @@ repos:
25
19
  additional_dependencies: []
26
20
  exclude: '^(doc|releasenotes|tools)/.*$'
27
21
  - repo: https://github.com/asottile/pyupgrade
28
- rev: v3.18.0
22
+ rev: v3.20.0
29
23
  hooks:
30
24
  - id: pyupgrade
31
- args: [--py3-only]
25
+ args: [--py310-plus]
@@ -9,6 +9,7 @@ Ann Taraday <akamyshnikova@mirantis.com>
9
9
  Atsushi SAKAI <sakaia@jp.fujitsu.com>
10
10
  Balaji Narayanan <lists@balajin.net>
11
11
  Ben Nemec <bnemec@redhat.com>
12
+ Brett Delle Grazie <brett.dellegrazie@gmail.com>
12
13
  Brian Jarrett <celttechie@gmail.com>
13
14
  ChangBo Guo(gcb) <eric.guo@easystack.cn>
14
15
  Changbin Liu <changbl@research.att.com>
@@ -1,6 +1,26 @@
1
1
  CHANGES
2
2
  =======
3
3
 
4
+ 6.1.0
5
+ -----
6
+
7
+ * Delay string interpolations at logging calls
8
+ * Remove reference to tag framework
9
+ * reno: Update master for unmaintained/2024.1
10
+ * Bump pyupgrade target to 3.10+
11
+ * pre-commit: Bump dependencies
12
+ * Migrate setup configuration to pyproject.toml
13
+ * Drop Python 3.9 support
14
+ * Update master for stable/2025.2
15
+ * Replace PackException/UnpackException
16
+
17
+ 6.0.2
18
+ -----
19
+
20
+ * Bump etcd to 3.5.x
21
+ * Allow overriding etcd version in tests
22
+ * fix(conductor): add stop and wait methods to base
23
+
4
24
  6.0.1
5
25
  -----
6
26
 
@@ -1,28 +1,26 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: taskflow
3
- Version: 6.0.1
3
+ Version: 6.1.0
4
4
  Summary: Taskflow structured state management library.
5
- Home-page: https://docs.openstack.org/taskflow/latest/
6
- Author: OpenStack
7
- Author-email: openstack-discuss@lists.openstack.org
8
- Keywords: reliable,tasks,execution,parallel,dataflow,workflows,distributed
5
+ Author-email: OpenStack <openstack-discuss@lists.openstack.org>
6
+ License: Apache-2.0
7
+ Project-URL: Homepage, https://docs.openstack.org/taskflow
8
+ Project-URL: Repository, https://opendev.org/openstack/taskflow
9
9
  Classifier: Development Status :: 5 - Production/Stable
10
- Classifier: Environment :: OpenStack
10
+ Classifier: Environment :: Console
11
11
  Classifier: Intended Audience :: Developers
12
- Classifier: Intended Audience :: Information Technology
13
12
  Classifier: License :: OSI Approved :: Apache Software License
14
13
  Classifier: Operating System :: POSIX :: Linux
15
14
  Classifier: Programming Language :: Python
16
15
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.9
18
16
  Classifier: Programming Language :: Python :: 3.10
19
17
  Classifier: Programming Language :: Python :: 3.11
20
18
  Classifier: Programming Language :: Python :: 3.12
21
- Classifier: Programming Language :: Python :: 3 :: Only
22
- Classifier: Programming Language :: Python :: Implementation :: CPython
19
+ Classifier: Programming Language :: Python :: 3.13
23
20
  Classifier: Topic :: Software Development :: Libraries
24
21
  Classifier: Topic :: System :: Distributed Computing
25
- Requires-Python: >=3.9
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/x-rst
26
24
  License-File: LICENSE
27
25
  Requires-Dist: pbr>=2.0.0
28
26
  Requires-Dist: debtcollector>=1.2.0
@@ -53,41 +51,24 @@ Requires-Dist: alembic>=0.8.10; extra == "database"
53
51
  Requires-Dist: SQLAlchemy-Utils>=0.30.11; extra == "database"
54
52
  Requires-Dist: PyMySQL>=0.7.6; extra == "database"
55
53
  Requires-Dist: psycopg2>=2.8.0; extra == "database"
56
- Provides-Extra: test
57
- Requires-Dist: kazoo>=2.6.0; extra == "test"
58
- Requires-Dist: redis>=4.0.0; extra == "test"
59
- Requires-Dist: etcd3gw>=2.0.0; extra == "test"
60
- Requires-Dist: kombu>=4.3.0; extra == "test"
61
- Requires-Dist: eventlet>=0.18.2; extra == "test"
62
- Requires-Dist: SQLAlchemy>=1.0.10; extra == "test"
63
- Requires-Dist: alembic>=0.8.10; extra == "test"
64
- Requires-Dist: SQLAlchemy-Utils>=0.30.11; extra == "test"
65
- Requires-Dist: PyMySQL>=0.7.6; extra == "test"
66
- Requires-Dist: psycopg2>=2.8.0; extra == "test"
67
- Requires-Dist: zake>=0.1.6; extra == "test"
68
- Requires-Dist: pydotplus>=2.0.2; extra == "test"
69
- Requires-Dist: oslotest>=3.2.0; extra == "test"
70
- Requires-Dist: testtools>=2.2.0; extra == "test"
71
- Requires-Dist: testscenarios>=0.4; extra == "test"
72
- Requires-Dist: stestr>=2.0.0; extra == "test"
73
- Requires-Dist: pifpaf>=0.10.0; extra == "test"
74
-
75
- ========================
76
- Team and repository tags
77
- ========================
54
+ Dynamic: license-file
55
+ Dynamic: requires-dist
56
+
57
+ TaskFlow
58
+ ========
78
59
 
79
60
  .. image:: https://governance.openstack.org/tc/badges/taskflow.svg
80
- :target: https://governance.openstack.org/tc/reference/tags/index.html
81
61
 
82
62
  .. Change things from this point on
83
63
 
84
- TaskFlow
85
- ========
86
-
87
64
  .. image:: https://img.shields.io/pypi/v/taskflow.svg
88
65
  :target: https://pypi.org/project/taskflow/
89
66
  :alt: Latest Version
90
67
 
68
+ .. image:: https://img.shields.io/pypi/dm/taskflow.svg
69
+ :target: https://pypi.org/project/taskflow/
70
+ :alt: Downloads
71
+
91
72
  A library to do [jobs, tasks, flows] in a highly available, easy to understand
92
73
  and declarative manner (and more!) to be used with OpenStack and other
93
74
  projects.
@@ -145,4 +126,3 @@ We also have sphinx documentation in ``docs/source``.
145
126
  .. _kombu: https://kombu.readthedocs.io/en/latest/
146
127
  .. _eventlet: http://eventlet.net/
147
128
  .. _tox: https://tox.testrun.org/
148
-
@@ -1,19 +1,18 @@
1
- ========================
2
- Team and repository tags
3
- ========================
1
+ TaskFlow
2
+ ========
4
3
 
5
4
  .. image:: https://governance.openstack.org/tc/badges/taskflow.svg
6
- :target: https://governance.openstack.org/tc/reference/tags/index.html
7
5
 
8
6
  .. Change things from this point on
9
7
 
10
- TaskFlow
11
- ========
12
-
13
8
  .. image:: https://img.shields.io/pypi/v/taskflow.svg
14
9
  :target: https://pypi.org/project/taskflow/
15
10
  :alt: Latest Version
16
11
 
12
+ .. image:: https://img.shields.io/pypi/dm/taskflow.svg
13
+ :target: https://pypi.org/project/taskflow/
14
+ :alt: Downloads
15
+
17
16
  A library to do [jobs, tasks, flows] in a highly available, easy to understand
18
17
  and declarative manner (and more!) to be used with OpenStack and other
19
18
  projects.
@@ -0,0 +1,89 @@
1
+ [build-system]
2
+ requires = ["pbr>=6.1.1"]
3
+ build-backend = "pbr.build"
4
+
5
+ [project]
6
+ name = "taskflow"
7
+ description = "Taskflow structured state management library."
8
+ authors = [
9
+ {name = "OpenStack", email = "openstack-discuss@lists.openstack.org"},
10
+ ]
11
+ readme = {file = "README.rst", content-type = "text/x-rst"}
12
+ license = {text = "Apache-2.0"}
13
+ dynamic = ["version", "dependencies"]
14
+ requires-python = ">=3.10"
15
+ classifiers = [
16
+ "Development Status :: 5 - Production/Stable",
17
+ "Environment :: Console",
18
+ "Intended Audience :: Developers",
19
+ "License :: OSI Approved :: Apache Software License",
20
+ "Operating System :: POSIX :: Linux",
21
+ "Programming Language :: Python",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.10",
24
+ "Programming Language :: Python :: 3.11",
25
+ "Programming Language :: Python :: 3.12",
26
+ "Programming Language :: Python :: 3.13",
27
+ "Topic :: Software Development :: Libraries",
28
+ "Topic :: System :: Distributed Computing",
29
+ ]
30
+
31
+ [project.urls]
32
+ Homepage = "https://docs.openstack.org/taskflow"
33
+ Repository = "https://opendev.org/openstack/taskflow"
34
+
35
+ [project.optional-dependencies]
36
+ # NOTE(dhellmann): The entries in this section of the file need to be
37
+ # kept consistent with the entries in test-requirements.txt.
38
+ zookeeper = [
39
+ "kazoo>=2.6.0", # Apache-2.0
40
+ ]
41
+ redis = [
42
+ "redis>=4.0.0", # MIT
43
+ ]
44
+ etcd = [
45
+ "etcd3gw>=2.0.0", # Apache-2.0
46
+ ]
47
+ workers = [
48
+ "kombu>=4.3.0", # BSD
49
+ ]
50
+ eventlet = [
51
+ "eventlet>=0.18.2", # MIT
52
+ ]
53
+ database = [
54
+ "SQLAlchemy>=1.0.10", # MIT
55
+ "alembic>=0.8.10", # MIT
56
+ "SQLAlchemy-Utils>=0.30.11", # BSD License
57
+ "PyMySQL>=0.7.6", # MIT License
58
+ "psycopg2>=2.8.0", # LGPL/ZPL
59
+ ]
60
+
61
+ [project.entry-points."taskflow.jobboards"]
62
+ zookeeper = "taskflow.jobs.backends.impl_zookeeper:ZookeeperJobBoard"
63
+ redis = "taskflow.jobs.backends.impl_redis:RedisJobBoard"
64
+ etcd = "taskflow.jobs.backends.impl_etcd:EtcdJobBoard"
65
+
66
+ [project.entry-points."taskflow.conductors"]
67
+ blocking = "taskflow.conductors.backends.impl_blocking:BlockingConductor"
68
+ nonblocking = "taskflow.conductors.backends.impl_nonblocking:NonBlockingConductor"
69
+
70
+ [project.entry-points."taskflow.persistence"]
71
+ dir = "taskflow.persistence.backends.impl_dir:DirBackend"
72
+ file = "taskflow.persistence.backends.impl_dir:DirBackend"
73
+ memory = "taskflow.persistence.backends.impl_memory:MemoryBackend"
74
+ mysql = "taskflow.persistence.backends.impl_sqlalchemy:SQLAlchemyBackend"
75
+ postgresql = "taskflow.persistence.backends.impl_sqlalchemy:SQLAlchemyBackend"
76
+ sqlite = "taskflow.persistence.backends.impl_sqlalchemy:SQLAlchemyBackend"
77
+ zookeeper = "taskflow.persistence.backends.impl_zookeeper:ZkBackend"
78
+
79
+ [project.entry-points."taskflow.engines"]
80
+ default = "taskflow.engines.action_engine.engine:SerialActionEngine"
81
+ serial = "taskflow.engines.action_engine.engine:SerialActionEngine"
82
+ parallel = "taskflow.engines.action_engine.engine:ParallelActionEngine"
83
+ worker-based = "taskflow.engines.worker_based.engine:WorkerBasedActionEngine"
84
+ workers = "taskflow.engines.worker_based.engine:WorkerBasedActionEngine"
85
+
86
+ [tool.setuptools]
87
+ packages = [
88
+ "taskflow"
89
+ ]
@@ -0,0 +1,5 @@
1
+ ---
2
+ features:
3
+ - |
4
+ Support for Python 3.9 has been removed. Now the minimum python version
5
+ supported is 3.10.
@@ -3,4 +3,4 @@
3
3
  ===========================
4
4
 
5
5
  .. release-notes::
6
- :branch: stable/2024.1
6
+ :branch: unmaintained/2024.1
@@ -0,0 +1,6 @@
1
+ ===========================
2
+ 2025.2 Series Release Notes
3
+ ===========================
4
+
5
+ .. release-notes::
6
+ :branch: stable/2025.2
@@ -6,6 +6,7 @@
6
6
  :maxdepth: 1
7
7
 
8
8
  unreleased
9
+ 2025.2
9
10
  2025.1
10
11
  2024.2
11
12
  2024.1
@@ -1,7 +1,7 @@
1
1
  #!/bin/bash
2
2
  set -eux
3
3
  if [ -z "$(which etcd)" ]; then
4
- ETCD_VERSION=3.4.27
4
+ ETCD_VERSION=${ETCD_VERSION:-3.5.21}
5
5
  case `uname -s` in
6
6
  Darwin)
7
7
  OS=darwin
@@ -0,0 +1,7 @@
1
+ [metadata]
2
+ name = taskflow
3
+
4
+ [egg_info]
5
+ tag_build =
6
+ tag_date = 0
7
+
@@ -377,7 +377,7 @@ class Atom(metaclass=abc.ABCMeta):
377
377
  """
378
378
 
379
379
  def __str__(self):
380
- return '"{}=={}"'.format(self.name, misc.get_version_string(self))
380
+ return f'"{self.name}=={misc.get_version_string(self)}"'
381
381
 
382
382
  def __repr__(self):
383
- return '<{} {}>'.format(reflection.get_class_name(self), self)
383
+ return f'<{reflection.get_class_name(self)} {self}>'
@@ -121,16 +121,12 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
121
121
  " it has not been")
122
122
 
123
123
  def stop(self):
124
- """Requests the conductor to stop dispatching.
125
-
126
- This method can be used to request that a conductor stop its
127
- consumption & dispatching loop.
128
-
129
- The method returns immediately regardless of whether the conductor has
130
- been stopped.
131
- """
132
124
  self._wait_timeout.interrupt()
133
125
 
126
+ # Inherit the docs, so we can reference them in our class docstring,
127
+ # if we don't do this sphinx gets confused...
128
+ stop.__doc__ = base.Conductor.stop.__doc__
129
+
134
130
  @property
135
131
  def dispatching(self):
136
132
  """Whether or not the dispatching loop is still dispatching."""
@@ -342,14 +338,8 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
342
338
  run.__doc__ = base.Conductor.run.__doc__
343
339
 
344
340
  def wait(self, timeout=None):
345
- """Waits for the conductor to gracefully exit.
346
-
347
- This method waits for the conductor to gracefully exit. An optional
348
- timeout can be provided, which will cause the method to return
349
- within the specified timeout. If the timeout is reached, the returned
350
- value will be ``False``, otherwise it will be ``True``.
351
-
352
- :param timeout: Maximum number of seconds that the :meth:`wait` method
353
- should block for.
354
- """
355
341
  return self._dead.wait(timeout)
342
+
343
+ # Inherit the docs, so we can reference them in our class docstring,
344
+ # if we don't do this sphinx gets confused...
345
+ wait.__doc__ = base.Conductor.wait.__doc__
@@ -161,6 +161,30 @@ class Conductor(metaclass=abc.ABCMeta):
161
161
  forever and/or until stopped).
162
162
  """
163
163
 
164
+ @abc.abstractmethod
165
+ def stop(self):
166
+ """Requests the conductor to stop dispatching.
167
+
168
+ This method can be used to request that a conductor stop its
169
+ consumption & dispatching loop.
170
+
171
+ The method returns immediately regardless of whether the conductor has
172
+ been stopped.
173
+ """
174
+
175
+ @abc.abstractmethod
176
+ def wait(self, timeout=None):
177
+ """Waits for the conductor to gracefully exit.
178
+
179
+ This method waits for the conductor to gracefully exit. An optional
180
+ timeout can be provided, which will cause the method to return
181
+ within the specified timeout. If the timeout is reached, the returned
182
+ value will be ``False``, otherwise it will be ``True``.
183
+
184
+ :param timeout: Maximum number of seconds that the :meth:`wait` method
185
+ should block for.
186
+ """
187
+
164
188
  @abc.abstractmethod
165
189
  def _dispatch_job(self, job):
166
190
  """Dispatches a claimed job for work completion.
@@ -49,7 +49,7 @@ class Terminator:
49
49
 
50
50
  def __init__(self, flow):
51
51
  self._flow = flow
52
- self._name = "{}[$]".format(self._flow.name)
52
+ self._name = f"{self._flow.name}[$]"
53
53
 
54
54
  @property
55
55
  def flow(self):
@@ -143,7 +143,7 @@ class Proxy:
143
143
 
144
144
  def _make_queue(self, routing_key, exchange, channel=None):
145
145
  """Make a named queue for the given exchange."""
146
- queue_name = "{}_{}".format(self._exchange_name, routing_key)
146
+ queue_name = f"{self._exchange_name}_{routing_key}"
147
147
  return kombu.Queue(name=queue_name,
148
148
  routing_key=routing_key, durable=False,
149
149
  exchange=exchange, auto_delete=True,
@@ -43,7 +43,7 @@ def show_time(name):
43
43
  start = time.time()
44
44
  yield
45
45
  end = time.time()
46
- print(" -- {} took {:0.3f} seconds".format(name, end - start))
46
+ print(f" -- {name} took {end - start:0.3f} seconds")
47
47
 
48
48
 
49
49
  # This affects how many volumes to create and how much time to *simulate*
@@ -83,7 +83,7 @@ class VolumeCreator(task.Task):
83
83
  # volume create can be resumed/revert, and is much easier to use for
84
84
  # audit and tracking purposes.
85
85
  base_name = reflection.get_callable_name(self)
86
- super().__init__(name="{}-{}".format(base_name, volume_id))
86
+ super().__init__(name=f"{base_name}-{volume_id}")
87
87
  self._volume_id = volume_id
88
88
 
89
89
  def execute(self):
@@ -65,6 +65,6 @@ print("---------")
65
65
  for path in backend.memory.ls_r(backend.memory.root_path, absolute=True):
66
66
  value = backend.memory[path]
67
67
  if value:
68
- print("{} -> {}".format(path, value))
68
+ print(f"{path} -> {value}")
69
69
  else:
70
70
  print("%s" % (path))
@@ -137,7 +137,7 @@ class ActivateDriver(task.Task):
137
137
  def update_progress(self, progress, **kwargs):
138
138
  # Override the parent method to also print out the status.
139
139
  super().update_progress(progress, **kwargs)
140
- print("{} is {:0.2f}% done".format(self.name, progress * 100))
140
+ print(f"{self.name} is {progress * 100:0.2f}% done")
141
141
 
142
142
 
143
143
  class DeclareSuccess(task.Task):
@@ -97,7 +97,7 @@ print("Single threaded engine result %s" % result)
97
97
  for (name, value) in expected:
98
98
  actual = result.get(name)
99
99
  if actual != value:
100
- sys.stderr.write("{} != {}\n".format(actual, value))
100
+ sys.stderr.write(f"{actual} != {value}\n")
101
101
  unexpected += 1
102
102
 
103
103
  result = taskflow.engines.run(
@@ -107,7 +107,7 @@ print("Multi threaded engine result %s" % result)
107
107
  for (name, value) in expected:
108
108
  actual = result.get(name)
109
109
  if actual != value:
110
- sys.stderr.write("{} != {}\n".format(actual, value))
110
+ sys.stderr.write(f"{actual} != {value}\n")
111
111
  unexpected += 1
112
112
 
113
113
  if unexpected:
@@ -41,7 +41,7 @@ class PrinterTask(task.Task):
41
41
 
42
42
  def execute(self, output):
43
43
  if self._show_name:
44
- print("{}: {}".format(self.name, output))
44
+ print(f"{self.name}: {output}")
45
45
  else:
46
46
  print(output)
47
47
 
@@ -82,9 +82,9 @@ def dispatch_work(job):
82
82
  def safe_print(name, message, prefix=""):
83
83
  with STDOUT_LOCK:
84
84
  if prefix:
85
- print("{} {}: {}".format(prefix, name, message))
85
+ print(f"{prefix} {name}: {message}")
86
86
  else:
87
- print("{}: {}".format(name, message))
87
+ print(f"{name}: {message}")
88
88
 
89
89
 
90
90
  def worker(ident, client, consumed):
@@ -136,7 +136,7 @@ def producer(ident, client):
136
136
  safe_print(name, "started")
137
137
  with backends.backend(name, SHARED_CONF.copy(), client=client) as board:
138
138
  for i in range(0, PRODUCER_UNITS):
139
- job_name = "{}-{}".format(name, i)
139
+ job_name = f"{name}-{i}"
140
140
  details = {
141
141
  'color': random.choice(['red', 'blue']),
142
142
  }
@@ -65,7 +65,7 @@ class CallTask(task.Task):
65
65
  """Task that calls person by number."""
66
66
 
67
67
  def execute(self, person, number):
68
- print('Calling {} {}.'.format(person, number))
68
+ print(f'Calling {person} {number}.')
69
69
 
70
70
  # This is how it works for one person:
71
71
 
@@ -82,7 +82,7 @@ taskflow.engines.run(simple_flow, store={'person': 'Josh'})
82
82
  # we use `rebind` argument of task constructor.
83
83
  def subflow_factory(prefix):
84
84
  def pr(what):
85
- return '{}-{}'.format(prefix, what)
85
+ return f'{prefix}-{what}'
86
86
 
87
87
  return lf.Flow(pr('flow')).add(
88
88
  FetchNumberTask(pr('fetch'),
@@ -60,7 +60,7 @@ import example_utils as eu # noqa
60
60
 
61
61
  def print_task_states(flowdetail, msg):
62
62
  eu.print_wrapped(msg)
63
- print("Flow '{}' state: {}".format(flowdetail.name, flowdetail.state))
63
+ print(f"Flow '{flowdetail.name}' state: {flowdetail.state}")
64
64
  # Sort by these so that our test validation doesn't get confused by the
65
65
  # order in which the items in the flow detail can be in.
66
66
  items = sorted((td.name, td.version, td.state, td.results)
@@ -37,7 +37,7 @@ FINISHED_STATES = (states.SUCCESS, states.FAILURE, states.REVERTED)
37
37
 
38
38
 
39
39
  def resume(flowdetail, backend):
40
- print('Resuming flow {} {}'.format(flowdetail.name, flowdetail.uuid))
40
+ print(f'Resuming flow {flowdetail.name} {flowdetail.uuid}')
41
41
  engine = taskflow.engines.load_from_detail(flow_detail=flowdetail,
42
42
  backend=backend)
43
43
  engine.run()
@@ -110,7 +110,7 @@ class DownloadImages(task.Task):
110
110
  def execute(self, image_locations):
111
111
  for src, loc in image_locations.items():
112
112
  with slow_down(1):
113
- print("Downloading from {} => {}".format(src, loc))
113
+ print(f"Downloading from {src} => {loc}")
114
114
  return sorted(image_locations.values())
115
115
 
116
116
 
@@ -149,7 +149,7 @@ class WriteNetworkSettings(task.Task):
149
149
  def execute(self, download_paths, network_settings):
150
150
  for j, path in enumerate(download_paths):
151
151
  with slow_down(1):
152
- print("Mounting {} to /tmp/{}".format(path, j))
152
+ print(f"Mounting {path} to /tmp/{j}")
153
153
  for i, setting in enumerate(network_settings):
154
154
  filename = ("/tmp/etc/sysconfig/network-scripts/"
155
155
  "ifcfg-eth%s" % (i))
@@ -49,4 +49,4 @@ e.compile()
49
49
  e.prepare()
50
50
 
51
51
  for i, st in enumerate(e.run_iter(), 1):
52
- print("Transition {}: {}".format(i, st))
52
+ print(f"Transition {i}: {st}")
@@ -45,7 +45,7 @@ class DelayedTask(task.Task):
45
45
  self._wait_for = random.random()
46
46
 
47
47
  def execute(self):
48
- print("Running '{}' in thread '{}'".format(self.name, tu.get_ident()))
48
+ print(f"Running '{self.name}' in thread '{tu.get_ident()}'")
49
49
  time.sleep(self._wait_for)
50
50
 
51
51
 
@@ -62,7 +62,7 @@ while entries:
62
62
  path = entries.pop()
63
63
  value = backend.memory[path]
64
64
  if value:
65
- print("{} -> {}".format(path, value))
65
+ print(f"{path} -> {value}")
66
66
  else:
67
67
  print("%s" % (path))
68
68
  entries.extend(os.path.join(path, child)
@@ -58,7 +58,7 @@ from taskflow.utils import threading_utils
58
58
  RUN_TIME = 5
59
59
  REVIEW_CREATION_DELAY = 0.5
60
60
  SCAN_DELAY = 0.1
61
- NAME = "{}_{}".format(socket.getfqdn(), os.getpid())
61
+ NAME = f"{socket.getfqdn()}_{os.getpid()}"
62
62
 
63
63
  # This won't really use zookeeper but will use a local version of it using
64
64
  # the zake library that mimics an actual zookeeper cluster using threads and
@@ -120,7 +120,7 @@ class FailureFormatter:
120
120
  atom_attrs['provides'] = self._mask_keys(
121
121
  provides, self._mask_outputs_keys)
122
122
  if atom_attrs:
123
- return "Atom '{}' {}".format(atom_name, atom_attrs)
123
+ return f"Atom '{atom_name}' {atom_attrs}"
124
124
  else:
125
125
  return "Atom '%s'" % (atom_name)
126
126
  else:
@@ -170,7 +170,7 @@ class FailureFormatter:
170
170
  rooted_tree = builder(graph, atom)
171
171
  child_count = rooted_tree.child_count(only_direct=False)
172
172
  buff.write_nl(
173
- '{} {} (most recent first):'.format(child_count, kind))
173
+ f'{child_count} {kind} (most recent first):')
174
174
  formatter = functools.partial(self._format_node, storage, cache)
175
175
  direct_child_count = rooted_tree.child_count(only_direct=True)
176
176
  for i, child in enumerate(rooted_tree, 1):