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.
- {taskflow-6.0.1 → taskflow-6.1.0}/.pre-commit-config.yaml +4 -10
- {taskflow-6.0.1 → taskflow-6.1.0}/AUTHORS +1 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/ChangeLog +20 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/PKG-INFO +19 -39
- {taskflow-6.0.1 → taskflow-6.1.0}/README.rst +6 -7
- taskflow-6.1.0/pyproject.toml +89 -0
- taskflow-6.1.0/releasenotes/notes/remove-py39-b6f3ce23fc9ea9b9.yaml +5 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2024.1.rst +1 -1
- taskflow-6.1.0/releasenotes/source/2025.2.rst +6 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/index.rst +1 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/setup-etcd-env.sh +1 -1
- taskflow-6.1.0/setup.cfg +7 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/atom.py +2 -2
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/backends/impl_executor.py +8 -18
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/base.py +24 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/compiler.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/proxy.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/create_parallel_volume.py +2 -2
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/dump_memory_backend.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/fake_billing.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/graph_flow.py +2 -2
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/hello_world.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/jobboard_produce_consume_colors.py +3 -3
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/pseudo_scoping.py +2 -2
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_from_backend.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows/resume_all.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_vm_boot.py +2 -2
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/run_by_iter_enumerate.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/share_engine_thread.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/switch_graph_flow.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/tox_conductor.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/formatters.py +2 -2
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/backends/impl_etcd.py +3 -3
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/backends/impl_redis.py +2 -9
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/timing.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/__init__.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/test.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/base.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/test_sql_persistence.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_proxy.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/graph.py +3 -3
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/sets.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/banner.py +2 -2
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/kazoo_utils.py +2 -2
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/misc.py +1 -3
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/version.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/PKG-INFO +19 -39
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/SOURCES.txt +2 -0
- taskflow-6.1.0/taskflow.egg-info/pbr.json +1 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/requires.txt +0 -19
- {taskflow-6.0.1 → taskflow-6.1.0}/tools/state_graph.py +1 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/tox.ini +4 -0
- taskflow-6.0.1/pyproject.toml +0 -3
- taskflow-6.0.1/setup.cfg +0 -77
- taskflow-6.0.1/taskflow.egg-info/pbr.json +0 -1
- {taskflow-6.0.1 → taskflow-6.1.0}/.coveragerc +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/.mailmap +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/.pylintrc +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/.stestr.conf +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/.zuul.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/CONTRIBUTING.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/LICENSE +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/bindep.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/area_of_influence.graffle.tgz +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/core.graffle.tgz +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/jobboard.graffle.tgz +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/tasks.graffle.tgz +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/diagrams/worker-engine.graffle.tgz +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/requirements.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/conf.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/index.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/templates/layout.html +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/arguments_and_results.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/atoms.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/conductors.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/engines.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/examples.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/exceptions.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/history.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/area_of_influence.svg +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/conductor.png +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/conductor_cycle.png +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/distributed_flow_rpc.png +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/engine_states.svg +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/flow_states.svg +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/job_states.svg +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/jobboard.png +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/mandelbrot.png +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/retry_states.svg +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/task_states.svg +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/tasks.png +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/wbe_request_states.svg +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/img/worker-engine.svg +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/index.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/inputs_and_outputs.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/jobs.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/notifications.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/patterns.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/persistence.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/resumption.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/shelf.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/states.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/types.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/utils.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/doc/source/user/workers.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/playbooks/tests/functional/Debian.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/playbooks/tests/functional/RedHat.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/playbooks/tests/functional/pre.yml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/.placeholder +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/deprecate-eventlet-df4a34a7d56acc47.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/disable-process_executor-python-312-d1074c816bc8303e.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/etcd-jobboard-backend-8a9fea2238fb0f12.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-revert-all-revert-a0310cd7beaa7409.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/mask-keys-74b9bb5c420d8091.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/redis-username-df0eb33869db09a2.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/remove-process_executor-f59d40a5dd287cd7.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/remove-py38-15af791146f479e1.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/remove-strict-redis-f2a5a924b314de41.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/sentinel-fallbacks-6fe2ab0d68959cdf.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/sentinel-ssl-399c56ed7067d282.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/sentinel-use-redis-creds-63f58b12ad46a2b5.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/notes/zookeeper-ssl-support-b9abf24a39096b62.yaml +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2023.1.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2023.2.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2024.2.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/2025.1.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/_static/.placeholder +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/_templates/.placeholder +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/conf.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/ocata.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/pike.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/queens.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/rocky.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/stein.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/train.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/unreleased.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/ussuri.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/releasenotes/source/victoria.rst +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/requirements.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/run_tests.sh +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/setup.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/backends/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/backends/impl_blocking.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/conductors/backends/impl_nonblocking.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/contrib/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/deciders.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/actions/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/actions/base.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/actions/retry.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/actions/task.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/builder.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/completer.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/deciders.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/engine.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/executor.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/runtime.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/scheduler.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/scopes.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/selector.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/action_engine/traversal.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/base.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/helpers.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/dispatcher.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/endpoint.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/engine.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/executor.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/protocol.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/server.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/types.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/engines/worker_based/worker.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/99_bottles.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/alphabet_soup.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/build_a_car.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/buildsystem.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/calculate_in_parallel.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/calculate_linear.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/delayed_return.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/distance_calculator.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/echo_listener.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/example_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/parallel_table_multiply.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/persistence_example.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/pseudo_scoping.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_from_backend.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows/my_flows.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows/run_flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_many_flows.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/resume_volume_create.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/retry_flow.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/retry_flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/reverting_linear.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/reverting_linear.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/run_by_iter.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/run_by_iter.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/run_by_iter_enumerate.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear_listening.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear_listening.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear_pass.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_linear_pass.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/simple_map_reduce.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/timing_listener.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_event_sender.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_mandelbrot.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_mandelbrot.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_simple_linear.out.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wbe_simple_linear.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/examples/wrapped_exception.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/exceptions.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/backends/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/backends/impl_zookeeper.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/jobs/base.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/base.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/capturing.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/claims.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/logging.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/listeners/printing.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/logging.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/patterns/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/patterns/graph_flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/patterns/linear_flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/patterns/unordered_flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/impl_dir.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/impl_memory.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/impl_sqlalchemy.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/impl_zookeeper.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/README +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/alembic.ini +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/env.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/script.py.mako +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/00af93df9d77_add_unique_into_all_indexes.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/0bc3e1a3c135_set_result_meduimtext_type.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/14b227d79a87_add_intention_column.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1c783c0c2875_replace_exception_an.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1cea328f0f65_initial_logbook_deta.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/2ad4984f2864_switch_postgres_to_json_native.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/3162c0f3f8e4_add_revert_results_and_revert_failure_.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/40fc8c914bd2_fix_atomdetails_failure_size.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/589dccdf2b6e_rename_taskdetails_to_atomdetails.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/6df9422fcb43_fix_flowdetails_meta_size.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/84d6e888850_add_task_detail_type.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/README +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/migration.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/backends/sqlalchemy/tables.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/base.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/models.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/persistence/path_based.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/retry.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/states.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/storage.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/task.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/fixtures.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/test_examples.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/test_builder.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/test_compile.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/test_creation.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/action_engine/test_scoping.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/base.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/test_entrypoint.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/test_etcd_job.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/test_redis_job.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/jobs/test_zk_job.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/patterns/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/patterns/test_graph_flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/patterns/test_linear_flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/patterns/test_unordered_flow.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/test_dir_persistence.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/test_memory_persistence.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/persistence/test_zk_persistence.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_arguments_passing.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_check_transition.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_conductors.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_deciders.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_engine_helpers.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_engines.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_exceptions.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_failure.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_flow_dependencies.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_formatters.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_functor_task.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_listeners.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_mapfunctor_task.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_notifier.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_progress.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_reducefunctor_task.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_retries.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_states.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_storage.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_suspend.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_task.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_types.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_async_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_binary.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_iter_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_kazoo_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/test_utils_threading_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_creation.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_dispatcher.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_endpoint.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_executor.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_message_pump.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_pipeline.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_protocol.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_server.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_types.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/unit/worker_based/test_worker.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/tests/utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/entity.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/failure.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/latch.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/notifier.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/timing.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/types/tree.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/__init__.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/async_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/eventlet_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/iter_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/kombu_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/persistence_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/redis_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/schema_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow/utils/threading_utils.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/dependency_links.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/entry_points.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/not-zip-safe +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/taskflow.egg-info/top_level.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/test-requirements.txt +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/tools/clear_zk.sh +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/tools/env_builder.sh +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/tools/pretty_tox.sh +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/tools/schema_generator.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/tools/speed_test.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/tools/subunit_trace.py +0 -0
- {taskflow-6.0.1 → taskflow-6.1.0}/tools/test-setup.sh +0 -0
- {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:
|
|
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
|
-
|
|
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.
|
|
22
|
+
rev: v3.20.0
|
|
29
23
|
hooks:
|
|
30
24
|
- id: pyupgrade
|
|
31
|
-
args: [--
|
|
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
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: taskflow
|
|
3
|
-
Version: 6.0
|
|
3
|
+
Version: 6.1.0
|
|
4
4
|
Summary: Taskflow structured state management library.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 ::
|
|
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
|
|
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.
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
+
]
|
taskflow-6.1.0/setup.cfg
ADDED
|
@@ -377,7 +377,7 @@ class Atom(metaclass=abc.ABCMeta):
|
|
|
377
377
|
"""
|
|
378
378
|
|
|
379
379
|
def __str__(self):
|
|
380
|
-
return '"{}=={
|
|
380
|
+
return f'"{self.name}=={misc.get_version_string(self)}"'
|
|
381
381
|
|
|
382
382
|
def __repr__(self):
|
|
383
|
-
return '<{
|
|
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.
|
|
@@ -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 = "{}_{}"
|
|
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"
|
|
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="{}-{}"
|
|
86
|
+
super().__init__(name=f"{base_name}-{volume_id}")
|
|
87
87
|
self._volume_id = volume_id
|
|
88
88
|
|
|
89
89
|
def execute(self):
|
|
@@ -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"
|
|
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"
|
|
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"
|
|
110
|
+
sys.stderr.write(f"{actual} != {value}\n")
|
|
111
111
|
unexpected += 1
|
|
112
112
|
|
|
113
113
|
if unexpected:
|
|
@@ -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("{} {}: {}"
|
|
85
|
+
print(f"{prefix} {name}: {message}")
|
|
86
86
|
else:
|
|
87
|
-
print("{}: {}"
|
|
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 = "{}-{}"
|
|
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 {} {}.'
|
|
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 '{}-{}'
|
|
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: {
|
|
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 {
|
|
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 {} => {}"
|
|
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/{}"
|
|
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))
|
|
@@ -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 '{
|
|
48
|
+
print(f"Running '{self.name}' in thread '{tu.get_ident()}'")
|
|
49
49
|
time.sleep(self._wait_for)
|
|
50
50
|
|
|
51
51
|
|
|
@@ -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 = "{
|
|
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 '{}' {}"
|
|
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):'
|
|
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):
|