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.
- taskflow/conductors/backends/impl_executor.py +11 -2
- taskflow/jobs/backends/impl_redis.py +19 -8
- taskflow/jobs/backends/impl_zookeeper.py +1 -1
- taskflow/jobs/base.py +10 -0
- taskflow/storage.py +4 -2
- taskflow/tests/unit/jobs/test_redis_job.py +61 -1
- taskflow/tests/unit/jobs/test_zk_job.py +2 -2
- taskflow/tests/unit/patterns/test_graph_flow.py +3 -3
- taskflow/tests/unit/patterns/test_linear_flow.py +3 -3
- taskflow/tests/unit/patterns/test_unordered_flow.py +1 -1
- {taskflow-5.4.0.dist-info → taskflow-5.6.0.dist-info}/AUTHORS +1 -0
- {taskflow-5.4.0.dist-info → taskflow-5.6.0.dist-info}/METADATA +3 -2
- {taskflow-5.4.0.dist-info → taskflow-5.6.0.dist-info}/RECORD +18 -18
- taskflow-5.6.0.dist-info/pbr.json +1 -0
- taskflow-5.4.0.dist-info/pbr.json +0 -1
- {taskflow-5.4.0.dist-info → taskflow-5.6.0.dist-info}/LICENSE +0 -0
- {taskflow-5.4.0.dist-info → taskflow-5.6.0.dist-info}/WHEEL +0 -0
- {taskflow-5.4.0.dist-info → taskflow-5.6.0.dist-info}/entry_points.txt +0 -0
- {taskflow-5.4.0.dist-info → taskflow-5.6.0.dist-info}/top_level.txt +0 -0
|
@@ -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
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
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
|
-
**
|
|
589
|
+
**client_conf)
|
|
579
590
|
return s.master_for(conf['sentinel'])
|
|
580
591
|
else:
|
|
581
592
|
return ru.RedisClient(**client_conf)
|
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': {
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
255
|
-
self.
|
|
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.
|
|
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.
|
|
144
|
-
self.
|
|
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.
|
|
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.
|
|
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 (>=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
109
|
-
taskflow/jobs/backends/impl_zookeeper.py,sha256=
|
|
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=
|
|
191
|
-
taskflow/tests/unit/jobs/test_zk_job.py,sha256=
|
|
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=
|
|
194
|
-
taskflow/tests/unit/patterns/test_linear_flow.py,sha256=
|
|
195
|
-
taskflow/tests/unit/patterns/test_unordered_flow.py,sha256=
|
|
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.
|
|
236
|
-
taskflow-5.
|
|
237
|
-
taskflow-5.
|
|
238
|
-
taskflow-5.
|
|
239
|
-
taskflow-5.
|
|
240
|
-
taskflow-5.
|
|
241
|
-
taskflow-5.
|
|
242
|
-
taskflow-5.
|
|
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}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|