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.
Files changed (43) hide show
  1. taskflow/atom.py +2 -2
  2. taskflow/conductors/backends/impl_executor.py +8 -18
  3. taskflow/conductors/base.py +24 -0
  4. taskflow/engines/action_engine/compiler.py +1 -1
  5. taskflow/engines/worker_based/proxy.py +1 -1
  6. taskflow/examples/create_parallel_volume.py +2 -2
  7. taskflow/examples/dump_memory_backend.py +1 -1
  8. taskflow/examples/fake_billing.py +1 -1
  9. taskflow/examples/graph_flow.py +2 -2
  10. taskflow/examples/hello_world.py +1 -1
  11. taskflow/examples/jobboard_produce_consume_colors.py +3 -3
  12. taskflow/examples/pseudo_scoping.py +2 -2
  13. taskflow/examples/resume_from_backend.py +1 -1
  14. taskflow/examples/resume_many_flows/resume_all.py +1 -1
  15. taskflow/examples/resume_vm_boot.py +2 -2
  16. taskflow/examples/run_by_iter_enumerate.py +1 -1
  17. taskflow/examples/share_engine_thread.py +1 -1
  18. taskflow/examples/switch_graph_flow.py +1 -1
  19. taskflow/examples/tox_conductor.py +1 -1
  20. taskflow/formatters.py +2 -2
  21. taskflow/jobs/backends/impl_etcd.py +3 -3
  22. taskflow/jobs/backends/impl_redis.py +2 -9
  23. taskflow/listeners/timing.py +1 -1
  24. taskflow/persistence/backends/__init__.py +1 -1
  25. taskflow/test.py +1 -1
  26. taskflow/tests/unit/persistence/base.py +1 -1
  27. taskflow/tests/unit/persistence/test_sql_persistence.py +1 -1
  28. taskflow/tests/unit/worker_based/test_proxy.py +1 -1
  29. taskflow/types/graph.py +3 -3
  30. taskflow/types/sets.py +1 -1
  31. taskflow/utils/banner.py +2 -2
  32. taskflow/utils/kazoo_utils.py +2 -2
  33. taskflow/utils/misc.py +1 -3
  34. taskflow/version.py +1 -1
  35. {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/METADATA +45 -65
  36. {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/RECORD +42 -42
  37. {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/WHEEL +1 -1
  38. {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info/licenses}/AUTHORS +1 -0
  39. taskflow-6.1.0.dist-info/pbr.json +1 -0
  40. taskflow-6.0.1.dist-info/pbr.json +0 -1
  41. {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info}/entry_points.txt +0 -0
  42. {taskflow-6.0.1.dist-info → taskflow-6.1.0.dist-info/licenses}/LICENSE +0 -0
  43. {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 '"{}=={}"'.format(self.name, misc.get_version_string(self))
380
+ return f'"{self.name}=={misc.get_version_string(self)}"'
381
381
 
382
382
  def __repr__(self):
383
- return '<{} {}>'.format(reflection.get_class_name(self), self)
383
+ return f'<{reflection.get_class_name(self)} {self}>'
@@ -121,16 +121,12 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
121
121
  " it has not been")
122
122
 
123
123
  def stop(self):
124
- """Requests the conductor to stop dispatching.
125
-
126
- This method can be used to request that a conductor stop its
127
- consumption & dispatching loop.
128
-
129
- The method returns immediately regardless of whether the conductor has
130
- been stopped.
131
- """
132
124
  self._wait_timeout.interrupt()
133
125
 
126
+ # Inherit the docs, so we can reference them in our class docstring,
127
+ # if we don't do this sphinx gets confused...
128
+ stop.__doc__ = base.Conductor.stop.__doc__
129
+
134
130
  @property
135
131
  def dispatching(self):
136
132
  """Whether or not the dispatching loop is still dispatching."""
@@ -342,14 +338,8 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
342
338
  run.__doc__ = base.Conductor.run.__doc__
343
339
 
344
340
  def wait(self, timeout=None):
345
- """Waits for the conductor to gracefully exit.
346
-
347
- This method waits for the conductor to gracefully exit. An optional
348
- timeout can be provided, which will cause the method to return
349
- within the specified timeout. If the timeout is reached, the returned
350
- value will be ``False``, otherwise it will be ``True``.
351
-
352
- :param timeout: Maximum number of seconds that the :meth:`wait` method
353
- should block for.
354
- """
355
341
  return self._dead.wait(timeout)
342
+
343
+ # Inherit the docs, so we can reference them in our class docstring,
344
+ # if we don't do this sphinx gets confused...
345
+ wait.__doc__ = base.Conductor.wait.__doc__
@@ -161,6 +161,30 @@ class Conductor(metaclass=abc.ABCMeta):
161
161
  forever and/or until stopped).
162
162
  """
163
163
 
164
+ @abc.abstractmethod
165
+ def stop(self):
166
+ """Requests the conductor to stop dispatching.
167
+
168
+ This method can be used to request that a conductor stop its
169
+ consumption & dispatching loop.
170
+
171
+ The method returns immediately regardless of whether the conductor has
172
+ been stopped.
173
+ """
174
+
175
+ @abc.abstractmethod
176
+ def wait(self, timeout=None):
177
+ """Waits for the conductor to gracefully exit.
178
+
179
+ This method waits for the conductor to gracefully exit. An optional
180
+ timeout can be provided, which will cause the method to return
181
+ within the specified timeout. If the timeout is reached, the returned
182
+ value will be ``False``, otherwise it will be ``True``.
183
+
184
+ :param timeout: Maximum number of seconds that the :meth:`wait` method
185
+ should block for.
186
+ """
187
+
164
188
  @abc.abstractmethod
165
189
  def _dispatch_job(self, job):
166
190
  """Dispatches a claimed job for work completion.
@@ -49,7 +49,7 @@ class Terminator:
49
49
 
50
50
  def __init__(self, flow):
51
51
  self._flow = flow
52
- self._name = "{}[$]".format(self._flow.name)
52
+ self._name = f"{self._flow.name}[$]"
53
53
 
54
54
  @property
55
55
  def flow(self):
@@ -143,7 +143,7 @@ class Proxy:
143
143
 
144
144
  def _make_queue(self, routing_key, exchange, channel=None):
145
145
  """Make a named queue for the given exchange."""
146
- queue_name = "{}_{}".format(self._exchange_name, routing_key)
146
+ queue_name = f"{self._exchange_name}_{routing_key}"
147
147
  return kombu.Queue(name=queue_name,
148
148
  routing_key=routing_key, durable=False,
149
149
  exchange=exchange, auto_delete=True,
@@ -43,7 +43,7 @@ def show_time(name):
43
43
  start = time.time()
44
44
  yield
45
45
  end = time.time()
46
- print(" -- {} took {:0.3f} seconds".format(name, end - start))
46
+ print(f" -- {name} took {end - start:0.3f} seconds")
47
47
 
48
48
 
49
49
  # This affects how many volumes to create and how much time to *simulate*
@@ -83,7 +83,7 @@ class VolumeCreator(task.Task):
83
83
  # volume create can be resumed/revert, and is much easier to use for
84
84
  # audit and tracking purposes.
85
85
  base_name = reflection.get_callable_name(self)
86
- super().__init__(name="{}-{}".format(base_name, volume_id))
86
+ super().__init__(name=f"{base_name}-{volume_id}")
87
87
  self._volume_id = volume_id
88
88
 
89
89
  def execute(self):
@@ -65,6 +65,6 @@ print("---------")
65
65
  for path in backend.memory.ls_r(backend.memory.root_path, absolute=True):
66
66
  value = backend.memory[path]
67
67
  if value:
68
- print("{} -> {}".format(path, value))
68
+ print(f"{path} -> {value}")
69
69
  else:
70
70
  print("%s" % (path))
@@ -137,7 +137,7 @@ class ActivateDriver(task.Task):
137
137
  def update_progress(self, progress, **kwargs):
138
138
  # Override the parent method to also print out the status.
139
139
  super().update_progress(progress, **kwargs)
140
- print("{} is {:0.2f}% done".format(self.name, progress * 100))
140
+ print(f"{self.name} is {progress * 100:0.2f}% done")
141
141
 
142
142
 
143
143
  class DeclareSuccess(task.Task):
@@ -97,7 +97,7 @@ print("Single threaded engine result %s" % result)
97
97
  for (name, value) in expected:
98
98
  actual = result.get(name)
99
99
  if actual != value:
100
- sys.stderr.write("{} != {}\n".format(actual, value))
100
+ sys.stderr.write(f"{actual} != {value}\n")
101
101
  unexpected += 1
102
102
 
103
103
  result = taskflow.engines.run(
@@ -107,7 +107,7 @@ print("Multi threaded engine result %s" % result)
107
107
  for (name, value) in expected:
108
108
  actual = result.get(name)
109
109
  if actual != value:
110
- sys.stderr.write("{} != {}\n".format(actual, value))
110
+ sys.stderr.write(f"{actual} != {value}\n")
111
111
  unexpected += 1
112
112
 
113
113
  if unexpected:
@@ -41,7 +41,7 @@ class PrinterTask(task.Task):
41
41
 
42
42
  def execute(self, output):
43
43
  if self._show_name:
44
- print("{}: {}".format(self.name, output))
44
+ print(f"{self.name}: {output}")
45
45
  else:
46
46
  print(output)
47
47
 
@@ -82,9 +82,9 @@ def dispatch_work(job):
82
82
  def safe_print(name, message, prefix=""):
83
83
  with STDOUT_LOCK:
84
84
  if prefix:
85
- print("{} {}: {}".format(prefix, name, message))
85
+ print(f"{prefix} {name}: {message}")
86
86
  else:
87
- print("{}: {}".format(name, message))
87
+ print(f"{name}: {message}")
88
88
 
89
89
 
90
90
  def worker(ident, client, consumed):
@@ -136,7 +136,7 @@ def producer(ident, client):
136
136
  safe_print(name, "started")
137
137
  with backends.backend(name, SHARED_CONF.copy(), client=client) as board:
138
138
  for i in range(0, PRODUCER_UNITS):
139
- job_name = "{}-{}".format(name, i)
139
+ job_name = f"{name}-{i}"
140
140
  details = {
141
141
  'color': random.choice(['red', 'blue']),
142
142
  }
@@ -65,7 +65,7 @@ class CallTask(task.Task):
65
65
  """Task that calls person by number."""
66
66
 
67
67
  def execute(self, person, number):
68
- print('Calling {} {}.'.format(person, number))
68
+ print(f'Calling {person} {number}.')
69
69
 
70
70
  # This is how it works for one person:
71
71
 
@@ -82,7 +82,7 @@ taskflow.engines.run(simple_flow, store={'person': 'Josh'})
82
82
  # we use `rebind` argument of task constructor.
83
83
  def subflow_factory(prefix):
84
84
  def pr(what):
85
- return '{}-{}'.format(prefix, what)
85
+ return f'{prefix}-{what}'
86
86
 
87
87
  return lf.Flow(pr('flow')).add(
88
88
  FetchNumberTask(pr('fetch'),
@@ -60,7 +60,7 @@ import example_utils as eu # noqa
60
60
 
61
61
  def print_task_states(flowdetail, msg):
62
62
  eu.print_wrapped(msg)
63
- print("Flow '{}' state: {}".format(flowdetail.name, flowdetail.state))
63
+ print(f"Flow '{flowdetail.name}' state: {flowdetail.state}")
64
64
  # Sort by these so that our test validation doesn't get confused by the
65
65
  # order in which the items in the flow detail can be in.
66
66
  items = sorted((td.name, td.version, td.state, td.results)
@@ -37,7 +37,7 @@ FINISHED_STATES = (states.SUCCESS, states.FAILURE, states.REVERTED)
37
37
 
38
38
 
39
39
  def resume(flowdetail, backend):
40
- print('Resuming flow {} {}'.format(flowdetail.name, flowdetail.uuid))
40
+ print(f'Resuming flow {flowdetail.name} {flowdetail.uuid}')
41
41
  engine = taskflow.engines.load_from_detail(flow_detail=flowdetail,
42
42
  backend=backend)
43
43
  engine.run()
@@ -110,7 +110,7 @@ class DownloadImages(task.Task):
110
110
  def execute(self, image_locations):
111
111
  for src, loc in image_locations.items():
112
112
  with slow_down(1):
113
- print("Downloading from {} => {}".format(src, loc))
113
+ print(f"Downloading from {src} => {loc}")
114
114
  return sorted(image_locations.values())
115
115
 
116
116
 
@@ -149,7 +149,7 @@ class WriteNetworkSettings(task.Task):
149
149
  def execute(self, download_paths, network_settings):
150
150
  for j, path in enumerate(download_paths):
151
151
  with slow_down(1):
152
- print("Mounting {} to /tmp/{}".format(path, j))
152
+ print(f"Mounting {path} to /tmp/{j}")
153
153
  for i, setting in enumerate(network_settings):
154
154
  filename = ("/tmp/etc/sysconfig/network-scripts/"
155
155
  "ifcfg-eth%s" % (i))
@@ -49,4 +49,4 @@ e.compile()
49
49
  e.prepare()
50
50
 
51
51
  for i, st in enumerate(e.run_iter(), 1):
52
- print("Transition {}: {}".format(i, st))
52
+ print(f"Transition {i}: {st}")
@@ -45,7 +45,7 @@ class DelayedTask(task.Task):
45
45
  self._wait_for = random.random()
46
46
 
47
47
  def execute(self):
48
- print("Running '{}' in thread '{}'".format(self.name, tu.get_ident()))
48
+ print(f"Running '{self.name}' in thread '{tu.get_ident()}'")
49
49
  time.sleep(self._wait_for)
50
50
 
51
51
 
@@ -62,7 +62,7 @@ while entries:
62
62
  path = entries.pop()
63
63
  value = backend.memory[path]
64
64
  if value:
65
- print("{} -> {}".format(path, value))
65
+ print(f"{path} -> {value}")
66
66
  else:
67
67
  print("%s" % (path))
68
68
  entries.extend(os.path.join(path, child)
@@ -58,7 +58,7 @@ from taskflow.utils import threading_utils
58
58
  RUN_TIME = 5
59
59
  REVIEW_CREATION_DELAY = 0.5
60
60
  SCAN_DELAY = 0.1
61
- NAME = "{}_{}".format(socket.getfqdn(), os.getpid())
61
+ NAME = f"{socket.getfqdn()}_{os.getpid()}"
62
62
 
63
63
  # This won't really use zookeeper but will use a local version of it using
64
64
  # the zake library that mimics an actual zookeeper cluster using threads and
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 '{}' {}".format(atom_name, atom_attrs)
123
+ return f"Atom '{atom_name}' {atom_attrs}"
124
124
  else:
125
125
  return "Atom '%s'" % (atom_name)
126
126
  else:
@@ -170,7 +170,7 @@ class FailureFormatter:
170
170
  rooted_tree = builder(graph, atom)
171
171
  child_count = rooted_tree.child_count(only_direct=False)
172
172
  buff.write_nl(
173
- '{} {} (most recent first):'.format(child_count, kind))
173
+ f'{child_count} {kind} (most recent first):')
174
174
  formatter = functools.partial(self._format_node, storage, cache)
175
175
  direct_child_count = rooted_tree.child_count(only_direct=True)
176
176
  for i, child in enumerate(rooted_tree, 1):
@@ -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) -> typing.Optional[dict]:
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) -> typing.Optional[dict]:
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
- typing.Optional[str], typing.Optional[bytes]]:
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 (msgpack.PackException, ValueError):
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 (msgpack.UnpackException, ValueError):
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))
@@ -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.".format(item_name, item_type))
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 {}: {}".format(backend, e))
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 >= {}".format(other, self.source))
39
+ return matchers.Mismatch(f"{other} was not >= {self.source}")
40
40
 
41
41
 
42
42
  class FailureRegexpMatcher:
@@ -71,7 +71,7 @@ class PersistenceTestMixin:
71
71
  lb_ids = {}
72
72
  for i in range(0, 10):
73
73
  lb_id = uuidutils.generate_uuid()
74
- lb_name = 'lb-{}-{}'.format(i, lb_id)
74
+ lb_name = f'lb-{i}-{lb_id}'
75
75
  lb = models.LogBook(name=lb_name, uuid=lb_id)
76
76
  lb_ids[lb_id] = True
77
77
 
@@ -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/{}".format(backend, user, passwd, database)
62
+ return f"{backend}://{user}:{passwd}@localhost/{database}"
63
63
 
64
64
 
65
65
  def _mysql_exists():
@@ -70,7 +70,7 @@ class TestProxy(test.MockTestCase):
70
70
  self.resetMasterMock()
71
71
 
72
72
  def _queue_name(self, topic):
73
- return "{}_{}".format(self.exchange, topic)
73
+ return f"{self.exchange}_{topic}"
74
74
 
75
75
  def proxy_start_calls(self, calls, exc_type=mock.ANY):
76
76
  return [
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(" - {} ({})".format(n, n_data))
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(" {} {} {} ({})".format(u, edge_notation, v, e_data))
38
+ lines.append(f" {u} {edge_notation} {v} ({e_data})")
39
39
  else:
40
- lines.append(" {} {} {}".format(u, edge_notation, v))
40
+ lines.append(f" {u} {edge_notation} {v}")
41
41
  return lines
42
42
 
43
43
 
taskflow/types/sets.py CHANGED
@@ -64,7 +64,7 @@ class OrderedSet(abc.Set, abc.Hashable):
64
64
  return tuple(self)
65
65
 
66
66
  def __repr__(self):
67
- return "{}({})".format(type(self).__name__, list(self))
67
+ return f"{type(self).__name__}({list(self)})"
68
68
 
69
69
  def copy(self):
70
70
  """Return a shallow copy of a set."""
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(" {}. {}".format(j + 1, section))
89
+ buf.write_nl(f" {j + 1}. {section}")
90
90
  else:
91
- buf.write(" {}. {}".format(j + 1, section))
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"
@@ -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("{}:{}".format(k, v))
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("{}@{}".format(pretty_cause, pretty_op))
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('{}.{}'.format(pkg, cls))
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
@@ -26,4 +26,4 @@ def version_string_with_package():
26
26
  if TASK_PACKAGE is None:
27
27
  return version_string()
28
28
  else:
29
- return "{}-{}".format(version_string(), TASK_PACKAGE)
29
+ return f"{version_string()}-{TASK_PACKAGE}"
@@ -1,94 +1,75 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: taskflow
3
- Version: 6.0.1
3
+ Version: 6.1.0
4
4
  Summary: Taskflow structured state management library.
5
- Home-page: https://docs.openstack.org/taskflow/latest/
6
- Author: OpenStack
7
- Author-email: openstack-discuss@lists.openstack.org
8
- Keywords: reliable,tasks,execution,parallel,dataflow,workflows,distributed
5
+ Author-email: OpenStack <openstack-discuss@lists.openstack.org>
6
+ License: Apache-2.0
7
+ Project-URL: Homepage, https://docs.openstack.org/taskflow
8
+ Project-URL: Repository, https://opendev.org/openstack/taskflow
9
9
  Classifier: Development Status :: 5 - Production/Stable
10
- Classifier: Environment :: OpenStack
10
+ Classifier: Environment :: Console
11
11
  Classifier: Intended Audience :: Developers
12
- Classifier: Intended Audience :: Information Technology
13
12
  Classifier: License :: OSI Approved :: Apache Software License
14
13
  Classifier: Operating System :: POSIX :: Linux
15
14
  Classifier: Programming Language :: Python
16
15
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.9
18
16
  Classifier: Programming Language :: Python :: 3.10
19
17
  Classifier: Programming Language :: Python :: 3.11
20
18
  Classifier: Programming Language :: Python :: 3.12
21
- Classifier: Programming Language :: Python :: 3 :: Only
22
- Classifier: Programming Language :: Python :: Implementation :: CPython
19
+ Classifier: Programming Language :: Python :: 3.13
23
20
  Classifier: Topic :: Software Development :: Libraries
24
21
  Classifier: Topic :: System :: Distributed Computing
25
- Requires-Python: >=3.9
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/x-rst
26
24
  License-File: LICENSE
27
25
  License-File: AUTHORS
28
- Requires-Dist: pbr >=2.0.0
29
- Requires-Dist: debtcollector >=1.2.0
30
- Requires-Dist: futurist >=1.2.0
31
- Requires-Dist: fasteners >=0.17.3
32
- Requires-Dist: networkx >=2.1.0
33
- Requires-Dist: stevedore >=1.20.0
34
- Requires-Dist: jsonschema >=3.2.0
35
- Requires-Dist: automaton >=1.9.0
36
- Requires-Dist: oslo.utils >=3.33.0
37
- Requires-Dist: oslo.serialization >=2.18.0
38
- Requires-Dist: tenacity >=6.0.0
39
- Requires-Dist: cachetools >=2.0.0
40
- Requires-Dist: pydot >=1.2.4
41
- Provides-Extra: database
42
- Requires-Dist: SQLAlchemy >=1.0.10 ; extra == 'database'
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 >=4.0.0 ; extra == 'redis'
53
- Provides-Extra: test
54
- Requires-Dist: kazoo >=2.6.0 ; extra == 'test'
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 >=4.3.0 ; extra == 'workers'
73
- Provides-Extra: zookeeper
74
- Requires-Dist: kazoo >=2.6.0 ; extra == 'zookeeper'
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
- Team and repository tags
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=Jrwhg1hMOTq7JaOFdfkyxYtjUD5jfyaTJZD_CDGA3QE,17317
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=aa2MqmjskHVEJGj_oysjpzh_YL2fbTFpxaxpnYKorRI,8008
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=PlnbxD6ZOtPbPyot2GRUfW4aFSgeo9GGVI_tnfzYiRk,9303
13
- taskflow/version.py,sha256=z1GVMw0Q7jeoGINS9HvB_UGESUuP2TTB5L2NnT2NNMA,1070
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=JqVGMdYYarAEdyU2OW_6jg-_AYkDkhyIeBwdqoqJ7Yo,7299
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=VlI5dscCFSlmmG9zZbwWwYyxJ4rR2SQJRGOT_vlG26c,15074
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=N22tKO6iaOiHgW4HaQGdrKeQ6RkiNSVbmjKE8T53Uc4,16096
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=7UEgOF77zrWhPm_cmaYyOgzD3sa7NnoUe42n2NWirK0,9496
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=um49ZhX2CEqQTW_2otKkmVKv47-6ODTlVLe2qMKKCn8,4242
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=hQ4ZcEgrPdgGOWWtGUe3G3HkxQvU89wdA8mCVeMnS2c,2102
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=I3mgUSIIzowHdpUpkQgeBvqCxIVu5GwqRZ_ADP2Oe68,6698
63
- taskflow/examples/graph_flow.py,sha256=SVR9NlKew2WKTMRQvM-WyHFEVhnYVpDruAaEZ1dTjFo,3444
64
- taskflow/examples/hello_world.py,sha256=r_QHxmQzvsp4HXX3Cdyk9UK-Yvf01Szobt45-QEDMVw,4178
65
- taskflow/examples/jobboard_produce_consume_colors.py,sha256=-FyP9WI5RjQX02nQ7Sel3m0bcBBnlrXKOX_SM-Yyv1A,6808
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=jsfF9f451U8y0fGUwnGQWrko2EQeg-mIzgFfZ1YC7g0,3480
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=C0fqj3sxkvzVxDUHE1V1SOJKBjQ6Pc5mozh6h_9_rys,4971
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=4wnvfhO4lNwLPLF0FQdYypegxp6-cGiA-1a7NIUoJz4,9391
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=RsLJ4bpE_dS42Oeoxp5Y-kguTPcpq1a3ETRGFlBmv78,1699
84
- taskflow/examples/share_engine_thread.py,sha256=NU2wRuOx30kz5uPZkd70vBQlhMRwNl2BoB1CGZq9gso,2704
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=7gQWRyZsBaEYkHL_yjtCBx3ROLY-mkkYxQsmJ1TEEDo,1883
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=J9p0KAx6GIdlxCZdzMNapooDKbkRYLZFLbLwD_75bR0,8459
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=tIosg7GpnzfNkYEAaMGLwy9rGmUFhszRkocIVGgpZI4,1708
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=3o5xBe0UkqPo9b8LYcbHD2L7e5lDlJHjo8VQsyd4iIE,22067
108
- taskflow/jobs/backends/impl_redis.py,sha256=RgbUwWKTbXMOvkZOv8lChZoXKmEHJsA2da1Rfr2SRaE,44085
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=-2q9Ka3aMkNbWsJhER6SgNDMt-z-yD6i45pCRTywWU8,6663
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=B76pXpP_l8b4vBvbpbU1TtUHFLgVAHxqUibIoEW0rLU,3331
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=MdnQD8nG_TghT7VL4DRyluhCFvjqfjPP4IzSxQUnrMg,16518
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=8TA5B1z2CNbtL8S4D0devfTrNR6BQlGObUqkFjcM1CQ,10188
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=JbpqrYP7R6BoLRE69yFh3gBq2sefqr442HwEKh7Ks0U,9884
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=py6QZ7QCp76Nz_0mMhnW4YBaxTPt9xMe3Z0TTm96CHY,10292
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=gbcQSbZybBmB7Bht0vQKYvJ7LKVmu3_aeZ8cRM5Xy4E,3956
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=ZgxwxPk85YbGiYX8TL836BbKeYgnZohrSaGGF47Y_Fk,3609
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=GAun1C9DbZ9WQvCPa3G-AqKqupRojFw6Lbh7ORNu86Q,9859
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=8HYTfui4a0-pXsRwVxi48i5l4XYsGhgHzb9pKfz7p7Q,18458
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.1.dist-info/AUTHORS,sha256=WvZWwtKE3NpQerTymaWGoTlVa6zh4KfYlWvEXsJv1PE,4608
237
- taskflow-6.0.1.dist-info/LICENSE,sha256=0t4vVm0tDgtQn7DqH6Nmn0kGSrHeIcV0U8qzdQojTo8,10143
238
- taskflow-6.0.1.dist-info/METADATA,sha256=_zHJQsfhRuZxAY795gyZHXoXHrWtTRSZDsZdxLsmfYw,5576
239
- taskflow-6.0.1.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
240
- taskflow-6.0.1.dist-info/entry_points.txt,sha256=-cLcvncQdUIhZ0pSd10UBTItZsJxlgu1uQIhkcpzh4Y,1235
241
- taskflow-6.0.1.dist-info/pbr.json,sha256=3X-WWXQHfTfVjIcORiKTlWOOn2jQxu640Y953ok-9Io,47
242
- taskflow-6.0.1.dist-info/top_level.txt,sha256=PsdN41vwysesDlqHCSVVXH4mkTMdMiZFW_yHEAXiZE4,9
243
- taskflow-6.0.1.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.2)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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}