taskflow 5.5.0__tar.gz → 5.6.1__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 (349) hide show
  1. taskflow-5.6.1/.zuul.yaml +30 -0
  2. {taskflow-5.5.0 → taskflow-5.6.1}/ChangeLog +15 -0
  3. taskflow-5.6.1/PKG-INFO +136 -0
  4. {taskflow-5.5.0 → taskflow-5.6.1}/bindep.txt +4 -0
  5. taskflow-5.6.1/playbooks/tests/functional/Debian.yaml +5 -0
  6. taskflow-5.6.1/playbooks/tests/functional/RedHat.yaml +5 -0
  7. taskflow-5.6.1/playbooks/tests/functional/pre.yml +21 -0
  8. taskflow-5.6.1/releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml +7 -0
  9. taskflow-5.6.1/releasenotes/notes/fix-revert-all-revert-a0310cd7beaa7409.yaml +6 -0
  10. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/runtime.py +12 -0
  11. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/jobs/backends/impl_redis.py +1 -5
  12. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/jobs/test_redis_job.py +5 -8
  13. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_retries.py +52 -0
  14. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/utils.py +26 -0
  15. taskflow-5.6.1/taskflow.egg-info/PKG-INFO +136 -0
  16. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow.egg-info/SOURCES.txt +5 -0
  17. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow.egg-info/entry_points.txt +0 -1
  18. taskflow-5.6.1/taskflow.egg-info/pbr.json +1 -0
  19. {taskflow-5.5.0 → taskflow-5.6.1}/test-requirements.txt +1 -0
  20. {taskflow-5.5.0 → taskflow-5.6.1}/tox.ini +8 -1
  21. taskflow-5.5.0/.zuul.yaml +0 -33
  22. taskflow-5.5.0/PKG-INFO +0 -108
  23. taskflow-5.5.0/taskflow.egg-info/PKG-INFO +0 -108
  24. taskflow-5.5.0/taskflow.egg-info/pbr.json +0 -1
  25. {taskflow-5.5.0 → taskflow-5.6.1}/.coveragerc +0 -0
  26. {taskflow-5.5.0 → taskflow-5.6.1}/.mailmap +0 -0
  27. {taskflow-5.5.0 → taskflow-5.6.1}/.pre-commit-config.yaml +0 -0
  28. {taskflow-5.5.0 → taskflow-5.6.1}/.stestr.conf +0 -0
  29. {taskflow-5.5.0 → taskflow-5.6.1}/AUTHORS +0 -0
  30. {taskflow-5.5.0 → taskflow-5.6.1}/CONTRIBUTING.rst +0 -0
  31. {taskflow-5.5.0 → taskflow-5.6.1}/LICENSE +0 -0
  32. {taskflow-5.5.0 → taskflow-5.6.1}/README.rst +0 -0
  33. {taskflow-5.5.0 → taskflow-5.6.1}/doc/diagrams/area_of_influence.graffle.tgz +0 -0
  34. {taskflow-5.5.0 → taskflow-5.6.1}/doc/diagrams/core.graffle.tgz +0 -0
  35. {taskflow-5.5.0 → taskflow-5.6.1}/doc/diagrams/jobboard.graffle.tgz +0 -0
  36. {taskflow-5.5.0 → taskflow-5.6.1}/doc/diagrams/tasks.graffle.tgz +0 -0
  37. {taskflow-5.5.0 → taskflow-5.6.1}/doc/diagrams/worker-engine.graffle.tgz +0 -0
  38. {taskflow-5.5.0 → taskflow-5.6.1}/doc/requirements.txt +0 -0
  39. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/conf.py +0 -0
  40. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/index.rst +0 -0
  41. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/templates/layout.html +0 -0
  42. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/arguments_and_results.rst +0 -0
  43. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/atoms.rst +0 -0
  44. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/conductors.rst +0 -0
  45. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/engines.rst +0 -0
  46. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/examples.rst +0 -0
  47. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/exceptions.rst +0 -0
  48. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/history.rst +0 -0
  49. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/area_of_influence.svg +0 -0
  50. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/conductor.png +0 -0
  51. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/conductor_cycle.png +0 -0
  52. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/distributed_flow_rpc.png +0 -0
  53. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/engine_states.svg +0 -0
  54. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/flow_states.svg +0 -0
  55. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/job_states.svg +0 -0
  56. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/jobboard.png +0 -0
  57. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/mandelbrot.png +0 -0
  58. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/retry_states.svg +0 -0
  59. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/task_states.svg +0 -0
  60. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/tasks.png +0 -0
  61. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/wbe_request_states.svg +0 -0
  62. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/img/worker-engine.svg +0 -0
  63. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/index.rst +0 -0
  64. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/inputs_and_outputs.rst +0 -0
  65. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/jobs.rst +0 -0
  66. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/notifications.rst +0 -0
  67. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/patterns.rst +0 -0
  68. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/persistence.rst +0 -0
  69. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/resumption.rst +0 -0
  70. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/shelf.rst +0 -0
  71. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/states.rst +0 -0
  72. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/types.rst +0 -0
  73. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/utils.rst +0 -0
  74. {taskflow-5.5.0 → taskflow-5.6.1}/doc/source/user/workers.rst +0 -0
  75. {taskflow-5.5.0 → taskflow-5.6.1}/pylintrc +0 -0
  76. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/.placeholder +0 -0
  77. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml +0 -0
  78. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml +0 -0
  79. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml +0 -0
  80. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml +0 -0
  81. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml +0 -0
  82. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml +0 -0
  83. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/redis-username-df0eb33869db09a2.yaml +0 -0
  84. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/remove-strict-redis-f2a5a924b314de41.yaml +0 -0
  85. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/sentinel-fallbacks-6fe2ab0d68959cdf.yaml +0 -0
  86. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/sentinel-ssl-399c56ed7067d282.yaml +0 -0
  87. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/sentinel-use-redis-creds-63f58b12ad46a2b5.yaml +0 -0
  88. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/notes/zookeeper-ssl-support-b9abf24a39096b62.yaml +0 -0
  89. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/2023.1.rst +0 -0
  90. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/2023.2.rst +0 -0
  91. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/_static/.placeholder +0 -0
  92. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/_templates/.placeholder +0 -0
  93. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/conf.py +0 -0
  94. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/index.rst +0 -0
  95. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/ocata.rst +0 -0
  96. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/pike.rst +0 -0
  97. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/queens.rst +0 -0
  98. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/rocky.rst +0 -0
  99. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/stein.rst +0 -0
  100. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/train.rst +0 -0
  101. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/unreleased.rst +0 -0
  102. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/ussuri.rst +0 -0
  103. {taskflow-5.5.0 → taskflow-5.6.1}/releasenotes/source/victoria.rst +0 -0
  104. {taskflow-5.5.0 → taskflow-5.6.1}/requirements.txt +0 -0
  105. {taskflow-5.5.0 → taskflow-5.6.1}/run_tests.sh +0 -0
  106. {taskflow-5.5.0 → taskflow-5.6.1}/setup.cfg +0 -0
  107. {taskflow-5.5.0 → taskflow-5.6.1}/setup.py +0 -0
  108. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/__init__.py +0 -0
  109. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/atom.py +0 -0
  110. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/conductors/__init__.py +0 -0
  111. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/conductors/backends/__init__.py +0 -0
  112. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/conductors/backends/impl_blocking.py +0 -0
  113. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/conductors/backends/impl_executor.py +0 -0
  114. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/conductors/backends/impl_nonblocking.py +0 -0
  115. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/conductors/base.py +0 -0
  116. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/contrib/__init__.py +0 -0
  117. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/deciders.py +0 -0
  118. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/__init__.py +0 -0
  119. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/__init__.py +0 -0
  120. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/actions/__init__.py +0 -0
  121. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/actions/base.py +0 -0
  122. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/actions/retry.py +0 -0
  123. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/actions/task.py +0 -0
  124. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/builder.py +0 -0
  125. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/compiler.py +0 -0
  126. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/completer.py +0 -0
  127. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/deciders.py +0 -0
  128. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/engine.py +0 -0
  129. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/executor.py +0 -0
  130. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/process_executor.py +0 -0
  131. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/scheduler.py +0 -0
  132. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/scopes.py +0 -0
  133. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/selector.py +0 -0
  134. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/action_engine/traversal.py +0 -0
  135. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/base.py +0 -0
  136. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/helpers.py +0 -0
  137. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/__init__.py +0 -0
  138. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/dispatcher.py +0 -0
  139. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/endpoint.py +0 -0
  140. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/engine.py +0 -0
  141. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/executor.py +0 -0
  142. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/protocol.py +0 -0
  143. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/proxy.py +0 -0
  144. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/server.py +0 -0
  145. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/types.py +0 -0
  146. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/engines/worker_based/worker.py +0 -0
  147. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/99_bottles.py +0 -0
  148. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/alphabet_soup.py +0 -0
  149. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/build_a_car.py +0 -0
  150. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/buildsystem.py +0 -0
  151. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/calculate_in_parallel.py +0 -0
  152. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/calculate_linear.py +0 -0
  153. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/create_parallel_volume.py +0 -0
  154. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/delayed_return.py +0 -0
  155. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/distance_calculator.py +0 -0
  156. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/dump_memory_backend.py +0 -0
  157. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/echo_listener.py +0 -0
  158. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/example_utils.py +0 -0
  159. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/fake_billing.py +0 -0
  160. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/graph_flow.py +0 -0
  161. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/hello_world.py +0 -0
  162. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/jobboard_produce_consume_colors.py +0 -0
  163. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/parallel_table_multiply.py +0 -0
  164. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/persistence_example.py +0 -0
  165. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/pseudo_scoping.out.txt +0 -0
  166. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/pseudo_scoping.py +0 -0
  167. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_from_backend.out.txt +0 -0
  168. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_from_backend.py +0 -0
  169. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_many_flows/my_flows.py +0 -0
  170. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_many_flows/resume_all.py +0 -0
  171. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_many_flows/run_flow.py +0 -0
  172. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_many_flows.out.txt +0 -0
  173. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_many_flows.py +0 -0
  174. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_vm_boot.py +0 -0
  175. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/resume_volume_create.py +0 -0
  176. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/retry_flow.out.txt +0 -0
  177. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/retry_flow.py +0 -0
  178. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/reverting_linear.out.txt +0 -0
  179. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/reverting_linear.py +0 -0
  180. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/run_by_iter.out.txt +0 -0
  181. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/run_by_iter.py +0 -0
  182. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/run_by_iter_enumerate.out.txt +0 -0
  183. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/run_by_iter_enumerate.py +0 -0
  184. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/share_engine_thread.py +0 -0
  185. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/simple_linear.out.txt +0 -0
  186. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/simple_linear.py +0 -0
  187. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/simple_linear_listening.out.txt +0 -0
  188. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/simple_linear_listening.py +0 -0
  189. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/simple_linear_pass.out.txt +0 -0
  190. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/simple_linear_pass.py +0 -0
  191. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/simple_map_reduce.py +0 -0
  192. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/switch_graph_flow.py +0 -0
  193. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/timing_listener.py +0 -0
  194. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/tox_conductor.py +0 -0
  195. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/wbe_event_sender.py +0 -0
  196. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/wbe_mandelbrot.out.txt +0 -0
  197. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/wbe_mandelbrot.py +0 -0
  198. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/wbe_simple_linear.out.txt +0 -0
  199. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/wbe_simple_linear.py +0 -0
  200. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/examples/wrapped_exception.py +0 -0
  201. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/exceptions.py +0 -0
  202. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/flow.py +0 -0
  203. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/formatters.py +0 -0
  204. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/jobs/__init__.py +0 -0
  205. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/jobs/backends/__init__.py +0 -0
  206. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/jobs/backends/impl_zookeeper.py +0 -0
  207. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/jobs/base.py +0 -0
  208. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/listeners/__init__.py +0 -0
  209. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/listeners/base.py +0 -0
  210. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/listeners/capturing.py +0 -0
  211. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/listeners/claims.py +0 -0
  212. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/listeners/logging.py +0 -0
  213. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/listeners/printing.py +0 -0
  214. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/listeners/timing.py +0 -0
  215. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/logging.py +0 -0
  216. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/patterns/__init__.py +0 -0
  217. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/patterns/graph_flow.py +0 -0
  218. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/patterns/linear_flow.py +0 -0
  219. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/patterns/unordered_flow.py +0 -0
  220. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/__init__.py +0 -0
  221. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/__init__.py +0 -0
  222. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/impl_dir.py +0 -0
  223. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/impl_memory.py +0 -0
  224. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/impl_sqlalchemy.py +0 -0
  225. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/impl_zookeeper.py +0 -0
  226. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/__init__.py +0 -0
  227. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/README +0 -0
  228. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/alembic.ini +0 -0
  229. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/env.py +0 -0
  230. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/script.py.mako +0 -0
  231. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/0bc3e1a3c135_set_result_meduimtext_type.py +0 -0
  232. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/14b227d79a87_add_intention_column.py +0 -0
  233. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1c783c0c2875_replace_exception_an.py +0 -0
  234. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1cea328f0f65_initial_logbook_deta.py +0 -0
  235. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/2ad4984f2864_switch_postgres_to_json_native.py +0 -0
  236. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/3162c0f3f8e4_add_revert_results_and_revert_failure_.py +0 -0
  237. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/40fc8c914bd2_fix_atomdetails_failure_size.py +0 -0
  238. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/589dccdf2b6e_rename_taskdetails_to_atomdetails.py +0 -0
  239. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/6df9422fcb43_fix_flowdetails_meta_size.py +0 -0
  240. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/84d6e888850_add_task_detail_type.py +0 -0
  241. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/README +0 -0
  242. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/migration.py +0 -0
  243. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/backends/sqlalchemy/tables.py +0 -0
  244. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/base.py +0 -0
  245. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/models.py +0 -0
  246. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/persistence/path_based.py +0 -0
  247. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/retry.py +0 -0
  248. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/states.py +0 -0
  249. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/storage.py +0 -0
  250. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/task.py +0 -0
  251. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/test.py +0 -0
  252. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/__init__.py +0 -0
  253. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/fixtures.py +0 -0
  254. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/test_examples.py +0 -0
  255. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/__init__.py +0 -0
  256. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/action_engine/__init__.py +0 -0
  257. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/action_engine/test_builder.py +0 -0
  258. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/action_engine/test_compile.py +0 -0
  259. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/action_engine/test_creation.py +0 -0
  260. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/action_engine/test_process_executor.py +0 -0
  261. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/action_engine/test_scoping.py +0 -0
  262. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/jobs/__init__.py +0 -0
  263. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/jobs/base.py +0 -0
  264. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/jobs/test_entrypoint.py +0 -0
  265. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/jobs/test_zk_job.py +0 -0
  266. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/patterns/__init__.py +0 -0
  267. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/patterns/test_graph_flow.py +0 -0
  268. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/patterns/test_linear_flow.py +0 -0
  269. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/patterns/test_unordered_flow.py +0 -0
  270. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/persistence/__init__.py +0 -0
  271. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/persistence/base.py +0 -0
  272. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/persistence/test_dir_persistence.py +0 -0
  273. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/persistence/test_memory_persistence.py +0 -0
  274. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/persistence/test_sql_persistence.py +0 -0
  275. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/persistence/test_zk_persistence.py +0 -0
  276. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_arguments_passing.py +0 -0
  277. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_check_transition.py +0 -0
  278. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_conductors.py +0 -0
  279. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_deciders.py +0 -0
  280. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_engine_helpers.py +0 -0
  281. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_engines.py +0 -0
  282. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_exceptions.py +0 -0
  283. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_failure.py +0 -0
  284. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_flow_dependencies.py +0 -0
  285. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_formatters.py +0 -0
  286. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_functor_task.py +0 -0
  287. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_listeners.py +0 -0
  288. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_mapfunctor_task.py +0 -0
  289. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_notifier.py +0 -0
  290. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_progress.py +0 -0
  291. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_reducefunctor_task.py +0 -0
  292. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_states.py +0 -0
  293. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_storage.py +0 -0
  294. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_suspend.py +0 -0
  295. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_task.py +0 -0
  296. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_types.py +0 -0
  297. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_utils.py +0 -0
  298. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_utils_async_utils.py +0 -0
  299. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_utils_binary.py +0 -0
  300. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_utils_iter_utils.py +0 -0
  301. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_utils_kazoo_utils.py +0 -0
  302. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/test_utils_threading_utils.py +0 -0
  303. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/__init__.py +0 -0
  304. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_creation.py +0 -0
  305. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_dispatcher.py +0 -0
  306. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_endpoint.py +0 -0
  307. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_executor.py +0 -0
  308. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_message_pump.py +0 -0
  309. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_pipeline.py +0 -0
  310. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_protocol.py +0 -0
  311. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_proxy.py +0 -0
  312. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_server.py +0 -0
  313. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_types.py +0 -0
  314. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/tests/unit/worker_based/test_worker.py +0 -0
  315. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/__init__.py +0 -0
  316. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/entity.py +0 -0
  317. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/failure.py +0 -0
  318. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/graph.py +0 -0
  319. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/latch.py +0 -0
  320. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/notifier.py +0 -0
  321. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/sets.py +0 -0
  322. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/timing.py +0 -0
  323. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/types/tree.py +0 -0
  324. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/__init__.py +0 -0
  325. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/async_utils.py +0 -0
  326. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/banner.py +0 -0
  327. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/eventlet_utils.py +0 -0
  328. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/iter_utils.py +0 -0
  329. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/kazoo_utils.py +0 -0
  330. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/kombu_utils.py +0 -0
  331. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/misc.py +0 -0
  332. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/persistence_utils.py +0 -0
  333. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/redis_utils.py +0 -0
  334. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/schema_utils.py +0 -0
  335. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/utils/threading_utils.py +0 -0
  336. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow/version.py +0 -0
  337. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow.egg-info/dependency_links.txt +0 -0
  338. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow.egg-info/not-zip-safe +0 -0
  339. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow.egg-info/requires.txt +14 -14
  340. {taskflow-5.5.0 → taskflow-5.6.1}/taskflow.egg-info/top_level.txt +0 -0
  341. {taskflow-5.5.0 → taskflow-5.6.1}/tools/clear_zk.sh +0 -0
  342. {taskflow-5.5.0 → taskflow-5.6.1}/tools/env_builder.sh +0 -0
  343. {taskflow-5.5.0 → taskflow-5.6.1}/tools/pretty_tox.sh +0 -0
  344. {taskflow-5.5.0 → taskflow-5.6.1}/tools/schema_generator.py +0 -0
  345. {taskflow-5.5.0 → taskflow-5.6.1}/tools/speed_test.py +0 -0
  346. {taskflow-5.5.0 → taskflow-5.6.1}/tools/state_graph.py +0 -0
  347. {taskflow-5.5.0 → taskflow-5.6.1}/tools/subunit_trace.py +0 -0
  348. {taskflow-5.5.0 → taskflow-5.6.1}/tools/test-setup.sh +0 -0
  349. {taskflow-5.5.0 → taskflow-5.6.1}/tools/update_states.sh +0 -0
@@ -0,0 +1,30 @@
1
+ - job:
2
+ name: taskflow-functional
3
+ parent: openstack-tox
4
+ abstract: true
5
+ pre-run: playbooks/tests/functional/pre.yml
6
+ vars:
7
+ tox_envlist: functional
8
+
9
+ - job:
10
+ name: taskflow-functional-redis
11
+ parent: taskflow-functional
12
+ vars:
13
+ tox_environment:
14
+ PIFPAF_DAEMON: redis
15
+
16
+ - project:
17
+ templates:
18
+ - check-requirements
19
+ - lib-forward-testing-python3
20
+ - openstack-cover-jobs
21
+ - openstack-python3-jobs
22
+ - periodic-stable-jobs
23
+ - publish-openstack-docs-pti
24
+ - release-notes-jobs-python3
25
+ check:
26
+ jobs:
27
+ - taskflow-functional-redis
28
+ gate:
29
+ jobs:
30
+ - taskflow-functional-redis
@@ -1,6 +1,21 @@
1
1
  CHANGES
2
2
  =======
3
3
 
4
+ 5.6.1
5
+ -----
6
+
7
+ * Fix REVERT\_ALL with Retries in unordered Flows
8
+ * Remove SQLAlchemy tips jobs
9
+ * Add functional job with redis enabled
10
+ * Fix broken unit tests for redis jobboard driver
11
+
12
+ 5.6.0
13
+ -----
14
+
15
+ * Revert "Use consistent credential for Redis and Redis Sentinel"
16
+ * Update TOX\_CONSTRAINTS\_FILE for stable/2024.1
17
+ * Update .gitreview for stable/2024.1
18
+
4
19
  5.5.0
5
20
  -----
6
21
 
@@ -0,0 +1,136 @@
1
+ Metadata-Version: 2.1
2
+ Name: taskflow
3
+ Version: 5.6.1
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
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Environment :: OpenStack
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3 :: Only
22
+ Classifier: Programming Language :: Python :: Implementation :: CPython
23
+ Classifier: Topic :: Software Development :: Libraries
24
+ Classifier: Topic :: System :: Distributed Computing
25
+ Requires-Python: >=3.8
26
+ License-File: LICENSE
27
+ Requires-Dist: pbr!=2.1.0,>=2.0.0
28
+ Requires-Dist: futurist>=1.2.0
29
+ Requires-Dist: fasteners>=0.17.3
30
+ Requires-Dist: networkx>=2.1.0
31
+ Requires-Dist: stevedore>=1.20.0
32
+ Requires-Dist: jsonschema>=3.2.0
33
+ Requires-Dist: automaton>=1.9.0
34
+ Requires-Dist: oslo.utils>=3.33.0
35
+ Requires-Dist: oslo.serialization!=2.19.1,>=2.18.0
36
+ Requires-Dist: tenacity>=6.0.0
37
+ Requires-Dist: cachetools>=2.0.0
38
+ Requires-Dist: pydot>=1.2.4
39
+ Provides-Extra: zookeeper
40
+ Requires-Dist: kazoo>=2.6.0; extra == "zookeeper"
41
+ Requires-Dist: zake>=0.1.6; extra == "zookeeper"
42
+ Provides-Extra: redis
43
+ Requires-Dist: redis>=4.0.0; extra == "redis"
44
+ Provides-Extra: workers
45
+ Requires-Dist: kombu>=4.3.0; extra == "workers"
46
+ Provides-Extra: eventlet
47
+ Requires-Dist: eventlet!=0.18.3,!=0.20.1,!=0.21.0,>=0.18.2; extra == "eventlet"
48
+ Provides-Extra: database
49
+ Requires-Dist: SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10; extra == "database"
50
+ Requires-Dist: alembic>=0.8.10; extra == "database"
51
+ Requires-Dist: SQLAlchemy-Utils>=0.30.11; extra == "database"
52
+ Requires-Dist: PyMySQL>=0.7.6; extra == "database"
53
+ Requires-Dist: psycopg2>=2.8.0; extra == "database"
54
+ Provides-Extra: test
55
+ Requires-Dist: pydotplus>=2.0.2; extra == "test"
56
+ Requires-Dist: hacking<0.11,>=0.10.0; extra == "test"
57
+ Requires-Dist: oslotest>=3.2.0; extra == "test"
58
+ Requires-Dist: mock>=2.0.0; extra == "test"
59
+ Requires-Dist: testtools>=2.2.0; extra == "test"
60
+ Requires-Dist: testscenarios>=0.4; extra == "test"
61
+ Requires-Dist: stestr>=2.0.0; extra == "test"
62
+
63
+ ========================
64
+ Team and repository tags
65
+ ========================
66
+
67
+ .. image:: https://governance.openstack.org/tc/badges/taskflow.svg
68
+ :target: https://governance.openstack.org/tc/reference/tags/index.html
69
+
70
+ .. Change things from this point on
71
+
72
+ TaskFlow
73
+ ========
74
+
75
+ .. image:: https://img.shields.io/pypi/v/taskflow.svg
76
+ :target: https://pypi.org/project/taskflow/
77
+ :alt: Latest Version
78
+
79
+ A library to do [jobs, tasks, flows] in a highly available, easy to understand
80
+ and declarative manner (and more!) to be used with OpenStack and other
81
+ projects.
82
+
83
+ * Free software: Apache license
84
+ * Documentation: https://docs.openstack.org/taskflow/latest/
85
+ * Source: https://opendev.org/openstack/taskflow
86
+ * Bugs: https://bugs.launchpad.net/taskflow/
87
+ * Release notes: https://docs.openstack.org/releasenotes/taskflow/
88
+
89
+ Join us
90
+ -------
91
+
92
+ - https://launchpad.net/taskflow
93
+
94
+ Testing and requirements
95
+ ------------------------
96
+
97
+ Requirements
98
+ ~~~~~~~~~~~~
99
+
100
+ Because this project has many optional (pluggable) parts like persistence
101
+ backends and engines, we decided to split our requirements into two
102
+ parts: - things that are absolutely required (you can't use the project
103
+ without them) are put into ``requirements.txt``. The requirements
104
+ that are required by some optional part of this project (you can use the
105
+ project without them) are put into our ``test-requirements.txt`` file (so
106
+ that we can still test the optional functionality works as expected). If
107
+ you want to use the feature in question (`eventlet`_ or the worker based engine
108
+ that uses `kombu`_ or the `sqlalchemy`_ persistence backend or jobboards which
109
+ have an implementation built using `kazoo`_ ...), you should add
110
+ that requirement(s) to your project or environment.
111
+
112
+ Tox.ini
113
+ ~~~~~~~
114
+
115
+ Our ``tox.ini`` file describes several test environments that allow to test
116
+ TaskFlow with different python versions and sets of requirements installed.
117
+ Please refer to the `tox`_ documentation to understand how to make these test
118
+ environments work for you.
119
+
120
+ Developer documentation
121
+ -----------------------
122
+
123
+ We also have sphinx documentation in ``docs/source``.
124
+
125
+ *To build it, run:*
126
+
127
+ ::
128
+
129
+ $ python setup.py build_sphinx
130
+
131
+ .. _kazoo: https://kazoo.readthedocs.io/en/latest/
132
+ .. _sqlalchemy: https://www.sqlalchemy.org/
133
+ .. _kombu: https://kombu.readthedocs.io/en/latest/
134
+ .. _eventlet: http://eventlet.net/
135
+ .. _tox: https://tox.testrun.org/
136
+
@@ -15,3 +15,7 @@ mysql-server [platform:dpkg !platform:debian]
15
15
  postgresql
16
16
  postgresql-client [platform:dpkg]
17
17
  libpq-dev [platform:dpkg]
18
+
19
+ redis [platform:rpm tests-functional-redis]
20
+ redis-server [platform:dpkg tests-functional-redis]
21
+ redis-sentinel [platform:dpkg tests-functional-redis]
@@ -0,0 +1,5 @@
1
+ ---
2
+ backend_services_map:
3
+ redis:
4
+ - redis-server
5
+ - redis-sentinel
@@ -0,0 +1,5 @@
1
+ ---
2
+ backend_services_map:
3
+ redis:
4
+ - redis
5
+ - redis-sentinel
@@ -0,0 +1,21 @@
1
+ - hosts: all
2
+ vars:
3
+ taskflow_backend_daemon: "{{ tox_environment.PIFPAF_DAEMON }}"
4
+ roles:
5
+ - role: bindep
6
+ bindep_profile: "tests-functional-{{ taskflow_backend_daemon }}"
7
+ tasks:
8
+ - name: Include OS-specific variables
9
+ include_vars: "{{ ansible_os_family }}.yaml"
10
+ # NOTE(yoctozepto): Debian and Ubuntu have this nasty policy of starting
11
+ # installed services for us. We don't rely on system-wide service and use
12
+ # pifpaf. Unfortunately, default port may conflict with system-wide service.
13
+ # So, for sanity and resource conservation, let's stop it before tests run.
14
+ - name: "Stop backend services"
15
+ service:
16
+ name: "{{ item }}"
17
+ state: stopped
18
+ enabled: no
19
+ become: yes
20
+ loop: "{{ backend_services_map[taskflow_backend_daemon] }}"
21
+
@@ -0,0 +1,7 @@
1
+ ---
2
+ fixes:
3
+ - |
4
+ Redis job board driver no longer uses ``username`` and ``password`` for
5
+ its connections to Redis Sentinel, to restore the previous behavior which
6
+ was already used by some deployment tools. Add credential to
7
+ ``sentinel_kwargs`` to enable authentication for Redis Sentinel.
@@ -0,0 +1,6 @@
1
+ ---
2
+ fixes:
3
+ - |
4
+ Fixed a bug when using retries with unordered flows, a REVERT_ALL triggered
5
+ by one of the subflow was overriden by an other subflow running in parallel,
6
+ leading to an incomplete revert of the flow.
@@ -291,6 +291,18 @@ class Runtime(object):
291
291
  """Resets all the provided atoms to the given state and intention."""
292
292
  tweaked = []
293
293
  for atom in atoms:
294
+ cur_intention = self.storage.get_atom_intention(atom.name)
295
+ # Don't trigger a RETRY if the atom needs to be REVERTED.
296
+ # This is a workaround for a bug when REVERT_ALL is applied to
297
+ # unordered flows
298
+ # (https://bugs.launchpad.net/taskflow/+bug/2043808)
299
+ # A subflow may trigger a REVERT_ALL, all the atoms of all the
300
+ # related subflows are marked as REVERT but a task of a related
301
+ # flow may still be running in another thread. If this task
302
+ # triggers a RETRY, it overrides the previously set REVERT status,
303
+ # breaking the revert path of the flow.
304
+ if cur_intention == st.REVERT and intention == st.RETRY:
305
+ continue
294
306
  if state or intention:
295
307
  tweaked.append((atom, state, intention))
296
308
  if state:
@@ -584,12 +584,8 @@ return cmsgpack.pack(result)
584
584
  sentinels = [(client_conf.pop('host'), client_conf.pop('port'))]
585
585
  for fallback in conf.get('sentinel_fallbacks', []):
586
586
  sentinels.append(cls._parse_sentinel(fallback))
587
- sentinel_kwargs = conf.get('sentinel_kwargs', {})
588
- for key in ('username', 'password', 'socket_timeout'):
589
- if key in conf:
590
- sentinel_kwargs.setdefault(key, conf[key])
591
587
  s = sentinel.Sentinel(sentinels,
592
- sentinel_kwargs=sentinel_kwargs,
588
+ sentinel_kwargs=conf.get('sentinel_kwargs'),
593
589
  **client_conf)
594
590
  return s.master_for(conf['sentinel'])
595
591
  else:
@@ -128,7 +128,7 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
128
128
  'namespace': 'test',
129
129
  'sentinel': 'mymaster',
130
130
  'sentinel_kwargs': {
131
- 'username': 'sentineluser',
131
+ 'username': 'default',
132
132
  'password': 'senitelsecret'
133
133
  }}
134
134
  with mock.patch('redis.sentinel.Sentinel') as mock_sentinel:
@@ -140,7 +140,7 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
140
140
  mock_sentinel.assert_called_once_with(
141
141
  [('127.0.0.1', 26379)],
142
142
  sentinel_kwargs={
143
- 'username': 'sentineluser',
143
+ 'username': 'default',
144
144
  'password': 'senitelsecret'
145
145
  },
146
146
  **test_conf)
@@ -161,14 +161,11 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
161
161
  test_conf = {
162
162
  'username': 'default',
163
163
  'password': 'secret',
164
+ 'sentinel_kwargs': None,
164
165
  }
165
166
  mock_sentinel.assert_called_once_with(
166
167
  [('127.0.0.1', 26379), ('::1', 26379),
167
168
  ('127.0.0.2', 26379), ('localhost', 26379)],
168
- sentinel_kwargs={
169
- 'username': 'default',
170
- 'password': 'secret'
171
- },
172
169
  **test_conf)
173
170
  mock_sentinel().master_for.assert_called_once_with('mymaster')
174
171
 
@@ -179,6 +176,7 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
179
176
  'password': 'secret',
180
177
  'namespace': 'test',
181
178
  'sentinel': 'mymaster',
179
+ 'sentinel_kwargs': None,
182
180
  'ssl': True,
183
181
  'ssl_ca_certs': '/etc/ssl/certs'}
184
182
  with mock.patch('redis.sentinel.Sentinel') as mock_sentinel:
@@ -191,7 +189,6 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
191
189
  }
192
190
  mock_sentinel.assert_called_once_with(
193
191
  [('127.0.0.1', 26379)],
194
- sentinel_kwargs={
195
- 'username': 'default', 'password': 'secret'},
192
+ sentinel_kwargs=None,
196
193
  **test_conf)
197
194
  mock_sentinel().master_for.assert_called_once_with('mymaster')
@@ -15,8 +15,10 @@
15
15
  # under the License.
16
16
 
17
17
  import testtools
18
+ import time
18
19
 
19
20
  import taskflow.engines
21
+ from taskflow.engines.action_engine import executor
20
22
  from taskflow import exceptions as exc
21
23
  from taskflow.patterns import graph_flow as gf
22
24
  from taskflow.patterns import linear_flow as lf
@@ -497,6 +499,56 @@ class RetryTest(utils.EngineTestBase):
497
499
  self.assertRaisesRegex(RuntimeError, '^Woot', engine.run)
498
500
  self.assertRaisesRegex(RuntimeError, '^Woot', engine.run)
499
501
 
502
+ def test_restart_reverted_unordered_flows_with_retries(self):
503
+ now = time.time()
504
+
505
+ # First flow of an unordered flow:
506
+ subflow1 = lf.Flow('subflow1')
507
+
508
+ # * a task that completes in 3 sec with a few retries
509
+ subsubflow1 = lf.Flow('subflow1.subsubflow1',
510
+ retry=utils.RetryFiveTimes())
511
+ subsubflow1.add(utils.SuccessAfter3Sec('subflow1.fail1',
512
+ inject={'start_time': now}))
513
+ subflow1.add(subsubflow1)
514
+
515
+ # * a task that fails and triggers a revert after 5 retries
516
+ subsubflow2 = lf.Flow('subflow1.subsubflow2',
517
+ retry=utils.RetryFiveTimes())
518
+ subsubflow2.add(utils.FailingTask('subflow1.fail2'))
519
+ subflow1.add(subsubflow2)
520
+
521
+ # Second flow of the unordered flow:
522
+ subflow2 = lf.Flow('subflow2')
523
+
524
+ # * a task that always fails and retries
525
+ subsubflow1 = lf.Flow('subflow2.subsubflow1',
526
+ retry=utils.AlwaysRetry())
527
+ subsubflow1.add(utils.FailingTask('subflow2.fail1'))
528
+ subflow2.add(subsubflow1)
529
+
530
+ unordered_flow = uf.Flow('unordered_flow')
531
+ unordered_flow.add(subflow1, subflow2)
532
+
533
+ # Main flow, contains a simple task and an unordered flow
534
+ flow = lf.Flow('test')
535
+ flow.add(utils.NoopTask('task1'))
536
+ flow.add(unordered_flow)
537
+
538
+ engine = self._make_engine(flow)
539
+
540
+ # This test fails when using Green threads, skipping it for now
541
+ if isinstance(engine._task_executor,
542
+ executor.ParallelGreenThreadTaskExecutor):
543
+ self.skipTest("Skipping this test when using green threads.")
544
+
545
+ with utils.CaptureListener(engine) as capturer:
546
+ self.assertRaisesRegex(exc.WrappedFailure,
547
+ '.*RuntimeError: Woot!',
548
+ engine.run)
549
+ # task1 should have been reverted
550
+ self.assertIn('task1.t REVERTED(None)', capturer.values)
551
+
500
552
  def test_run_just_retry(self):
501
553
  flow = utils.OneReturnRetry(provides='x')
502
554
  engine = self._make_engine(flow)
@@ -217,6 +217,32 @@ class FailingTask(ProgressingTask):
217
217
  raise RuntimeError('Woot!')
218
218
 
219
219
 
220
+ class SimpleTask(task.Task):
221
+ def execute(self, time_sleep=0, **kwargs):
222
+ time.sleep(time_sleep)
223
+
224
+
225
+ class SuccessAfter3Sec(task.Task):
226
+ def execute(self, start_time, **kwargs):
227
+ now = time.time()
228
+ if now - start_time >= 3:
229
+ return None
230
+ raise RuntimeError('Woot!')
231
+
232
+
233
+ class RetryFiveTimes(retry.Times):
234
+ def on_failure(self, history, *args, **kwargs):
235
+ if len(history) < 5:
236
+ time.sleep(1)
237
+ return retry.RETRY
238
+ return retry.REVERT_ALL
239
+
240
+
241
+ class AlwaysRetry(retry.Times):
242
+ def on_failure(self, history, *args, **kwargs):
243
+ return retry.RETRY
244
+
245
+
220
246
  class OptionalTask(task.Task):
221
247
  def execute(self, a, b=5):
222
248
  result = a * b
@@ -0,0 +1,136 @@
1
+ Metadata-Version: 2.1
2
+ Name: taskflow
3
+ Version: 5.6.1
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
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Environment :: OpenStack
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3 :: Only
22
+ Classifier: Programming Language :: Python :: Implementation :: CPython
23
+ Classifier: Topic :: Software Development :: Libraries
24
+ Classifier: Topic :: System :: Distributed Computing
25
+ Requires-Python: >=3.8
26
+ License-File: LICENSE
27
+ Requires-Dist: pbr!=2.1.0,>=2.0.0
28
+ Requires-Dist: futurist>=1.2.0
29
+ Requires-Dist: fasteners>=0.17.3
30
+ Requires-Dist: networkx>=2.1.0
31
+ Requires-Dist: stevedore>=1.20.0
32
+ Requires-Dist: jsonschema>=3.2.0
33
+ Requires-Dist: automaton>=1.9.0
34
+ Requires-Dist: oslo.utils>=3.33.0
35
+ Requires-Dist: oslo.serialization!=2.19.1,>=2.18.0
36
+ Requires-Dist: tenacity>=6.0.0
37
+ Requires-Dist: cachetools>=2.0.0
38
+ Requires-Dist: pydot>=1.2.4
39
+ Provides-Extra: zookeeper
40
+ Requires-Dist: kazoo>=2.6.0; extra == "zookeeper"
41
+ Requires-Dist: zake>=0.1.6; extra == "zookeeper"
42
+ Provides-Extra: redis
43
+ Requires-Dist: redis>=4.0.0; extra == "redis"
44
+ Provides-Extra: workers
45
+ Requires-Dist: kombu>=4.3.0; extra == "workers"
46
+ Provides-Extra: eventlet
47
+ Requires-Dist: eventlet!=0.18.3,!=0.20.1,!=0.21.0,>=0.18.2; extra == "eventlet"
48
+ Provides-Extra: database
49
+ Requires-Dist: SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10; extra == "database"
50
+ Requires-Dist: alembic>=0.8.10; extra == "database"
51
+ Requires-Dist: SQLAlchemy-Utils>=0.30.11; extra == "database"
52
+ Requires-Dist: PyMySQL>=0.7.6; extra == "database"
53
+ Requires-Dist: psycopg2>=2.8.0; extra == "database"
54
+ Provides-Extra: test
55
+ Requires-Dist: pydotplus>=2.0.2; extra == "test"
56
+ Requires-Dist: hacking<0.11,>=0.10.0; extra == "test"
57
+ Requires-Dist: oslotest>=3.2.0; extra == "test"
58
+ Requires-Dist: mock>=2.0.0; extra == "test"
59
+ Requires-Dist: testtools>=2.2.0; extra == "test"
60
+ Requires-Dist: testscenarios>=0.4; extra == "test"
61
+ Requires-Dist: stestr>=2.0.0; extra == "test"
62
+
63
+ ========================
64
+ Team and repository tags
65
+ ========================
66
+
67
+ .. image:: https://governance.openstack.org/tc/badges/taskflow.svg
68
+ :target: https://governance.openstack.org/tc/reference/tags/index.html
69
+
70
+ .. Change things from this point on
71
+
72
+ TaskFlow
73
+ ========
74
+
75
+ .. image:: https://img.shields.io/pypi/v/taskflow.svg
76
+ :target: https://pypi.org/project/taskflow/
77
+ :alt: Latest Version
78
+
79
+ A library to do [jobs, tasks, flows] in a highly available, easy to understand
80
+ and declarative manner (and more!) to be used with OpenStack and other
81
+ projects.
82
+
83
+ * Free software: Apache license
84
+ * Documentation: https://docs.openstack.org/taskflow/latest/
85
+ * Source: https://opendev.org/openstack/taskflow
86
+ * Bugs: https://bugs.launchpad.net/taskflow/
87
+ * Release notes: https://docs.openstack.org/releasenotes/taskflow/
88
+
89
+ Join us
90
+ -------
91
+
92
+ - https://launchpad.net/taskflow
93
+
94
+ Testing and requirements
95
+ ------------------------
96
+
97
+ Requirements
98
+ ~~~~~~~~~~~~
99
+
100
+ Because this project has many optional (pluggable) parts like persistence
101
+ backends and engines, we decided to split our requirements into two
102
+ parts: - things that are absolutely required (you can't use the project
103
+ without them) are put into ``requirements.txt``. The requirements
104
+ that are required by some optional part of this project (you can use the
105
+ project without them) are put into our ``test-requirements.txt`` file (so
106
+ that we can still test the optional functionality works as expected). If
107
+ you want to use the feature in question (`eventlet`_ or the worker based engine
108
+ that uses `kombu`_ or the `sqlalchemy`_ persistence backend or jobboards which
109
+ have an implementation built using `kazoo`_ ...), you should add
110
+ that requirement(s) to your project or environment.
111
+
112
+ Tox.ini
113
+ ~~~~~~~
114
+
115
+ Our ``tox.ini`` file describes several test environments that allow to test
116
+ TaskFlow with different python versions and sets of requirements installed.
117
+ Please refer to the `tox`_ documentation to understand how to make these test
118
+ environments work for you.
119
+
120
+ Developer documentation
121
+ -----------------------
122
+
123
+ We also have sphinx documentation in ``docs/source``.
124
+
125
+ *To build it, run:*
126
+
127
+ ::
128
+
129
+ $ python setup.py build_sphinx
130
+
131
+ .. _kazoo: https://kazoo.readthedocs.io/en/latest/
132
+ .. _sqlalchemy: https://www.sqlalchemy.org/
133
+ .. _kombu: https://kombu.readthedocs.io/en/latest/
134
+ .. _eventlet: http://eventlet.net/
135
+ .. _tox: https://tox.testrun.org/
136
+
@@ -58,11 +58,16 @@ doc/source/user/img/task_states.svg
58
58
  doc/source/user/img/tasks.png
59
59
  doc/source/user/img/wbe_request_states.svg
60
60
  doc/source/user/img/worker-engine.svg
61
+ playbooks/tests/functional/Debian.yaml
62
+ playbooks/tests/functional/RedHat.yaml
63
+ playbooks/tests/functional/pre.yml
61
64
  releasenotes/notes/.placeholder
62
65
  releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml
66
+ releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml
63
67
  releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml
64
68
  releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml
65
69
  releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml
70
+ releasenotes/notes/fix-revert-all-revert-a0310cd7beaa7409.yaml
66
71
  releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml
67
72
  releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml
68
73
  releasenotes/notes/redis-username-df0eb33869db09a2.yaml
@@ -21,4 +21,3 @@ mysql = taskflow.persistence.backends.impl_sqlalchemy:SQLAlchemyBackend
21
21
  postgresql = taskflow.persistence.backends.impl_sqlalchemy:SQLAlchemyBackend
22
22
  sqlite = taskflow.persistence.backends.impl_sqlalchemy:SQLAlchemyBackend
23
23
  zookeeper = taskflow.persistence.backends.impl_zookeeper:ZkBackend
24
-
@@ -0,0 +1 @@
1
+ {"git_version": "24c88865", "is_release": true}
@@ -29,5 +29,6 @@ oslotest>=3.2.0 # Apache-2.0
29
29
  testtools>=2.2.0 # MIT
30
30
  testscenarios>=0.4 # Apache-2.0/BSD
31
31
  stestr>=2.0.0 # Apache-2.0
32
+ pifpaf>=0.10.0 # Apache-2.0
32
33
 
33
34
  pre-commit>=2.6.0 # MIT
@@ -9,7 +9,7 @@ setenv =
9
9
  # We need to install a bit more than just `test' because those drivers have
10
10
  # custom tests that we always run
11
11
  deps =
12
- -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
12
+ -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2024.1}
13
13
  -r{toxinidir}/test-requirements.txt
14
14
  -r{toxinidir}/requirements.txt
15
15
  commands =
@@ -23,6 +23,13 @@ commands =
23
23
  sphinx-build -E -W -b html doc/source doc/build/html
24
24
  doc8 doc/source
25
25
 
26
+ [testenv:functional]
27
+ commands =
28
+ find . -type f -name "*.pyc" -delete
29
+ pifpaf -e TAKSFLOW_TEST run {env:PIFPAF_DAEMON} {env:PIFPAF_OPTS} -- stestr run
30
+ allowlist_externals =
31
+ find
32
+
26
33
  [testenv:update-states]
27
34
  deps =
28
35
  {[testenv]deps}
taskflow-5.5.0/.zuul.yaml DELETED
@@ -1,33 +0,0 @@
1
- # Temporary job until SQLAlchemy 2.0 is no longer blocked by upper-requirements
2
- - job:
3
- name: taskflow-tox-py310-with-sqlalchemy-2x
4
- parent: openstack-tox-py310
5
- description: |
6
- Run unit tests with main branch of SQLAlchemy, alembic and oslo.db.
7
- Takes advantage of the base tox job's install-siblings feature.
8
- # The job only tests the latest and shouldn't be run on the stable branches
9
- branches:
10
- regex: ^stable/.*$
11
- negate: true
12
- required-projects:
13
- - name: github.com/sqlalchemy/sqlalchemy
14
- override-checkout: main
15
- - name: github.com/sqlalchemy/alembic
16
- override-checkout: main
17
- - name: openstack/oslo.db
18
-
19
- - project:
20
- templates:
21
- - check-requirements
22
- - lib-forward-testing-python3
23
- - openstack-cover-jobs
24
- - openstack-python3-jobs
25
- - periodic-stable-jobs
26
- - publish-openstack-docs-pti
27
- - release-notes-jobs-python3
28
- check:
29
- jobs:
30
- - taskflow-tox-py310-with-sqlalchemy-2x
31
- gate:
32
- jobs:
33
- - taskflow-tox-py310-with-sqlalchemy-2x