taskflow 6.0.1__py3-none-any.whl → 6.1.0__py3-none-any.whl
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/atom.py +2 -2
- taskflow/conductors/backends/impl_executor.py +8 -18
- taskflow/conductors/base.py +24 -0
- taskflow/engines/action_engine/compiler.py +1 -1
- taskflow/engines/worker_based/proxy.py +1 -1
- taskflow/examples/create_parallel_volume.py +2 -2
- taskflow/examples/dump_memory_backend.py +1 -1
- taskflow/examples/fake_billing.py +1 -1
- taskflow/examples/graph_flow.py +2 -2
- taskflow/examples/hello_world.py +1 -1
- taskflow/examples/jobboard_produce_consume_colors.py +3 -3
- taskflow/examples/pseudo_scoping.py +2 -2
- taskflow/examples/resume_from_backend.py +1 -1
- taskflow/examples/resume_many_flows/resume_all.py +1 -1
- taskflow/examples/resume_vm_boot.py +2 -2
- taskflow/examples/run_by_iter_enumerate.py +1 -1
- taskflow/examples/share_engine_thread.py +1 -1
- taskflow/examples/switch_graph_flow.py +1 -1
- taskflow/examples/tox_conductor.py +1 -1
- taskflow/formatters.py +2 -2
- taskflow/jobs/backends/impl_etcd.py +3 -3
- taskflow/jobs/backends/impl_redis.py +2 -9
- taskflow/listeners/timing.py +1 -1
- taskflow/persistence/backends/__init__.py +1 -1
- taskflow/test.py +1 -1
- taskflow/tests/unit/persistence/base.py +1 -1
- taskflow/tests/unit/persistence/test_sql_persistence.py +1 -1
- taskflow/tests/unit/worker_based/test_proxy.py +1 -1
- taskflow/types/graph.py +3 -3
- taskflow/types/sets.py +1 -1
- taskflow/utils/banner.py +2 -2
- taskflow/utils/kazoo_utils.py +2 -2
- taskflow/utils/misc.py +1 -3
- taskflow/version.py +1 -1
- {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/METADATA +45 -65
- {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/RECORD +42 -42
- {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/WHEEL +1 -1
- {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info/licenses}/AUTHORS +1 -0
- taskflow-6.1.0.dist-info/pbr.json +1 -0
- taskflow-6.0.1.dist-info/pbr.json +0 -1
- {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/entry_points.txt +0 -0
- {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info/licenses}/LICENSE +0 -0
- {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/top_level.txt +0 -0
taskflow/atom.py
CHANGED
|
@@ -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__
|
taskflow/conductors/base.py
CHANGED
|
@@ -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):
|
taskflow/examples/graph_flow.py
CHANGED
|
@@ -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:
|
taskflow/examples/hello_world.py
CHANGED
|
@@ -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
|
taskflow/formatters.py
CHANGED
|
@@ -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):
|
|
@@ -377,14 +377,14 @@ class EtcdJobBoard(base.JobBoard):
|
|
|
377
377
|
"""Returns how many jobs are on this jobboard."""
|
|
378
378
|
return len(self._job_cache)
|
|
379
379
|
|
|
380
|
-
def get_owner_data(self, job: EtcdJob) ->
|
|
380
|
+
def get_owner_data(self, job: EtcdJob) -> dict | None:
|
|
381
381
|
owner_key = job.key + self.LOCK_POSTFIX
|
|
382
382
|
owner_data = self.get_one(owner_key)
|
|
383
383
|
if not owner_data:
|
|
384
384
|
return None
|
|
385
385
|
return jsonutils.loads(owner_data)
|
|
386
386
|
|
|
387
|
-
def find_owner(self, job: EtcdJob) ->
|
|
387
|
+
def find_owner(self, job: EtcdJob) -> dict | None:
|
|
388
388
|
"""Gets the owner of the job if one exists."""
|
|
389
389
|
data = self.get_owner_data(job)
|
|
390
390
|
if data:
|
|
@@ -396,7 +396,7 @@ class EtcdJobBoard(base.JobBoard):
|
|
|
396
396
|
return self.get_one(key)
|
|
397
397
|
|
|
398
398
|
def get_owner_and_data(self, job: EtcdJob) -> tuple[
|
|
399
|
-
|
|
399
|
+
str | None, bytes | None]:
|
|
400
400
|
if self._client is None:
|
|
401
401
|
raise exc.JobFailure("Cannot retrieve information, "
|
|
402
402
|
"not connected")
|
|
@@ -20,7 +20,6 @@ import threading
|
|
|
20
20
|
import time
|
|
21
21
|
|
|
22
22
|
import fasteners
|
|
23
|
-
import msgpack
|
|
24
23
|
from oslo_serialization import msgpackutils
|
|
25
24
|
from oslo_utils import excutils
|
|
26
25
|
from oslo_utils import netutils
|
|
@@ -729,10 +728,7 @@ return cmsgpack.pack(result)
|
|
|
729
728
|
def _dumps(obj):
|
|
730
729
|
try:
|
|
731
730
|
return msgpackutils.dumps(obj)
|
|
732
|
-
except
|
|
733
|
-
# TODO(harlowja): remove direct msgpack exception access when
|
|
734
|
-
# oslo.utils provides easy access to the underlying msgpack
|
|
735
|
-
# pack/unpack exceptions..
|
|
731
|
+
except Exception:
|
|
736
732
|
exc.raise_with_cause(exc.JobFailure,
|
|
737
733
|
"Failed to serialize object to"
|
|
738
734
|
" msgpack blob")
|
|
@@ -741,10 +737,7 @@ return cmsgpack.pack(result)
|
|
|
741
737
|
def _loads(blob, root_types=(dict,)):
|
|
742
738
|
try:
|
|
743
739
|
return misc.decode_msgpack(blob, root_types=root_types)
|
|
744
|
-
except
|
|
745
|
-
# TODO(harlowja): remove direct msgpack exception access when
|
|
746
|
-
# oslo.utils provides easy access to the underlying msgpack
|
|
747
|
-
# pack/unpack exceptions..
|
|
740
|
+
except ValueError:
|
|
748
741
|
exc.raise_with_cause(exc.JobFailure,
|
|
749
742
|
"Failed to deserialize object from"
|
|
750
743
|
" msgpack blob (of length %s)" % len(blob))
|
taskflow/listeners/timing.py
CHANGED
|
@@ -118,7 +118,7 @@ class PrintingDurationListener(DurationListener):
|
|
|
118
118
|
def _receiver(self, item_type, item_name, state):
|
|
119
119
|
super()._receiver(item_type, item_name, state)
|
|
120
120
|
if state in STARTING_STATES:
|
|
121
|
-
self._printer("'{}' {} started."
|
|
121
|
+
self._printer(f"'{item_name}' {item_type} started.")
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
class EventTimeListener(base.Listener):
|
|
@@ -62,7 +62,7 @@ def fetch(conf, namespace=BACKEND_NAMESPACE, **kwargs):
|
|
|
62
62
|
invoke_kwds=kwargs)
|
|
63
63
|
return mgr.driver
|
|
64
64
|
except RuntimeError as e:
|
|
65
|
-
raise exc.NotFound("Could not find backend {}: {}"
|
|
65
|
+
raise exc.NotFound(f"Could not find backend {backend}: {e}")
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
@contextlib.contextmanager
|
taskflow/test.py
CHANGED
|
@@ -36,7 +36,7 @@ class GreaterThanEqual:
|
|
|
36
36
|
def match(self, other):
|
|
37
37
|
if other >= self.source:
|
|
38
38
|
return None
|
|
39
|
-
return matchers.Mismatch("{} was not >= {
|
|
39
|
+
return matchers.Mismatch(f"{other} was not >= {self.source}")
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
class FailureRegexpMatcher:
|
|
@@ -59,7 +59,7 @@ def _get_connect_string(backend, user, passwd, database=None, variant=None):
|
|
|
59
59
|
raise Exception("Unrecognized backend: '%s'" % backend)
|
|
60
60
|
if not database:
|
|
61
61
|
database = ''
|
|
62
|
-
return "{}://{}:{}@localhost/{}"
|
|
62
|
+
return f"{backend}://{user}:{passwd}@localhost/{database}"
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
def _mysql_exists():
|
taskflow/types/graph.py
CHANGED
|
@@ -29,15 +29,15 @@ def _common_format(g, edge_notation):
|
|
|
29
29
|
lines.append("Nodes: %s" % g.number_of_nodes())
|
|
30
30
|
for n, n_data in g.nodes(data=True):
|
|
31
31
|
if n_data:
|
|
32
|
-
lines.append(" - {} ({})"
|
|
32
|
+
lines.append(f" - {n} ({n_data})")
|
|
33
33
|
else:
|
|
34
34
|
lines.append(" - %s" % n)
|
|
35
35
|
lines.append("Edges: %s" % g.number_of_edges())
|
|
36
36
|
for (u, v, e_data) in g.edges(data=True):
|
|
37
37
|
if e_data:
|
|
38
|
-
lines.append(" {} {} {} ({})"
|
|
38
|
+
lines.append(f" {u} {edge_notation} {v} ({e_data})")
|
|
39
39
|
else:
|
|
40
|
-
lines.append(" {} {} {}"
|
|
40
|
+
lines.append(f" {u} {edge_notation} {v}")
|
|
41
41
|
return lines
|
|
42
42
|
|
|
43
43
|
|
taskflow/types/sets.py
CHANGED
taskflow/utils/banner.py
CHANGED
|
@@ -86,9 +86,9 @@ def make_banner(what, chapters):
|
|
|
86
86
|
sections = chapter_contents
|
|
87
87
|
for j, section in enumerate(sections):
|
|
88
88
|
if j + 1 < len(sections):
|
|
89
|
-
buf.write_nl(" {
|
|
89
|
+
buf.write_nl(f" {j + 1}. {section}")
|
|
90
90
|
else:
|
|
91
|
-
buf.write(" {
|
|
91
|
+
buf.write(f" {j + 1}. {section}")
|
|
92
92
|
else:
|
|
93
93
|
raise TypeError("Unsupported chapter contents"
|
|
94
94
|
" type: one of dict, list, tuple, set expected"
|
taskflow/utils/kazoo_utils.py
CHANGED
|
@@ -39,7 +39,7 @@ def _parse_hosts(hosts):
|
|
|
39
39
|
if isinstance(hosts, (dict)):
|
|
40
40
|
host_ports = []
|
|
41
41
|
for (k, v) in hosts.items():
|
|
42
|
-
host_ports.append("{}:{}"
|
|
42
|
+
host_ports.append(f"{k}:{v}")
|
|
43
43
|
hosts = host_ports
|
|
44
44
|
if isinstance(hosts, (list, set, tuple)):
|
|
45
45
|
return ",".join([str(h) for h in hosts])
|
|
@@ -63,7 +63,7 @@ def prettify_failures(failures, limit=-1):
|
|
|
63
63
|
pass
|
|
64
64
|
pretty_op += "(%s)" % (", ".join(selected_attrs))
|
|
65
65
|
pretty_cause = reflection.get_class_name(r, fully_qualified=False)
|
|
66
|
-
prettier.append("{}@{}"
|
|
66
|
+
prettier.append(f"{pretty_cause}@{pretty_op}")
|
|
67
67
|
if limit <= 0 or len(prettier) <= limit:
|
|
68
68
|
return ", ".join(prettier)
|
|
69
69
|
else:
|
taskflow/utils/misc.py
CHANGED
|
@@ -187,7 +187,7 @@ def find_subclasses(locations, base_cls, exclude_hidden=True):
|
|
|
187
187
|
except ValueError:
|
|
188
188
|
module = importutils.import_module(item)
|
|
189
189
|
else:
|
|
190
|
-
obj = importutils.import_class('{}.{}'
|
|
190
|
+
obj = importutils.import_class(f'{pkg}.{cls}')
|
|
191
191
|
if not reflection.is_subclass(obj, base_cls):
|
|
192
192
|
raise TypeError("Object '%s' (%s) is not a '%s' subclass"
|
|
193
193
|
% (item, type(item), base_cls))
|
|
@@ -317,8 +317,6 @@ def decode_msgpack(raw_data, root_types=(dict,)):
|
|
|
317
317
|
try:
|
|
318
318
|
data = msgpackutils.loads(raw_data)
|
|
319
319
|
except Exception as e:
|
|
320
|
-
# TODO(harlowja): fix this when msgpackutils exposes the msgpack
|
|
321
|
-
# exceptions so that we can avoid catching just exception...
|
|
322
320
|
raise ValueError("Expected msgpack decodable data: %s" % e)
|
|
323
321
|
else:
|
|
324
322
|
return _check_decoded_type(data, root_types=root_types)
|
taskflow/version.py
CHANGED
|
@@ -1,94 +1,75 @@
|
|
|
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
|
License-File: AUTHORS
|
|
28
|
-
Requires-Dist: pbr
|
|
29
|
-
Requires-Dist: debtcollector
|
|
30
|
-
Requires-Dist: futurist
|
|
31
|
-
Requires-Dist: fasteners
|
|
32
|
-
Requires-Dist: networkx
|
|
33
|
-
Requires-Dist: stevedore
|
|
34
|
-
Requires-Dist: jsonschema
|
|
35
|
-
Requires-Dist: automaton
|
|
36
|
-
Requires-Dist: oslo.utils
|
|
37
|
-
Requires-Dist: oslo.serialization
|
|
38
|
-
Requires-Dist: tenacity
|
|
39
|
-
Requires-Dist: cachetools
|
|
40
|
-
Requires-Dist: pydot
|
|
41
|
-
Provides-Extra:
|
|
42
|
-
Requires-Dist:
|
|
43
|
-
Requires-Dist: alembic >=0.8.10 ; extra == 'database'
|
|
44
|
-
Requires-Dist: SQLAlchemy-Utils >=0.30.11 ; extra == 'database'
|
|
45
|
-
Requires-Dist: PyMySQL >=0.7.6 ; extra == 'database'
|
|
46
|
-
Requires-Dist: psycopg2 >=2.8.0 ; extra == 'database'
|
|
47
|
-
Provides-Extra: etcd
|
|
48
|
-
Requires-Dist: etcd3gw >=2.0.0 ; extra == 'etcd'
|
|
49
|
-
Provides-Extra: eventlet
|
|
50
|
-
Requires-Dist: eventlet >=0.18.2 ; extra == 'eventlet'
|
|
26
|
+
Requires-Dist: pbr>=2.0.0
|
|
27
|
+
Requires-Dist: debtcollector>=1.2.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.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"
|
|
51
41
|
Provides-Extra: redis
|
|
52
|
-
Requires-Dist: redis
|
|
53
|
-
Provides-Extra:
|
|
54
|
-
Requires-Dist:
|
|
55
|
-
Requires-Dist: redis >=4.0.0 ; extra == 'test'
|
|
56
|
-
Requires-Dist: etcd3gw >=2.0.0 ; extra == 'test'
|
|
57
|
-
Requires-Dist: kombu >=4.3.0 ; extra == 'test'
|
|
58
|
-
Requires-Dist: eventlet >=0.18.2 ; extra == 'test'
|
|
59
|
-
Requires-Dist: SQLAlchemy >=1.0.10 ; extra == 'test'
|
|
60
|
-
Requires-Dist: alembic >=0.8.10 ; extra == 'test'
|
|
61
|
-
Requires-Dist: SQLAlchemy-Utils >=0.30.11 ; extra == 'test'
|
|
62
|
-
Requires-Dist: PyMySQL >=0.7.6 ; extra == 'test'
|
|
63
|
-
Requires-Dist: psycopg2 >=2.8.0 ; extra == 'test'
|
|
64
|
-
Requires-Dist: zake >=0.1.6 ; extra == 'test'
|
|
65
|
-
Requires-Dist: pydotplus >=2.0.2 ; extra == 'test'
|
|
66
|
-
Requires-Dist: oslotest >=3.2.0 ; extra == 'test'
|
|
67
|
-
Requires-Dist: testtools >=2.2.0 ; extra == 'test'
|
|
68
|
-
Requires-Dist: testscenarios >=0.4 ; extra == 'test'
|
|
69
|
-
Requires-Dist: stestr >=2.0.0 ; extra == 'test'
|
|
70
|
-
Requires-Dist: pifpaf >=0.10.0 ; extra == 'test'
|
|
42
|
+
Requires-Dist: redis>=4.0.0; extra == "redis"
|
|
43
|
+
Provides-Extra: etcd
|
|
44
|
+
Requires-Dist: etcd3gw>=2.0.0; extra == "etcd"
|
|
71
45
|
Provides-Extra: workers
|
|
72
|
-
Requires-Dist: kombu
|
|
73
|
-
Provides-Extra:
|
|
74
|
-
Requires-Dist:
|
|
46
|
+
Requires-Dist: kombu>=4.3.0; extra == "workers"
|
|
47
|
+
Provides-Extra: eventlet
|
|
48
|
+
Requires-Dist: eventlet>=0.18.2; extra == "eventlet"
|
|
49
|
+
Provides-Extra: database
|
|
50
|
+
Requires-Dist: SQLAlchemy>=1.0.10; extra == "database"
|
|
51
|
+
Requires-Dist: alembic>=0.8.10; extra == "database"
|
|
52
|
+
Requires-Dist: SQLAlchemy-Utils>=0.30.11; extra == "database"
|
|
53
|
+
Requires-Dist: PyMySQL>=0.7.6; extra == "database"
|
|
54
|
+
Requires-Dist: psycopg2>=2.8.0; extra == "database"
|
|
55
|
+
Dynamic: license-file
|
|
56
|
+
Dynamic: requires-dist
|
|
75
57
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
========================
|
|
58
|
+
TaskFlow
|
|
59
|
+
========
|
|
79
60
|
|
|
80
61
|
.. image:: https://governance.openstack.org/tc/badges/taskflow.svg
|
|
81
|
-
:target: https://governance.openstack.org/tc/reference/tags/index.html
|
|
82
62
|
|
|
83
63
|
.. Change things from this point on
|
|
84
64
|
|
|
85
|
-
TaskFlow
|
|
86
|
-
========
|
|
87
|
-
|
|
88
65
|
.. image:: https://img.shields.io/pypi/v/taskflow.svg
|
|
89
66
|
:target: https://pypi.org/project/taskflow/
|
|
90
67
|
:alt: Latest Version
|
|
91
68
|
|
|
69
|
+
.. image:: https://img.shields.io/pypi/dm/taskflow.svg
|
|
70
|
+
:target: https://pypi.org/project/taskflow/
|
|
71
|
+
:alt: Downloads
|
|
72
|
+
|
|
92
73
|
A library to do [jobs, tasks, flows] in a highly available, easy to understand
|
|
93
74
|
and declarative manner (and more!) to be used with OpenStack and other
|
|
94
75
|
projects.
|
|
@@ -146,4 +127,3 @@ We also have sphinx documentation in ``docs/source``.
|
|
|
146
127
|
.. _kombu: https://kombu.readthedocs.io/en/latest/
|
|
147
128
|
.. _eventlet: http://eventlet.net/
|
|
148
129
|
.. _tox: https://tox.testrun.org/
|
|
149
|
-
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
taskflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
taskflow/atom.py,sha256=
|
|
2
|
+
taskflow/atom.py,sha256=rGCmGemeZYxPfQ7_07vD5Wvr4nUnWQZ8Lb6jUjWJJSA,17297
|
|
3
3
|
taskflow/deciders.py,sha256=aSQTK6xSri53tAu1klr1N3_eBiRDTS3X5pyTnp_yK7M,3377
|
|
4
4
|
taskflow/exceptions.py,sha256=WzmajKFDkRlFGqxyXGEwCsJvcO3MDeLN_WFBP6pAnXU,11447
|
|
5
5
|
taskflow/flow.py,sha256=Ds2cK2SLC5NlzUY5HYTButDqtVth7cs1J7bsqYClGB4,4801
|
|
6
|
-
taskflow/formatters.py,sha256=
|
|
6
|
+
taskflow/formatters.py,sha256=7Tmczmq4zTGJuxUIEpiXFNT17OzWrLPs9le6UO4tBP0,7988
|
|
7
7
|
taskflow/logging.py,sha256=w2GydrzIUhDR8usZJos1egXpEbD58DbJm6xAyJp6WcA,1845
|
|
8
8
|
taskflow/retry.py,sha256=j7jShea_EZ5wSI-cmTX_-UC4A8IL9RjZ5oOKHWVoWtM,14172
|
|
9
9
|
taskflow/states.py,sha256=8ZpHiND-GQKRdVs06NPZnagPR5ul1Sf-7BHO6CHuSdQ,6876
|
|
10
10
|
taskflow/storage.py,sha256=mqS80QU0yi1V66aQkNfxPUypduq16iKauiEFF6p34m0,52034
|
|
11
11
|
taskflow/task.py,sha256=fIuU3ZCZ9Jpyy3may5RRBy_lpYdX1wdwLL31_l7paxs,9710
|
|
12
|
-
taskflow/test.py,sha256=
|
|
13
|
-
taskflow/version.py,sha256=
|
|
12
|
+
taskflow/test.py,sha256=G81HZ7vQz3OEdNDK1PgnAtUPFt5fPR6kcDLxZwOEaOA,9293
|
|
13
|
+
taskflow/version.py,sha256=TIPgHwGy27Cnm_NYeGXaldtFQbMykcnUm8Vi-xSHLyc,1060
|
|
14
14
|
taskflow/conductors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
taskflow/conductors/base.py,sha256=
|
|
15
|
+
taskflow/conductors/base.py,sha256=iXYyuh2xvnDZDpZtkMbgwmUGmINjg0tWISXY2IwfY9k,8161
|
|
16
16
|
taskflow/conductors/backends/__init__.py,sha256=42RGlkHzNlj__uv9bNEZOIrf4iwc6vhfjmqpWGm8Gp0,1609
|
|
17
17
|
taskflow/conductors/backends/impl_blocking.py,sha256=MPSz-pL9VFo-vIGtmYs7aWHCO5OCsh8uTAsmx2Sbdhk,1468
|
|
18
|
-
taskflow/conductors/backends/impl_executor.py,sha256=
|
|
18
|
+
taskflow/conductors/backends/impl_executor.py,sha256=BO3tp2RIA_CTT4zYKEY5UbYDpVhC9U8ee_WXjBEYsac,14658
|
|
19
19
|
taskflow/conductors/backends/impl_nonblocking.py,sha256=IzJI8zyjORNy0s0CTa6SwLwW7688JOzDeQdRfUUBKxc,2963
|
|
20
20
|
taskflow/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
21
|
taskflow/engines/__init__.py,sha256=q89egnng6p5ns41ok8J-lZ0TgYvIwCulc-EnDhxno8Q,1372
|
|
@@ -23,7 +23,7 @@ taskflow/engines/base.py,sha256=pJHTThAsjIPFgeC3IKFbqkrT71fOw9yQFTpDQ79SeKQ,4832
|
|
|
23
23
|
taskflow/engines/helpers.py,sha256=5-pskU-DPZxEDh2CBWQZdXQh8x2z263zIU89aIewvX4,10927
|
|
24
24
|
taskflow/engines/action_engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
25
|
taskflow/engines/action_engine/builder.py,sha256=ricYirNURoPbMZBatufNF_TQfWSkJdSrgHlPJb5Wjck,16974
|
|
26
|
-
taskflow/engines/action_engine/compiler.py,sha256=
|
|
26
|
+
taskflow/engines/action_engine/compiler.py,sha256=XkBEuFWPdm3lOjFJu1Il6Nx8VGoj5Gch4mjkGGdaPq8,16088
|
|
27
27
|
taskflow/engines/action_engine/completer.py,sha256=mxO1Nz_u2kdSRTZznZOu956jyHV5cl2CkRXhEFzE5h0,8940
|
|
28
28
|
taskflow/engines/action_engine/deciders.py,sha256=K677X3E-sl0SjweqL50Yhet9AdpBBQ9sgc2OPNVRj_M,7221
|
|
29
29
|
taskflow/engines/action_engine/engine.py,sha256=c7Zm2yeRp_OZUQHU3vvSTcVapExuWyKUW_Rfq6aVFHc,28968
|
|
@@ -43,7 +43,7 @@ taskflow/engines/worker_based/endpoint.py,sha256=zto3o6ZLchxVk7ZhE2CKVHoj1PE6W54
|
|
|
43
43
|
taskflow/engines/worker_based/engine.py,sha256=APIsPq3bw5BJikA5xLEwJ4POsdC0P4tnPHP1PYgCU5U,4271
|
|
44
44
|
taskflow/engines/worker_based/executor.py,sha256=TXE1m6dTtUXA9pteNqWXkKDMlAypQ6qigfe9T3YcaEA,13786
|
|
45
45
|
taskflow/engines/worker_based/protocol.py,sha256=N87cRRh-E4pF_7KQfIIE37Ez8mhYRvX_LaMU8o1-JN0,20205
|
|
46
|
-
taskflow/engines/worker_based/proxy.py,sha256=
|
|
46
|
+
taskflow/engines/worker_based/proxy.py,sha256=oXi1w0D5fX4BLa7C4HcS25UMHa8pAIK9CGt_nB1ifTo,9486
|
|
47
47
|
taskflow/engines/worker_based/server.py,sha256=kW89r4wirovfyGHEu62kzDes8kgjIj7usxYzlTXi_NA,11513
|
|
48
48
|
taskflow/engines/worker_based/types.py,sha256=xPI1Rk1w9d8nURw0VG3WYDw1c9nimFT0unT106iQ_y4,9832
|
|
49
49
|
taskflow/engines/worker_based/worker.py,sha256=tQ9v_Xhdx48lEXqqbVH5WCfojG2Y3JM80WMr5IaJMrk,6301
|
|
@@ -53,25 +53,25 @@ taskflow/examples/build_a_car.py,sha256=Fxlti6TKmo7OIxnmuHgf1X57qOi5TvlW12E6mHYW
|
|
|
53
53
|
taskflow/examples/buildsystem.py,sha256=h347O4nSaxKhac0Xc0tM6D3nZOpzgVZODgh0GAZDpvs,3870
|
|
54
54
|
taskflow/examples/calculate_in_parallel.py,sha256=D_4SfU9X_i3nEx6H5mfj0m-_BARx-1lcKQUQck1SRF0,3878
|
|
55
55
|
taskflow/examples/calculate_linear.py,sha256=pDQZDXMobeJb4xP8UGAB1gpu_6QiXnJiwRSAq9ijUdo,4543
|
|
56
|
-
taskflow/examples/create_parallel_volume.py,sha256=
|
|
56
|
+
taskflow/examples/create_parallel_volume.py,sha256=nir6hKft0IBxy-e5ZwpdeRTjd6Xxj_ET3sob0IKzE14,4222
|
|
57
57
|
taskflow/examples/delayed_return.py,sha256=KA-vVdJ6GYviTTVWU4iiPlkt7F4Q_tN2dfIEFgRjDJo,2797
|
|
58
58
|
taskflow/examples/distance_calculator.py,sha256=Ng62BzzsAuOc43RS3lNk2RIsiVOSMmev7I-v59e6l_4,3786
|
|
59
|
-
taskflow/examples/dump_memory_backend.py,sha256
|
|
59
|
+
taskflow/examples/dump_memory_backend.py,sha256=-avg_e2r1FWhk1DcTzv2eztzCE4vd48ieXvYRpvSTzo,2092
|
|
60
60
|
taskflow/examples/echo_listener.py,sha256=SdLTZXy4MYK6G7NZATyvFvK8heo4PJ2iJOU-M8rPoX8,1883
|
|
61
61
|
taskflow/examples/example_utils.py,sha256=usqnQrUGU54RWkm0W9xJ-OWXgP59eHsLLoEgqdZuaa0,3276
|
|
62
|
-
taskflow/examples/fake_billing.py,sha256=
|
|
63
|
-
taskflow/examples/graph_flow.py,sha256=
|
|
64
|
-
taskflow/examples/hello_world.py,sha256=
|
|
65
|
-
taskflow/examples/jobboard_produce_consume_colors.py,sha256
|
|
62
|
+
taskflow/examples/fake_billing.py,sha256=XZp9f5F0dTEMR_iQqeaUYt_kBeuyUEY5F6TP-1XLcxM,6688
|
|
63
|
+
taskflow/examples/graph_flow.py,sha256=jREwnJgBSfsxh_rRIvy6Gj7F3SfqXUzhRbs-SjZCw9Q,3424
|
|
64
|
+
taskflow/examples/hello_world.py,sha256=sGj3uRzRBi8gE9HXAYPJA2bfu-B_4l00iFcrz3ka8S0,4168
|
|
65
|
+
taskflow/examples/jobboard_produce_consume_colors.py,sha256=KDuixC5ICN7q8h4Y-t5FeDd4zoHAhir1Uxgkki0oVpQ,6776
|
|
66
66
|
taskflow/examples/parallel_table_multiply.py,sha256=91j4TG1o1EjNTAmth6ep4mDMukoWxBabJ-FseFBrNgY,4232
|
|
67
67
|
taskflow/examples/persistence_example.py,sha256=wNaeueRwfEPpVuDxIjZeQA1Lo2WVXWpaaDIzyvspXBo,3868
|
|
68
68
|
taskflow/examples/pseudo_scoping.out.txt,sha256=ktR2-fVrRo5AsYPRMEBN6KJZ6_0ZMnts29bgN7t42tY,238
|
|
69
|
-
taskflow/examples/pseudo_scoping.py,sha256=
|
|
69
|
+
taskflow/examples/pseudo_scoping.py,sha256=bVwjW7IOjUIbj9iR314x88F9dk_HY0hJPgWdDfxI8jY,3460
|
|
70
70
|
taskflow/examples/resume_from_backend.out.txt,sha256=0THjgMno9e6k3c8l_MTwKWDiQ9Pp2VG19vWjzR2SzFU,678
|
|
71
|
-
taskflow/examples/resume_from_backend.py,sha256=
|
|
71
|
+
taskflow/examples/resume_from_backend.py,sha256=bPNqdSdyakW49cpTPnzAHlFntHu469iuw1H1WxwDBVs,4961
|
|
72
72
|
taskflow/examples/resume_many_flows.out.txt,sha256=laNlJonlvUlDG4zGK_KHZl7GLnJ9w0epaadrKKLns2w,774
|
|
73
73
|
taskflow/examples/resume_many_flows.py,sha256=iXiRQXFcf1zA9Nw9bB7ODCftMVsK2dMOyibZ7BF6b8c,3167
|
|
74
|
-
taskflow/examples/resume_vm_boot.py,sha256=
|
|
74
|
+
taskflow/examples/resume_vm_boot.py,sha256=0qRY7yybi3dPUhWWW70kssfZguSi6YaZqKnYMniD1bY,9371
|
|
75
75
|
taskflow/examples/resume_volume_create.py,sha256=CHShDpNuHr65ZGBP1hQiAOyyYGlV-uxnnh83nkm1Jd8,5857
|
|
76
76
|
taskflow/examples/retry_flow.out.txt,sha256=AtZEJMLGSZbHYt1dAB7qcz8s5yrQqigjxc708wvtqmI,116
|
|
77
77
|
taskflow/examples/retry_flow.py,sha256=WZ9yPCSgDmH_kJqiUQUbnbcCHJjHOjOLAUCcDmZFLDk,2243
|
|
@@ -80,8 +80,8 @@ taskflow/examples/reverting_linear.py,sha256=6Hv5g9B8QfrgRMghumzzB8ct3uFE4teNsZn
|
|
|
80
80
|
taskflow/examples/run_by_iter.out.txt,sha256=xKLg52D8UJZlRboEGCOk83neNYWtpq8SjAwqaRS68fU,823
|
|
81
81
|
taskflow/examples/run_by_iter.py,sha256=nOI0_HzoXLEVPnUaKwpiR1310AfOAggSEjjhTbMp7js,2595
|
|
82
82
|
taskflow/examples/run_by_iter_enumerate.out.txt,sha256=d5__O4xsSBkO6l4BFK7hK1i97rB1GjhVD-379sIYlaE,849
|
|
83
|
-
taskflow/examples/run_by_iter_enumerate.py,sha256=
|
|
84
|
-
taskflow/examples/share_engine_thread.py,sha256=
|
|
83
|
+
taskflow/examples/run_by_iter_enumerate.py,sha256=LI2gzEGeaUrbAr5fw0boYTm5KQQ7A0NRfcEAQhyri5Y,1689
|
|
84
|
+
taskflow/examples/share_engine_thread.py,sha256=3OmMihgXP4GtdCaeMhcVVyf1G9QYiX1hh_BoYK50nJw,2694
|
|
85
85
|
taskflow/examples/simple_linear.out.txt,sha256=F4IDqbYYRPLLzYNXI3teAtgRfOqsAXQKTLY3fArFPoY,34
|
|
86
86
|
taskflow/examples/simple_linear.py,sha256=_nkjUN8PGmBCu8b-30rPqgCHBr0RI0qNq5L8UEVQiCs,2482
|
|
87
87
|
taskflow/examples/simple_linear_listening.out.txt,sha256=1CEQbmwwmBe-YyWVGjjl17Elf70ZOLP9lqn-6Uj7Akk,300
|
|
@@ -89,9 +89,9 @@ taskflow/examples/simple_linear_listening.py,sha256=Ys2XwUuVr7a7JPTAPxNFVXWvzn4T
|
|
|
89
89
|
taskflow/examples/simple_linear_pass.out.txt,sha256=Y4GkdMkyoqcwpR98MzRITGVsFRb0mtqbfJ4m2uNvuW4,114
|
|
90
90
|
taskflow/examples/simple_linear_pass.py,sha256=arE9PJ_Nzd_m_UwOmimiber4gLP8gNFM8SbWOnGBKYM,1767
|
|
91
91
|
taskflow/examples/simple_map_reduce.py,sha256=am-O6IkPb_zEj7V3guhe3Jo8IEnX9jIHmfsHQ6oi3X8,3737
|
|
92
|
-
taskflow/examples/switch_graph_flow.py,sha256=
|
|
92
|
+
taskflow/examples/switch_graph_flow.py,sha256=Rxdv9Er5OuKEIiIkflqY3qqZadkN2esMy2EfL_-jr7A,1873
|
|
93
93
|
taskflow/examples/timing_listener.py,sha256=xCZgKNRweJPktiIDWsBogjmoNkfsISmPwTCPlZglhUg,1991
|
|
94
|
-
taskflow/examples/tox_conductor.py,sha256=
|
|
94
|
+
taskflow/examples/tox_conductor.py,sha256=G8a02vRMAMv_a_gYk2yEWExrZQ9ZT_ysEDVA7QsV38o,8449
|
|
95
95
|
taskflow/examples/wbe_event_sender.py,sha256=sxSUar9ELhKO2A9UtxEemk6YRzogIkba3NxxDPv6G9U,5522
|
|
96
96
|
taskflow/examples/wbe_mandelbrot.out.txt,sha256=fdzWLYHe7PZPGF_RDQ1ty_IdzWSDTZVkpSawjlPlBVM,243
|
|
97
97
|
taskflow/examples/wbe_mandelbrot.py,sha256=SXXBP4cJ9GPqc5qyMR9o56oOmyCTd46Gx8dPsuTK_0U,8817
|
|
@@ -99,13 +99,13 @@ taskflow/examples/wbe_simple_linear.out.txt,sha256=w8vFgEkV3pBOAKNUPSJkufpTCwXr-
|
|
|
99
99
|
taskflow/examples/wbe_simple_linear.py,sha256=Jk-zZuYr_LRpR1sd8KWbgzM1XTH8q8lt-lvId9-QPwM,5388
|
|
100
100
|
taskflow/examples/wrapped_exception.py,sha256=VtWwWVMCs_dxrl45P4ljCZ3786zrrQoSEqrfm8TBCSY,4707
|
|
101
101
|
taskflow/examples/resume_many_flows/my_flows.py,sha256=1N7SQ64I48kHnZbW_ZIq8q5fP8JGCE3RGtV-MzscORM,1263
|
|
102
|
-
taskflow/examples/resume_many_flows/resume_all.py,sha256=
|
|
102
|
+
taskflow/examples/resume_many_flows/resume_all.py,sha256=yONGjDLcuji8znbuQwmUeVReVrCAcYo9_2rq0L1EQbE,1698
|
|
103
103
|
taskflow/examples/resume_many_flows/run_flow.py,sha256=lPtDp1vlaUrK7IDV84bwctQVOjbT3V9u5mHQ1EBf69Y,1416
|
|
104
104
|
taskflow/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
105
105
|
taskflow/jobs/base.py,sha256=jEfsucwMf1xob5UW6Rr3zu9ni8XDLw5QL2xgATDTmUM,22395
|
|
106
106
|
taskflow/jobs/backends/__init__.py,sha256=Cj1OjssRhq5IR28-wraOEDOLvsaQN16g1PcCYevuKqU,2877
|
|
107
|
-
taskflow/jobs/backends/impl_etcd.py,sha256=
|
|
108
|
-
taskflow/jobs/backends/impl_redis.py,sha256=
|
|
107
|
+
taskflow/jobs/backends/impl_etcd.py,sha256=5Vr4ujdFBlzjVbrmFl13smLg9cDefbdcUrxhhDaTsGE,22027
|
|
108
|
+
taskflow/jobs/backends/impl_redis.py,sha256=bdlH5zjlAcMqk8S-m-m0ZCP-oD3-mhL8TzjKLLWX-Rw,43647
|
|
109
109
|
taskflow/jobs/backends/impl_zookeeper.py,sha256=7y3Nork5ALeFD5XzTD425x8s2XUCmf52JHOR--NdroE,37549
|
|
110
110
|
taskflow/listeners/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
111
111
|
taskflow/listeners/base.py,sha256=dR5enUuhsYZH306xHb3sLHyPA8VouLSpE4zKXpMJ5I4,7358
|
|
@@ -113,7 +113,7 @@ taskflow/listeners/capturing.py,sha256=xoMH4IZhuimBqZmfK9fG_vxEeMj__LuT4Y6gQigjm
|
|
|
113
113
|
taskflow/listeners/claims.py,sha256=wXbXUqRCij-NPLur8DZF2rTRISojNjiCy-3JUFlYo0E,4063
|
|
114
114
|
taskflow/listeners/logging.py,sha256=zaEZu1vAe1LG5i4rjBNtflcd8QQ0szQ9PxGt0QOrkp8,8759
|
|
115
115
|
taskflow/listeners/printing.py,sha256=vZK_Osf-U8lCvhNdYIDtL6KRUrlOACgeiHxiyeNeIQ4,1628
|
|
116
|
-
taskflow/listeners/timing.py,sha256
|
|
116
|
+
taskflow/listeners/timing.py,sha256=Vlv1-zMZZWjEkJzpgG2LenjX7MmABNKvRr45RHcymms,6653
|
|
117
117
|
taskflow/patterns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
118
118
|
taskflow/patterns/graph_flow.py,sha256=qeZBnmfqS7nskXDOZwyWiq0jXaUWlm1uqAFaHaF8KyA,15239
|
|
119
119
|
taskflow/patterns/linear_flow.py,sha256=-J2jedu08ZD_wdgNmEOEGEGZDfDvkgbuJ3Cs_nnofTo,2660
|
|
@@ -122,7 +122,7 @@ taskflow/persistence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
122
122
|
taskflow/persistence/base.py,sha256=2tHl9Zu3gU4S9Bk-RpVSAH8a-wclPKpaPDGSbqa475Y,4031
|
|
123
123
|
taskflow/persistence/models.py,sha256=DRQjZY0HyfnfpIs186iMbQV2O1kqeYRlhVrZpc9HqVA,40591
|
|
124
124
|
taskflow/persistence/path_based.py,sha256=TnRflhV_uo0miwSmamGNPvNkfmBQpBjItXJUlsllaqk,9498
|
|
125
|
-
taskflow/persistence/backends/__init__.py,sha256=
|
|
125
|
+
taskflow/persistence/backends/__init__.py,sha256=9ZdUnlPPFL76xLKMEGuY428QoBpcfnfkJd3zd_Gc69I,3321
|
|
126
126
|
taskflow/persistence/backends/impl_dir.py,sha256=TyFJgUymjCteAobk4KNMZ2CRZMbo3as1rN1twInPOvE,6023
|
|
127
127
|
taskflow/persistence/backends/impl_memory.py,sha256=qNq6VI_e_doRpaYvmPVal9wn4N7xJmnrgE7enbbXWFU,13284
|
|
128
128
|
taskflow/persistence/backends/impl_sqlalchemy.py,sha256=37isYg47E2PYQQ7Dxf6mvLtQo3kC6GE8OUnrwYhfzU4,25427
|
|
@@ -195,10 +195,10 @@ taskflow/tests/unit/patterns/test_graph_flow.py,sha256=klJPWr6dGmWfEAhThxN3HiTm-
|
|
|
195
195
|
taskflow/tests/unit/patterns/test_linear_flow.py,sha256=mto1z8keztKhTc8auBPUX2LdbpfsT-aJq_Xmk1nqgk8,5073
|
|
196
196
|
taskflow/tests/unit/patterns/test_unordered_flow.py,sha256=6w8jWF9n1rcbCuxN_O-rT95-76pWF31BVk6WCP36xZE,4899
|
|
197
197
|
taskflow/tests/unit/persistence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
198
|
-
taskflow/tests/unit/persistence/base.py,sha256=
|
|
198
|
+
taskflow/tests/unit/persistence/base.py,sha256=p1QNVaR_EQf4e8qDz8DW1Aqza2ljm1WJ8MV88BEvpxM,16508
|
|
199
199
|
taskflow/tests/unit/persistence/test_dir_persistence.py,sha256=PTbOA-bte1VXox8bc_uxlrZasKAdY7lJ6tA3aJaRNKk,3856
|
|
200
200
|
taskflow/tests/unit/persistence/test_memory_persistence.py,sha256=TVVPQQPryX8lK-RXYY1BNYBqNjYK-2X65MyN3UAmOGs,7792
|
|
201
|
-
taskflow/tests/unit/persistence/test_sql_persistence.py,sha256=
|
|
201
|
+
taskflow/tests/unit/persistence/test_sql_persistence.py,sha256=NNvmPcdE9VW9h7hSlT7zC5ZGDlxFMzgTEo__PuNGCCM,10174
|
|
202
202
|
taskflow/tests/unit/persistence/test_zk_persistence.py,sha256=YB8pytcRgANRa2HSpHOzJ8CpqlsDFHlEZ8bJUULs18k,3575
|
|
203
203
|
taskflow/tests/unit/worker_based/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
204
204
|
taskflow/tests/unit/worker_based/test_creation.py,sha256=7ohfSkA2nnFkJyjrRiaOr2nA-b5M1iw3CsKKPI3tjWc,4020
|
|
@@ -208,36 +208,36 @@ taskflow/tests/unit/worker_based/test_executor.py,sha256=PlVTcUN7O8H6YRoWJi2KWPJ
|
|
|
208
208
|
taskflow/tests/unit/worker_based/test_message_pump.py,sha256=SOVWtJhEFJ5NJ9A4eKXGBF3dISO7m_BCdMBcOrIavtA,4869
|
|
209
209
|
taskflow/tests/unit/worker_based/test_pipeline.py,sha256=QbD2U2OfIQpDOltW7Qp5tiIjlHnRe-a3CZwuUyMG90U,3787
|
|
210
210
|
taskflow/tests/unit/worker_based/test_protocol.py,sha256=GJWTsdZGeLHQq2bZIVAu-DBkVks6WlqXaAuIqcucxwY,7694
|
|
211
|
-
taskflow/tests/unit/worker_based/test_proxy.py,sha256=
|
|
211
|
+
taskflow/tests/unit/worker_based/test_proxy.py,sha256=Cbh2KwezAE9CvIdcU2BDCnlfoCwoABzjIA5CSO6cykM,9874
|
|
212
212
|
taskflow/tests/unit/worker_based/test_server.py,sha256=HYsAKq7VtL47Y1ngjr6Dwb_PUvG8ZmEYolaciuC1b7s,14293
|
|
213
213
|
taskflow/tests/unit/worker_based/test_types.py,sha256=202PssDJNsIMowjpoljbytwntfx0xvd7MruS6n6E1-o,3343
|
|
214
214
|
taskflow/tests/unit/worker_based/test_worker.py,sha256=XZTXcNAhEFvCaP9O8fKQmtUAnZ3rGxbRckZYH5QGvW0,7068
|
|
215
215
|
taskflow/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
216
216
|
taskflow/types/entity.py,sha256=zo0Fh61nBUQxHo9ej4aFdVygc0nZuaxs0xuP_I9hkeM,1554
|
|
217
217
|
taskflow/types/failure.py,sha256=dX7GfPCx5YdXsIqx9Ly3p5lqaWbUDGc60kJcTYmyO5A,21015
|
|
218
|
-
taskflow/types/graph.py,sha256=
|
|
218
|
+
taskflow/types/graph.py,sha256=Q_bzJACOZVS-vs3u7ARHNjZ6teHZVQbFmHDqzNkQs78,10256
|
|
219
219
|
taskflow/types/latch.py,sha256=OokNoVyYz8B8wNA89-5AP-HHgZGVAR8whuj8cEHlMdE,2160
|
|
220
220
|
taskflow/types/notifier.py,sha256=VRAP3JB_4pOK4u9Mvn-GimgcOfYG4YoE76SzkKI-3Y4,13972
|
|
221
|
-
taskflow/types/sets.py,sha256=
|
|
221
|
+
taskflow/types/sets.py,sha256=ucQKWnOJTJmf2l2OV_hYhMR7LJyq2Zg4Rd_FK0CXgW8,3946
|
|
222
222
|
taskflow/types/timing.py,sha256=AMq5inukPNn3tk-y8URJ8j5B72e0XDbttQGfCzNNy7Y,2280
|
|
223
223
|
taskflow/types/tree.py,sha256=bMWEOKav9ieI5a7foey1VXjRnlTI2qKMMFQk8rSvUN4,15717
|
|
224
224
|
taskflow/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
225
225
|
taskflow/utils/async_utils.py,sha256=mEaeMgWgyahWD4edFPUUT26A-7p5Q4A9r9m665EPs2w,830
|
|
226
|
-
taskflow/utils/banner.py,sha256=
|
|
226
|
+
taskflow/utils/banner.py,sha256=gv81FJHA6GDV3s6bv3TswQ14tC7meQliQtoeDgLdoCk,3589
|
|
227
227
|
taskflow/utils/eventlet_utils.py,sha256=Q4rK-nj4fnOTmJ0mJ0ywVXjCa1hhSZpl6mncc8tdTYA,1230
|
|
228
228
|
taskflow/utils/iter_utils.py,sha256=abR93joAV9DLasdbsJnUpPKy3-9Q8RmALQ8PikQcH3E,4649
|
|
229
|
-
taskflow/utils/kazoo_utils.py,sha256=
|
|
229
|
+
taskflow/utils/kazoo_utils.py,sha256=jXmPdsQqGQeA8rh_KOO6x2u1F03esRX2_JtYtVdid5k,9839
|
|
230
230
|
taskflow/utils/kombu_utils.py,sha256=Wu1pgmaq0W4HlhtHKmRVAQEmjfRYbuE40Cd6qlbl0ak,2489
|
|
231
|
-
taskflow/utils/misc.py,sha256=
|
|
231
|
+
taskflow/utils/misc.py,sha256=bDQIGrmaDmmxy996WulUjSfvQqVrDGSRAFmVBWguOVw,18306
|
|
232
232
|
taskflow/utils/persistence_utils.py,sha256=butzDfSRKoy22Z9Jt92xzDGfabNKxu2kSRgI5sX52jI,3874
|
|
233
233
|
taskflow/utils/redis_utils.py,sha256=gT1xPpV8uXMaQxGWqtpgigHbx4rJijzl329R1r4RDxM,4297
|
|
234
234
|
taskflow/utils/schema_utils.py,sha256=BwZmYjLMC7N2rbx53Z1zREP4jaRQyRNYYOLCFf3Rrkk,1409
|
|
235
235
|
taskflow/utils/threading_utils.py,sha256=wdLhE2HvEQsnO8oKcjOXHRqY-dIJgSxZVX6YW6W6qfo,5816
|
|
236
|
-
taskflow-6.0.
|
|
237
|
-
taskflow-6.0.
|
|
238
|
-
taskflow-6.0.
|
|
239
|
-
taskflow-6.0.
|
|
240
|
-
taskflow-6.0.
|
|
241
|
-
taskflow-6.0.
|
|
242
|
-
taskflow-6.0.
|
|
243
|
-
taskflow-6.0.
|
|
236
|
+
taskflow-6.1.0.dist-info/licenses/AUTHORS,sha256=TGQ-WyY9028CM7-dVhMAXfzgAdYc9Wt0BzNq3dBqFY8,4657
|
|
237
|
+
taskflow-6.1.0.dist-info/licenses/LICENSE,sha256=0t4vVm0tDgtQn7DqH6Nmn0kGSrHeIcV0U8qzdQojTo8,10143
|
|
238
|
+
taskflow-6.1.0.dist-info/METADATA,sha256=ESuOV6EJEkqu1NgB9aQKKIXGLpdo80QUlXIgy4w4b6k,4548
|
|
239
|
+
taskflow-6.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
240
|
+
taskflow-6.1.0.dist-info/entry_points.txt,sha256=-cLcvncQdUIhZ0pSd10UBTItZsJxlgu1uQIhkcpzh4Y,1235
|
|
241
|
+
taskflow-6.1.0.dist-info/pbr.json,sha256=qHXZrKP68V_q5iDAAdg9cNiuqsJw_UusvC1ZHgtHCUE,47
|
|
242
|
+
taskflow-6.1.0.dist-info/top_level.txt,sha256=PsdN41vwysesDlqHCSVVXH4mkTMdMiZFW_yHEAXiZE4,9
|
|
243
|
+
taskflow-6.1.0.dist-info/RECORD,,
|
|
@@ -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>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"git_version": "1a72794f", "is_release": true}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"git_version": "d01920ef", "is_release": true}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|