taskflow 5.4.0__py3-none-any.whl → 5.6.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.
@@ -209,7 +209,7 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
209
209
  self._log.info("Job completed successfully: %s", job)
210
210
  return consume
211
211
 
212
- def _try_finish_job(self, job, consume):
212
+ def _try_finish_job(self, job, consume, trash=False):
213
213
  try:
214
214
  if consume:
215
215
  self._jobboard.consume(job, self._name)
@@ -218,6 +218,13 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
218
218
  'conductor': self,
219
219
  'persistence': self._persistence,
220
220
  })
221
+ elif trash:
222
+ self._jobboard.trash(job, self._name)
223
+ self._notifier.notify("job_trashed", {
224
+ 'job': job,
225
+ 'conductor': self,
226
+ 'persistence': self._persistence,
227
+ })
221
228
  else:
222
229
  self._jobboard.abandon(job, self._name)
223
230
  self._notifier.notify("job_abandoned", {
@@ -235,6 +242,7 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
235
242
 
236
243
  def _on_job_done(self, job, fut):
237
244
  consume = False
245
+ trash = False
238
246
  try:
239
247
  consume = fut.result()
240
248
  except KeyboardInterrupt:
@@ -242,8 +250,9 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
242
250
  self._log.warn("Job dispatching interrupted: %s", job)
243
251
  except Exception:
244
252
  self._log.warn("Job dispatching failed: %s", job, exc_info=True)
253
+ trash = True
245
254
  try:
246
- self._try_finish_job(job, consume)
255
+ self._try_finish_job(job, consume, trash)
247
256
  finally:
248
257
  self._dispatched.discard(fut)
249
258
 
@@ -17,6 +17,7 @@
17
17
  import contextlib
18
18
  import datetime
19
19
  import functools
20
+ import re
20
21
  import string
21
22
  import threading
22
23
  import time
@@ -263,6 +264,7 @@ class RedisJobBoard(base.JobBoard):
263
264
  ('port', int),
264
265
 
265
266
  # See: http://redis.io/commands/auth
267
+ ('username', str),
266
268
  ('password', str),
267
269
 
268
270
  # Data encoding/decoding + error handling
@@ -557,6 +559,18 @@ return cmsgpack.pack(result)
557
559
  ut-were-afraid-to-ask
558
560
  """
559
561
 
562
+ @classmethod
563
+ def _parse_sentinel(cls, sentinel):
564
+ # IPv6 (eg. [::1]:6379 )
565
+ match = re.search(r'^\[(\S+)\]:(\d+)$', sentinel)
566
+ if match:
567
+ return (match[1], int(match[2]))
568
+ # IPv4 or hostname (eg. 127.0.0.1:6379 or localhost:6379)
569
+ match = re.search(r'^(\S+):(\d+)$', sentinel)
570
+ if match:
571
+ return (match[1], int(match[2]))
572
+ raise ValueError('Malformed sentinel server format')
573
+
560
574
  @classmethod
561
575
  def _make_client(cls, conf):
562
576
  client_conf = {}
@@ -567,15 +581,12 @@ return cmsgpack.pack(result)
567
581
  else:
568
582
  client_conf[key] = conf[key]
569
583
  if conf.get('sentinel') is not None:
570
- sentinel_conf = {}
571
- # sentinel do not have ssl kwargs
572
- for key in client_conf:
573
- if 'ssl' not in key:
574
- sentinel_conf[key] = client_conf[key]
575
- s = sentinel.Sentinel([(sentinel_conf.pop('host'),
576
- sentinel_conf.pop('port'))],
584
+ sentinels = [(client_conf.pop('host'), client_conf.pop('port'))]
585
+ for fallback in conf.get('sentinel_fallbacks', []):
586
+ sentinels.append(cls._parse_sentinel(fallback))
587
+ s = sentinel.Sentinel(sentinels,
577
588
  sentinel_kwargs=conf.get('sentinel_kwargs'),
578
- **sentinel_conf)
589
+ **client_conf)
579
590
  return s.master_for(conf['sentinel'])
580
591
  else:
581
592
  return ru.RedisClient(**client_conf)
@@ -856,4 +856,4 @@ class ZookeeperJobBoard(base.NotifyingJobBoard):
856
856
  "Failed to do post-connection"
857
857
  " initialization", cause=exc)
858
858
  finally:
859
- del(exc_type, exc, exc_tb)
859
+ del (exc_type, exc, exc_tb)
taskflow/jobs/base.py CHANGED
@@ -24,6 +24,7 @@ import time
24
24
  import enum
25
25
  from oslo_utils import timeutils
26
26
  from oslo_utils import uuidutils
27
+ import tenacity
27
28
 
28
29
  from taskflow import exceptions as excp
29
30
  from taskflow import states
@@ -31,6 +32,10 @@ from taskflow.types import notifier
31
32
  from taskflow.utils import iter_utils
32
33
 
33
34
 
35
+ RETRY_ATTEMPTS = 3
36
+ RETRY_WAIT_TIMEOUT = 5
37
+
38
+
34
39
  class JobPriority(enum.Enum):
35
40
  """Enum of job priorities (modeled after hadoop job priorities)."""
36
41
 
@@ -251,6 +256,11 @@ class Job(object, metaclass=abc.ABCMeta):
251
256
  """The non-uniquely identifying name of this job."""
252
257
  return self._name
253
258
 
259
+ @tenacity.retry(retry=tenacity.retry_if_exception_type(
260
+ exception_types=excp.StorageFailure),
261
+ stop=tenacity.stop_after_attempt(RETRY_ATTEMPTS),
262
+ wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT),
263
+ reraise=True)
254
264
  def _load_book(self):
255
265
  book_uuid = self.book_uuid
256
266
  if self._backend is not None and book_uuid is not None:
taskflow/storage.py CHANGED
@@ -454,7 +454,8 @@ class Storage(object):
454
454
  @tenacity.retry(retry=tenacity.retry_if_exception_type(
455
455
  exception_types=exceptions.StorageFailure),
456
456
  stop=tenacity.stop_after_attempt(RETRY_ATTEMPTS),
457
- wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT))
457
+ wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT),
458
+ reraise=True)
458
459
  def _save_flow_detail(self, conn, original_flow_detail, flow_detail):
459
460
  # NOTE(harlowja): we need to update our contained flow detail if
460
461
  # the result of the update actually added more (aka another process
@@ -491,7 +492,8 @@ class Storage(object):
491
492
  @tenacity.retry(retry=tenacity.retry_if_exception_type(
492
493
  exception_types=exceptions.StorageFailure),
493
494
  stop=tenacity.stop_after_attempt(RETRY_ATTEMPTS),
494
- wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT))
495
+ wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT),
496
+ reraise=True)
495
497
  def _save_atom_detail(self, conn, original_atom_detail, atom_detail):
496
498
  # NOTE(harlowja): we need to update our contained atom detail if
497
499
  # the result of the update actually added more (aka another process
@@ -106,12 +106,14 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
106
106
  def test__make_client(self):
107
107
  conf = {'host': '127.0.0.1',
108
108
  'port': 6379,
109
+ 'username': 'default',
109
110
  'password': 'secret',
110
111
  'namespace': 'test'
111
112
  }
112
113
  test_conf = {
113
114
  'host': '127.0.0.1',
114
115
  'port': 6379,
116
+ 'username': 'default',
115
117
  'password': 'secret',
116
118
  }
117
119
  with mock.patch('taskflow.utils.redis_utils.RedisClient') as mock_ru:
@@ -121,15 +123,73 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
121
123
  def test__make_client_sentinel(self):
122
124
  conf = {'host': '127.0.0.1',
123
125
  'port': 26379,
126
+ 'username': 'default',
124
127
  'password': 'secret',
125
128
  'namespace': 'test',
126
129
  'sentinel': 'mymaster',
127
- 'sentinel_kwargs': {'password': 'senitelsecret'}}
130
+ 'sentinel_kwargs': {
131
+ 'username': 'default',
132
+ 'password': 'senitelsecret'
133
+ }}
128
134
  with mock.patch('redis.sentinel.Sentinel') as mock_sentinel:
129
135
  impl_redis.RedisJobBoard('test-board', conf)
130
136
  test_conf = {
137
+ 'username': 'default',
131
138
  'password': 'secret',
132
139
  }
140
+ mock_sentinel.assert_called_once_with(
141
+ [('127.0.0.1', 26379)],
142
+ sentinel_kwargs={
143
+ 'username': 'default',
144
+ 'password': 'senitelsecret'
145
+ },
146
+ **test_conf)
147
+ mock_sentinel().master_for.assert_called_once_with('mymaster')
148
+
149
+ def test__make_client_sentinel_fallbacks(self):
150
+ conf = {'host': '127.0.0.1',
151
+ 'port': 26379,
152
+ 'username': 'default',
153
+ 'password': 'secret',
154
+ 'namespace': 'test',
155
+ 'sentinel': 'mymaster',
156
+ 'sentinel_fallbacks': [
157
+ '[::1]:26379', '127.0.0.2:26379', 'localhost:26379'
158
+ ]}
159
+ with mock.patch('redis.sentinel.Sentinel') as mock_sentinel:
160
+ impl_redis.RedisJobBoard('test-board', conf)
161
+ test_conf = {
162
+ 'username': 'default',
163
+ 'password': 'secret',
164
+ }
165
+ mock_sentinel.assert_called_once_with(
166
+ [('127.0.0.1', 26379), ('::1', 26379),
167
+ ('127.0.0.2', 26379), ('localhost', 26379)],
168
+ sentinel_kwargs={
169
+ 'username': 'default',
170
+ 'password': 'secret'
171
+ },
172
+ **test_conf)
173
+ mock_sentinel().master_for.assert_called_once_with('mymaster')
174
+
175
+ def test__make_client_sentinel_ssl(self):
176
+ conf = {'host': '127.0.0.1',
177
+ 'port': 26379,
178
+ 'username': 'default',
179
+ 'password': 'secret',
180
+ 'namespace': 'test',
181
+ 'sentinel': 'mymaster',
182
+ 'sentinel_kwargs': {'password': 'senitelsecret'},
183
+ 'ssl': True,
184
+ 'ssl_ca_certs': '/etc/ssl/certs'}
185
+ with mock.patch('redis.sentinel.Sentinel') as mock_sentinel:
186
+ impl_redis.RedisJobBoard('test-board', conf)
187
+ test_conf = {
188
+ 'username': 'default',
189
+ 'password': 'secret',
190
+ 'ssl': True,
191
+ 'ssl_ca_certs': '/etc/ssl/certs',
192
+ }
133
193
  mock_sentinel.assert_called_once_with(
134
194
  [('127.0.0.1', 26379)],
135
195
  sentinel_kwargs={'password': 'senitelsecret'},
@@ -271,12 +271,12 @@ class ZakeJobboardTest(test.TestCase, ZookeeperBoardTestMixin):
271
271
  with base.connect_close(self.board):
272
272
  self.board.register_entity(entity_instance)
273
273
  # Check '.entity' node has been created
274
- self.assertTrue(self.board.entity_path in self.client.storage.paths)
274
+ self.assertIn(self.board.entity_path, self.client.storage.paths)
275
275
 
276
276
  conductor_entity_path = k_paths.join(self.board.entity_path,
277
277
  'conductor',
278
278
  conductor_name)
279
- self.assertTrue(conductor_entity_path in self.client.storage.paths)
279
+ self.assertIn(conductor_entity_path, self.client.storage.paths)
280
280
  conductor_data = (
281
281
  self.client.storage.paths[conductor_entity_path]['data'])
282
282
  self.assertTrue(len(conductor_data) > 0)
@@ -239,7 +239,7 @@ class GraphFlowTest(test.TestCase):
239
239
  tasks = set([task1, task2, f1])
240
240
  f = gf.Flow('test').add(task1, task2, f1)
241
241
  for (n, data) in f.iter_nodes():
242
- self.assertTrue(n in tasks)
242
+ self.assertIn(n, tasks)
243
243
  self.assertDictEqual({}, data)
244
244
 
245
245
  def test_iter_links(self):
@@ -251,8 +251,8 @@ class GraphFlowTest(test.TestCase):
251
251
  tasks = set([task1, task2, f1])
252
252
  f = gf.Flow('test').add(task1, task2, f1)
253
253
  for (u, v, data) in f.iter_links():
254
- self.assertTrue(u in tasks)
255
- self.assertTrue(v in tasks)
254
+ self.assertIn(u, tasks)
255
+ self.assertIn(v, tasks)
256
256
  self.assertDictEqual({}, data)
257
257
 
258
258
 
@@ -130,7 +130,7 @@ class LinearFlowTest(test.TestCase):
130
130
  f = lf.Flow('test').add(task1, task2, task3)
131
131
  tasks = set([task1, task2, task3])
132
132
  for (node, data) in f.iter_nodes():
133
- self.assertTrue(node in tasks)
133
+ self.assertIn(node, tasks)
134
134
  self.assertDictEqual({}, data)
135
135
 
136
136
  def test_iter_links(self):
@@ -140,6 +140,6 @@ class LinearFlowTest(test.TestCase):
140
140
  f = lf.Flow('test').add(task1, task2, task3)
141
141
  tasks = set([task1, task2, task3])
142
142
  for (u, v, data) in f.iter_links():
143
- self.assertTrue(u in tasks)
144
- self.assertTrue(v in tasks)
143
+ self.assertIn(u, tasks)
144
+ self.assertIn(v, tasks)
145
145
  self.assertDictEqual({'invariant': True}, data)
@@ -126,7 +126,7 @@ class UnorderedFlowTest(test.TestCase):
126
126
  f = uf.Flow('test')
127
127
  f.add(task2, task1)
128
128
  for (node, data) in f.iter_nodes():
129
- self.assertTrue(node in tasks)
129
+ self.assertIn(node, tasks)
130
130
  self.assertDictEqual({}, data)
131
131
 
132
132
  def test_iter_links(self):
@@ -70,6 +70,7 @@ Stanislav Kudriashev <skudriashev@griddynamics.com>
70
70
  Stanislav Kudriashev <stas.kudriashev@gmail.com>
71
71
  Stephen Finucane <stephenfin@redhat.com>
72
72
  Suneel Bomminayuni <suneelb@yahoo-inc.com>
73
+ Takashi Kajinami <kajinamit@oss.nttdata.com>
73
74
  Takashi Kajinami <tkajinam@redhat.com>
74
75
  Theodoros Tsioutsias <theodoros.tsioutsias@cern.ch>
75
76
  Thomas Bechtold <tbechtold@suse.com>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: taskflow
3
- Version: 5.4.0
3
+ Version: 5.6.0
4
4
  Summary: Taskflow structured state management library.
5
5
  Home-page: https://docs.openstack.org/taskflow/latest/
6
6
  Author: OpenStack
@@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3
19
19
  Classifier: Programming Language :: Python :: 3.8
20
20
  Classifier: Programming Language :: Python :: 3.9
21
21
  Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
22
23
  Classifier: Programming Language :: Python :: 3 :: Only
23
24
  Classifier: Programming Language :: Python :: Implementation :: CPython
24
25
  Classifier: Topic :: Software Development :: Libraries
@@ -45,7 +46,7 @@ Requires-Dist: psycopg2 (>=2.8.0) ; extra == 'database'
45
46
  Provides-Extra: eventlet
46
47
  Requires-Dist: eventlet (!=0.18.3,!=0.20.1,!=0.21.0,>=0.18.2) ; extra == 'eventlet'
47
48
  Provides-Extra: redis
48
- Requires-Dist: redis (>=3.0.0) ; extra == 'redis'
49
+ Requires-Dist: redis (>=4.0.0) ; extra == 'redis'
49
50
  Provides-Extra: test
50
51
  Requires-Dist: hacking (<0.11,>=0.10.0) ; extra == 'test'
51
52
  Requires-Dist: mock (>=2.0.0) ; extra == 'test'
@@ -7,7 +7,7 @@ taskflow/formatters.py,sha256=vJ_vSSW08eNv3v4kQAKSN7Zu91CxL1CyenTg1VMVVOA,7441
7
7
  taskflow/logging.py,sha256=FwO1p_z75Dozk8ieCjAZEnEiq92ErQAAePMVpynx4Gs,1870
8
8
  taskflow/retry.py,sha256=Dk-IcdPi5n2502fzmVMjrWLzlrXp6h1ak_xOpOWoh6s,14537
9
9
  taskflow/states.py,sha256=3MRdAfs0x94QhDjl-RGyTfxAbkL3APtNr_qQf6apqbE,6901
10
- taskflow/storage.py,sha256=HZPfmUhqN33DRO8oo3b9mXQSSSuxt5fKkXVzQTwXPPw,52046
10
+ taskflow/storage.py,sha256=CSCegSPkrw2QDP6qGrzUYTWBFBX34Kqv0p9hwYId9oM,52114
11
11
  taskflow/task.py,sha256=qw79ho1bhwe5KttSPjalfUlCTfLUjNGc1twNdTFMi4w,10052
12
12
  taskflow/test.py,sha256=iIHle3qsM2980YPVfPDMJ8q1bpzqkmQjvreAUlMTrX4,10456
13
13
  taskflow/version.py,sha256=QWhiNICILD4xTAZPrJVUF9dsH-VoCHbHsKuwPA3IMrE,1263
@@ -15,7 +15,7 @@ taskflow/conductors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
15
15
  taskflow/conductors/base.py,sha256=k7E_zu9CIORhODWzwmxh7w8fSNhG6dJaYEfLwIxhxXE,7332
16
16
  taskflow/conductors/backends/__init__.py,sha256=UJS_4cDCt9PT1jrTcmB6cNk4yJpRm1LEoq4rigvaWQ0,1634
17
17
  taskflow/conductors/backends/impl_blocking.py,sha256=WGm0_EZT2UhwEOWEQ3cZ5t4k_ZIWwe-8fstdYX6OYv4,1516
18
- taskflow/conductors/backends/impl_executor.py,sha256=b5Nfwgaik7Su-LW5lLDMoT9xCCtmpmSdyzt1Mt_QsD8,14816
18
+ taskflow/conductors/backends/impl_executor.py,sha256=Bv_ewIjb_HxG4wpD4Om7WXNazsUMTIEC5cr70PT3kQM,15160
19
19
  taskflow/conductors/backends/impl_nonblocking.py,sha256=PO7Tg2X1N1dJLxj3-AjL1TPxQsSxgiLth0JFhuc5t9c,3014
20
20
  taskflow/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  taskflow/engines/__init__.py,sha256=W8ik4-Q5TDXYd47IwKEQeSeDbnToJsVIgzs__fS_BSc,1397
@@ -103,10 +103,10 @@ taskflow/examples/resume_many_flows/my_flows.py,sha256=-cIktLf44U_Nnztezqzt1Lsdm
103
103
  taskflow/examples/resume_many_flows/resume_all.py,sha256=MahlJx7a3LBh4V7aRu5n5G1qDivqMgcjxOm6KNKycVk,1729
104
104
  taskflow/examples/resume_many_flows/run_flow.py,sha256=MOD78Zg7IaSAVRoLPap36njTZWbHzdxz28fMaHUA_EU,1433
105
105
  taskflow/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
- taskflow/jobs/base.py,sha256=nxn3jdq7x8hmGuUKB4sS3KQfafXgeaZfBxdsO1vGbJo,22115
106
+ taskflow/jobs/base.py,sha256=nowX7pKESnTz-_iPmg1vUQJ0bgO3HLOOtytOKOy12kA,22463
107
107
  taskflow/jobs/backends/__init__.py,sha256=ILlqq_U0FPM77nPQgx_OexjHxUvC5Tl4RXkX-IznSfw,2902
108
- taskflow/jobs/backends/impl_redis.py,sha256=ANcQODjj_f_biMWas1p0sgwUXfa9X32mrL1OSeHR4J4,43520
109
- taskflow/jobs/backends/impl_zookeeper.py,sha256=yMwhmyXRknhOpJiV2gHQQnHv885JAOWss-LGOM6SoQQ,37643
108
+ taskflow/jobs/backends/impl_redis.py,sha256=ZgxVSlAOncTE089a6c1qjafSIzv8_ekLQKvq1G_n7IE,43925
109
+ taskflow/jobs/backends/impl_zookeeper.py,sha256=1Noi75aTH0NCx-qlsRExsx-QKBtY5j2PJb6RIi_Cm5o,37644
110
110
  taskflow/listeners/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
111
  taskflow/listeners/base.py,sha256=vhbh4CcTW9iulQCG-A5G0iJDp7-j1m1XALYRewOanik,7391
112
112
  taskflow/listeners/capturing.py,sha256=14wrkVMrlmPm5jTnTTFM0RFv4PuKMIaIEPmYA4Ki4TA,4329
@@ -187,12 +187,12 @@ taskflow/tests/unit/action_engine/test_scoping.py,sha256=wIB9C3LMgfsqO6cdz_ZdhQc
187
187
  taskflow/tests/unit/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
188
  taskflow/tests/unit/jobs/base.py,sha256=wYv5ziDeVdYn2nhuMSfYTWU39Xxpv8lRKvJbGsB79lM,8447
189
189
  taskflow/tests/unit/jobs/test_entrypoint.py,sha256=t2m5zeYhjb2pmPxBgGO_0AMWR0dabWxglDBODzLE0fY,2220
190
- taskflow/tests/unit/jobs/test_redis_job.py,sha256=GSYGoBS7c9Sd5cJlBmx3B6vUKQR4yXkUlOHdzhNNGqs,5174
191
- taskflow/tests/unit/jobs/test_zk_job.py,sha256=K9FU38I-w_pybn81pK4ULffJdssxPLzc4W-brRRgIX8,13797
190
+ taskflow/tests/unit/jobs/test_redis_job.py,sha256=Ko8s96Sr8ilRUe6p_yybZUKs5FVTiRl0nMERMJswy2M,7540
191
+ taskflow/tests/unit/jobs/test_zk_job.py,sha256=e5CdkqmiQY_jzNtcHsxKcsS9uY7k-D8CMGkqt1J_bqE,13789
192
192
  taskflow/tests/unit/patterns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
- taskflow/tests/unit/patterns/test_graph_flow.py,sha256=ywPavkeuES91IphE2mqGpHbUk9w_DZJMNra_RKuVWAU,12464
194
- taskflow/tests/unit/patterns/test_linear_flow.py,sha256=VMSU1lPq4pgkmKHeM70ZJglG1T-MylrNX6NuPGKBeX4,5145
195
- taskflow/tests/unit/patterns/test_unordered_flow.py,sha256=OfiSJ1GegX5hj_i8ZO_wZM5dRA5fjPjR-a9nIjDMbS4,4985
193
+ taskflow/tests/unit/patterns/test_graph_flow.py,sha256=g5x6RdEgD6Sws3C5zmgz3kFpbJLEoi6i42RSEk5Vlso,12452
194
+ taskflow/tests/unit/patterns/test_linear_flow.py,sha256=jSgrxvCk-Ovly1NZSVY04pCRDjzWtkESQf--PuZbH6E,5133
195
+ taskflow/tests/unit/patterns/test_unordered_flow.py,sha256=kN4o_0pP4losZVba0uDtJvHZwJb8pMUyVRP8cCz__1g,4981
196
196
  taskflow/tests/unit/persistence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
197
197
  taskflow/tests/unit/persistence/base.py,sha256=Pot7g2ceqHuw-EmuYTm2SS0iQi1yruHgp-zM-pTQ6l8,16547
198
198
  taskflow/tests/unit/persistence/test_dir_persistence.py,sha256=hHfTy_KckkW95PA-gfk17kO8kQtNh1_62UNWeXpec2M,3929
@@ -232,11 +232,11 @@ taskflow/utils/persistence_utils.py,sha256=GWceOcxdfsf-MtrdR74xmC2khClF8im6DpZmR
232
232
  taskflow/utils/redis_utils.py,sha256=zJBvXmlNZUQ_gwGZAaNLySVtCtou3YayHAkGSCNKDUw,4345
233
233
  taskflow/utils/schema_utils.py,sha256=Zf6eL0NK0_TVFD_Sc1yEZYswFz9K0tet1Dmj48F8uMA,1434
234
234
  taskflow/utils/threading_utils.py,sha256=eiaNUK127DOBr_zfj3-j4Oi5a2dsD7VunVeTYN6NjPo,5849
235
- taskflow-5.4.0.dist-info/AUTHORS,sha256=8LPPL_6_SL4FA3G4Fj_pa8s7JbrrSS3vOkZgjQmB_3k,4485
236
- taskflow-5.4.0.dist-info/LICENSE,sha256=0t4vVm0tDgtQn7DqH6Nmn0kGSrHeIcV0U8qzdQojTo8,10143
237
- taskflow-5.4.0.dist-info/METADATA,sha256=9gmKe2v-5fXSHtdidp4MRp02KT_r_G8Co_99thivb5M,5099
238
- taskflow-5.4.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
239
- taskflow-5.4.0.dist-info/entry_points.txt,sha256=MGjjnng_YpSJs9BMAJBC2hJnljMV0pNllXl_5VoHJV0,1183
240
- taskflow-5.4.0.dist-info/pbr.json,sha256=L8tTrR99JPU614KOf2SnnXLM42vcOpjv6SkHE658MRc,47
241
- taskflow-5.4.0.dist-info/top_level.txt,sha256=PsdN41vwysesDlqHCSVVXH4mkTMdMiZFW_yHEAXiZE4,9
242
- taskflow-5.4.0.dist-info/RECORD,,
235
+ taskflow-5.6.0.dist-info/AUTHORS,sha256=tle5nZW61YeKYzeIWT7GN7FJ6_Y0UkBX_oYE2tDMgKc,4530
236
+ taskflow-5.6.0.dist-info/LICENSE,sha256=0t4vVm0tDgtQn7DqH6Nmn0kGSrHeIcV0U8qzdQojTo8,10143
237
+ taskflow-5.6.0.dist-info/METADATA,sha256=4sOTaS700K8VJhSUNMhUUPNhbK99iEZGRPmGbz2cFkM,5150
238
+ taskflow-5.6.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
239
+ taskflow-5.6.0.dist-info/entry_points.txt,sha256=MGjjnng_YpSJs9BMAJBC2hJnljMV0pNllXl_5VoHJV0,1183
240
+ taskflow-5.6.0.dist-info/pbr.json,sha256=sOEouTVPek9jsny8UcBxoKL_PTvTR-_fZPHqbhIepFk,47
241
+ taskflow-5.6.0.dist-info/top_level.txt,sha256=PsdN41vwysesDlqHCSVVXH4mkTMdMiZFW_yHEAXiZE4,9
242
+ taskflow-5.6.0.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"git_version": "39440b74", "is_release": true}
@@ -1 +0,0 @@
1
- {"git_version": "3b40c045", "is_release": true}