prefect-client 3.0.0rc10__py3-none-any.whl → 3.0.0rc12__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.
- prefect/_internal/concurrency/api.py +1 -1
- prefect/_internal/concurrency/services.py +9 -0
- prefect/_internal/retries.py +61 -0
- prefect/artifacts.py +12 -0
- prefect/client/cloud.py +1 -1
- prefect/client/schemas/actions.py +4 -0
- prefect/client/schemas/objects.py +1 -1
- prefect/concurrency/asyncio.py +3 -3
- prefect/concurrency/events.py +1 -1
- prefect/concurrency/services.py +3 -2
- prefect/concurrency/sync.py +19 -5
- prefect/context.py +8 -2
- prefect/deployments/__init__.py +28 -15
- prefect/deployments/steps/pull.py +7 -0
- prefect/events/schemas/events.py +10 -0
- prefect/flow_engine.py +10 -9
- prefect/flows.py +194 -68
- prefect/futures.py +53 -7
- prefect/logging/loggers.py +1 -1
- prefect/results.py +1 -46
- prefect/runner/runner.py +96 -23
- prefect/runner/server.py +20 -22
- prefect/runner/submit.py +0 -8
- prefect/runtime/flow_run.py +38 -3
- prefect/settings.py +9 -30
- prefect/task_engine.py +158 -48
- prefect/task_worker.py +1 -1
- prefect/tasks.py +164 -17
- prefect/transactions.py +2 -15
- prefect/utilities/asyncutils.py +13 -9
- prefect/utilities/engine.py +34 -1
- prefect/workers/base.py +98 -208
- prefect/workers/process.py +262 -4
- prefect/workers/server.py +27 -9
- {prefect_client-3.0.0rc10.dist-info → prefect_client-3.0.0rc12.dist-info}/METADATA +4 -4
- {prefect_client-3.0.0rc10.dist-info → prefect_client-3.0.0rc12.dist-info}/RECORD +39 -38
- {prefect_client-3.0.0rc10.dist-info → prefect_client-3.0.0rc12.dist-info}/LICENSE +0 -0
- {prefect_client-3.0.0rc10.dist-info → prefect_client-3.0.0rc12.dist-info}/WHEEL +0 -0
- {prefect_client-3.0.0rc10.dist-info → prefect_client-3.0.0rc12.dist-info}/top_level.txt +0 -0
prefect/workers/process.py
CHANGED
@@ -21,8 +21,10 @@ import socket
|
|
21
21
|
import subprocess
|
22
22
|
import sys
|
23
23
|
import tempfile
|
24
|
+
import threading
|
25
|
+
from functools import partial
|
24
26
|
from pathlib import Path
|
25
|
-
from typing import TYPE_CHECKING, Dict, Optional, Tuple
|
27
|
+
from typing import TYPE_CHECKING, Callable, Dict, Optional, Tuple
|
26
28
|
|
27
29
|
import anyio
|
28
30
|
import anyio.abc
|
@@ -30,8 +32,27 @@ from pydantic import Field, field_validator
|
|
30
32
|
|
31
33
|
from prefect._internal.schemas.validators import validate_command
|
32
34
|
from prefect.client.schemas import FlowRun
|
33
|
-
from prefect.
|
35
|
+
from prefect.client.schemas.filters import (
|
36
|
+
FlowRunFilter,
|
37
|
+
FlowRunFilterId,
|
38
|
+
FlowRunFilterState,
|
39
|
+
FlowRunFilterStateName,
|
40
|
+
FlowRunFilterStateType,
|
41
|
+
WorkPoolFilter,
|
42
|
+
WorkPoolFilterName,
|
43
|
+
WorkQueueFilter,
|
44
|
+
WorkQueueFilterName,
|
45
|
+
)
|
46
|
+
from prefect.client.schemas.objects import StateType
|
47
|
+
from prefect.events.utilities import emit_event
|
48
|
+
from prefect.exceptions import (
|
49
|
+
InfrastructureNotAvailable,
|
50
|
+
InfrastructureNotFound,
|
51
|
+
ObjectNotFound,
|
52
|
+
)
|
53
|
+
from prefect.settings import PREFECT_WORKER_QUERY_SECONDS
|
34
54
|
from prefect.utilities.processutils import get_sys_executable, run_process
|
55
|
+
from prefect.utilities.services import critical_service_loop
|
35
56
|
from prefect.workers.base import (
|
36
57
|
BaseJobConfiguration,
|
37
58
|
BaseVariables,
|
@@ -128,6 +149,96 @@ class ProcessWorker(BaseWorker):
|
|
128
149
|
)
|
129
150
|
_logo_url = "https://cdn.sanity.io/images/3ugk85nk/production/356e6766a91baf20e1d08bbe16e8b5aaef4d8643-48x48.png"
|
130
151
|
|
152
|
+
async def start(
|
153
|
+
self,
|
154
|
+
run_once: bool = False,
|
155
|
+
with_healthcheck: bool = False,
|
156
|
+
printer: Callable[..., None] = print,
|
157
|
+
):
|
158
|
+
"""
|
159
|
+
Starts the worker and runs the main worker loops.
|
160
|
+
|
161
|
+
By default, the worker will run loops to poll for scheduled/cancelled flow
|
162
|
+
runs and sync with the Prefect API server.
|
163
|
+
|
164
|
+
If `run_once` is set, the worker will only run each loop once and then return.
|
165
|
+
|
166
|
+
If `with_healthcheck` is set, the worker will start a healthcheck server which
|
167
|
+
can be used to determine if the worker is still polling for flow runs and restart
|
168
|
+
the worker if necessary.
|
169
|
+
|
170
|
+
Args:
|
171
|
+
run_once: If set, the worker will only run each loop once then return.
|
172
|
+
with_healthcheck: If set, the worker will start a healthcheck server.
|
173
|
+
printer: A `print`-like function where logs will be reported.
|
174
|
+
"""
|
175
|
+
healthcheck_server = None
|
176
|
+
healthcheck_thread = None
|
177
|
+
try:
|
178
|
+
async with self as worker:
|
179
|
+
# wait for an initial heartbeat to configure the worker
|
180
|
+
await worker.sync_with_backend()
|
181
|
+
# schedule the scheduled flow run polling loop
|
182
|
+
async with anyio.create_task_group() as loops_task_group:
|
183
|
+
loops_task_group.start_soon(
|
184
|
+
partial(
|
185
|
+
critical_service_loop,
|
186
|
+
workload=self.get_and_submit_flow_runs,
|
187
|
+
interval=PREFECT_WORKER_QUERY_SECONDS.value(),
|
188
|
+
run_once=run_once,
|
189
|
+
jitter_range=0.3,
|
190
|
+
backoff=4, # Up to ~1 minute interval during backoff
|
191
|
+
)
|
192
|
+
)
|
193
|
+
# schedule the sync loop
|
194
|
+
loops_task_group.start_soon(
|
195
|
+
partial(
|
196
|
+
critical_service_loop,
|
197
|
+
workload=self.sync_with_backend,
|
198
|
+
interval=self.heartbeat_interval_seconds,
|
199
|
+
run_once=run_once,
|
200
|
+
jitter_range=0.3,
|
201
|
+
backoff=4,
|
202
|
+
)
|
203
|
+
)
|
204
|
+
loops_task_group.start_soon(
|
205
|
+
partial(
|
206
|
+
critical_service_loop,
|
207
|
+
workload=self.check_for_cancelled_flow_runs,
|
208
|
+
interval=PREFECT_WORKER_QUERY_SECONDS.value() * 2,
|
209
|
+
run_once=run_once,
|
210
|
+
jitter_range=0.3,
|
211
|
+
backoff=4,
|
212
|
+
)
|
213
|
+
)
|
214
|
+
|
215
|
+
self._started_event = await self._emit_worker_started_event()
|
216
|
+
|
217
|
+
if with_healthcheck:
|
218
|
+
from prefect.workers.server import build_healthcheck_server
|
219
|
+
|
220
|
+
# we'll start the ASGI server in a separate thread so that
|
221
|
+
# uvicorn does not block the main thread
|
222
|
+
healthcheck_server = build_healthcheck_server(
|
223
|
+
worker=worker,
|
224
|
+
query_interval_seconds=PREFECT_WORKER_QUERY_SECONDS.value(),
|
225
|
+
)
|
226
|
+
healthcheck_thread = threading.Thread(
|
227
|
+
name="healthcheck-server-thread",
|
228
|
+
target=healthcheck_server.run,
|
229
|
+
daemon=True,
|
230
|
+
)
|
231
|
+
healthcheck_thread.start()
|
232
|
+
printer(f"Worker {worker.name!r} started!")
|
233
|
+
finally:
|
234
|
+
if healthcheck_server and healthcheck_thread:
|
235
|
+
self._logger.debug("Stopping healthcheck server...")
|
236
|
+
healthcheck_server.should_exit = True
|
237
|
+
healthcheck_thread.join()
|
238
|
+
self._logger.debug("Healthcheck server stopped.")
|
239
|
+
|
240
|
+
printer(f"Worker {worker.name!r} stopped!")
|
241
|
+
|
131
242
|
async def run(
|
132
243
|
self,
|
133
244
|
flow_run: FlowRun,
|
@@ -209,10 +320,9 @@ class ProcessWorker(BaseWorker):
|
|
209
320
|
status_code=process.returncode, identifier=str(process.pid)
|
210
321
|
)
|
211
322
|
|
212
|
-
async def
|
323
|
+
async def kill_process(
|
213
324
|
self,
|
214
325
|
infrastructure_pid: str,
|
215
|
-
configuration: ProcessJobConfiguration,
|
216
326
|
grace_seconds: int = 30,
|
217
327
|
):
|
218
328
|
hostname, pid = _parse_infrastructure_pid(infrastructure_pid)
|
@@ -263,3 +373,151 @@ class ProcessWorker(BaseWorker):
|
|
263
373
|
# We shouldn't ever end up here, but it's possible that the
|
264
374
|
# process ended right after the check above.
|
265
375
|
return
|
376
|
+
|
377
|
+
async def check_for_cancelled_flow_runs(self):
|
378
|
+
if not self.is_setup:
|
379
|
+
raise RuntimeError(
|
380
|
+
"Worker is not set up. Please make sure you are running this worker "
|
381
|
+
"as an async context manager."
|
382
|
+
)
|
383
|
+
|
384
|
+
self._logger.debug("Checking for cancelled flow runs...")
|
385
|
+
|
386
|
+
work_queue_filter = (
|
387
|
+
WorkQueueFilter(name=WorkQueueFilterName(any_=list(self._work_queues)))
|
388
|
+
if self._work_queues
|
389
|
+
else None
|
390
|
+
)
|
391
|
+
|
392
|
+
named_cancelling_flow_runs = await self._client.read_flow_runs(
|
393
|
+
flow_run_filter=FlowRunFilter(
|
394
|
+
state=FlowRunFilterState(
|
395
|
+
type=FlowRunFilterStateType(any_=[StateType.CANCELLED]),
|
396
|
+
name=FlowRunFilterStateName(any_=["Cancelling"]),
|
397
|
+
),
|
398
|
+
# Avoid duplicate cancellation calls
|
399
|
+
id=FlowRunFilterId(not_any_=list(self._cancelling_flow_run_ids)),
|
400
|
+
),
|
401
|
+
work_pool_filter=WorkPoolFilter(
|
402
|
+
name=WorkPoolFilterName(any_=[self._work_pool_name])
|
403
|
+
),
|
404
|
+
work_queue_filter=work_queue_filter,
|
405
|
+
)
|
406
|
+
|
407
|
+
typed_cancelling_flow_runs = await self._client.read_flow_runs(
|
408
|
+
flow_run_filter=FlowRunFilter(
|
409
|
+
state=FlowRunFilterState(
|
410
|
+
type=FlowRunFilterStateType(any_=[StateType.CANCELLING]),
|
411
|
+
),
|
412
|
+
# Avoid duplicate cancellation calls
|
413
|
+
id=FlowRunFilterId(not_any_=list(self._cancelling_flow_run_ids)),
|
414
|
+
),
|
415
|
+
work_pool_filter=WorkPoolFilter(
|
416
|
+
name=WorkPoolFilterName(any_=[self._work_pool_name])
|
417
|
+
),
|
418
|
+
work_queue_filter=work_queue_filter,
|
419
|
+
)
|
420
|
+
|
421
|
+
cancelling_flow_runs = named_cancelling_flow_runs + typed_cancelling_flow_runs
|
422
|
+
|
423
|
+
if cancelling_flow_runs:
|
424
|
+
self._logger.info(
|
425
|
+
f"Found {len(cancelling_flow_runs)} flow runs awaiting cancellation."
|
426
|
+
)
|
427
|
+
|
428
|
+
for flow_run in cancelling_flow_runs:
|
429
|
+
self._cancelling_flow_run_ids.add(flow_run.id)
|
430
|
+
self._runs_task_group.start_soon(self.cancel_run, flow_run)
|
431
|
+
|
432
|
+
return cancelling_flow_runs
|
433
|
+
|
434
|
+
async def cancel_run(self, flow_run: "FlowRun"):
|
435
|
+
run_logger = self.get_flow_run_logger(flow_run)
|
436
|
+
|
437
|
+
try:
|
438
|
+
configuration = await self._get_configuration(flow_run)
|
439
|
+
except ObjectNotFound:
|
440
|
+
self._logger.warning(
|
441
|
+
f"Flow run {flow_run.id!r} cannot be cancelled by this worker:"
|
442
|
+
f" associated deployment {flow_run.deployment_id!r} does not exist."
|
443
|
+
)
|
444
|
+
await self._mark_flow_run_as_cancelled(
|
445
|
+
flow_run,
|
446
|
+
state_updates={
|
447
|
+
"message": (
|
448
|
+
"This flow run is missing infrastructure configuration information"
|
449
|
+
" and cancellation cannot be guaranteed."
|
450
|
+
)
|
451
|
+
},
|
452
|
+
)
|
453
|
+
return
|
454
|
+
else:
|
455
|
+
if configuration.is_using_a_runner:
|
456
|
+
self._logger.info(
|
457
|
+
f"Skipping cancellation because flow run {str(flow_run.id)!r} is"
|
458
|
+
" using enhanced cancellation. A dedicated runner will handle"
|
459
|
+
" cancellation."
|
460
|
+
)
|
461
|
+
return
|
462
|
+
|
463
|
+
if not flow_run.infrastructure_pid:
|
464
|
+
run_logger.error(
|
465
|
+
f"Flow run '{flow_run.id}' does not have an infrastructure pid"
|
466
|
+
" attached. Cancellation cannot be guaranteed."
|
467
|
+
)
|
468
|
+
await self._mark_flow_run_as_cancelled(
|
469
|
+
flow_run,
|
470
|
+
state_updates={
|
471
|
+
"message": (
|
472
|
+
"This flow run is missing infrastructure tracking information"
|
473
|
+
" and cancellation cannot be guaranteed."
|
474
|
+
)
|
475
|
+
},
|
476
|
+
)
|
477
|
+
return
|
478
|
+
|
479
|
+
try:
|
480
|
+
await self.kill_process(
|
481
|
+
infrastructure_pid=flow_run.infrastructure_pid,
|
482
|
+
)
|
483
|
+
except NotImplementedError:
|
484
|
+
self._logger.error(
|
485
|
+
f"Worker type {self.type!r} does not support killing created "
|
486
|
+
"infrastructure. Cancellation cannot be guaranteed."
|
487
|
+
)
|
488
|
+
except InfrastructureNotFound as exc:
|
489
|
+
self._logger.warning(f"{exc} Marking flow run as cancelled.")
|
490
|
+
await self._mark_flow_run_as_cancelled(flow_run)
|
491
|
+
except InfrastructureNotAvailable as exc:
|
492
|
+
self._logger.warning(f"{exc} Flow run cannot be cancelled by this worker.")
|
493
|
+
except Exception:
|
494
|
+
run_logger.exception(
|
495
|
+
"Encountered exception while killing infrastructure for flow run "
|
496
|
+
f"'{flow_run.id}'. Flow run may not be cancelled."
|
497
|
+
)
|
498
|
+
# We will try again on generic exceptions
|
499
|
+
self._cancelling_flow_run_ids.remove(flow_run.id)
|
500
|
+
return
|
501
|
+
else:
|
502
|
+
self._emit_flow_run_cancelled_event(
|
503
|
+
flow_run=flow_run, configuration=configuration
|
504
|
+
)
|
505
|
+
await self._mark_flow_run_as_cancelled(flow_run)
|
506
|
+
run_logger.info(f"Cancelled flow run '{flow_run.id}'!")
|
507
|
+
|
508
|
+
def _emit_flow_run_cancelled_event(
|
509
|
+
self, flow_run: "FlowRun", configuration: BaseJobConfiguration
|
510
|
+
):
|
511
|
+
related = self._event_related_resources(configuration=configuration)
|
512
|
+
|
513
|
+
for resource in related:
|
514
|
+
if resource.role == "flow-run":
|
515
|
+
resource["prefect.infrastructure.identifier"] = str(
|
516
|
+
flow_run.infrastructure_pid
|
517
|
+
)
|
518
|
+
|
519
|
+
emit_event(
|
520
|
+
event="prefect.worker.cancelled-flow-run",
|
521
|
+
resource=self._event_resource(),
|
522
|
+
related=related,
|
523
|
+
)
|
prefect/workers/server.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
from typing import Union
|
2
2
|
|
3
3
|
import uvicorn
|
4
|
+
import uvicorn.server
|
4
5
|
from fastapi import APIRouter, FastAPI, status
|
5
6
|
from fastapi.responses import JSONResponse
|
6
7
|
|
@@ -12,19 +13,19 @@ from prefect.workers.base import BaseWorker
|
|
12
13
|
from prefect.workers.process import ProcessWorker
|
13
14
|
|
14
15
|
|
15
|
-
def
|
16
|
+
def build_healthcheck_server(
|
16
17
|
worker: Union[BaseWorker, ProcessWorker],
|
17
|
-
query_interval_seconds:
|
18
|
+
query_interval_seconds: float,
|
18
19
|
log_level: str = "error",
|
19
|
-
)
|
20
|
+
):
|
20
21
|
"""
|
21
|
-
|
22
|
+
Build a healthcheck FastAPI server for a worker.
|
22
23
|
|
23
24
|
Args:
|
24
25
|
worker (BaseWorker | ProcessWorker): the worker whose health we will check
|
25
|
-
log_level (str): the log
|
26
|
+
log_level (str): the log
|
26
27
|
"""
|
27
|
-
|
28
|
+
app = FastAPI()
|
28
29
|
router = APIRouter()
|
29
30
|
|
30
31
|
def perform_health_check():
|
@@ -41,11 +42,28 @@ def start_healthcheck_server(
|
|
41
42
|
|
42
43
|
router.add_api_route("/health", perform_health_check, methods=["GET"])
|
43
44
|
|
44
|
-
|
45
|
+
app.include_router(router)
|
45
46
|
|
46
|
-
uvicorn.
|
47
|
-
|
47
|
+
config = uvicorn.Config(
|
48
|
+
app=app,
|
48
49
|
host=PREFECT_WORKER_WEBSERVER_HOST.value(),
|
49
50
|
port=PREFECT_WORKER_WEBSERVER_PORT.value(),
|
50
51
|
log_level=log_level,
|
51
52
|
)
|
53
|
+
return uvicorn.Server(config=config)
|
54
|
+
|
55
|
+
|
56
|
+
def start_healthcheck_server(
|
57
|
+
worker: Union[BaseWorker, ProcessWorker],
|
58
|
+
query_interval_seconds: float,
|
59
|
+
log_level: str = "error",
|
60
|
+
) -> None:
|
61
|
+
"""
|
62
|
+
Run a healthcheck FastAPI server for a worker.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
worker (BaseWorker | ProcessWorker): the worker whose health we will check
|
66
|
+
log_level (str): the log level to use for the server
|
67
|
+
"""
|
68
|
+
server = build_healthcheck_server(worker, query_interval_seconds, log_level)
|
69
|
+
server.run()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: prefect-client
|
3
|
-
Version: 3.0.
|
3
|
+
Version: 3.0.0rc12
|
4
4
|
Summary: Workflow orchestration and management.
|
5
5
|
Home-page: https://www.prefect.io
|
6
6
|
Author: Prefect Technologies, Inc.
|
@@ -24,17 +24,17 @@ Classifier: Topic :: Software Development :: Libraries
|
|
24
24
|
Requires-Python: >=3.9
|
25
25
|
Description-Content-Type: text/markdown
|
26
26
|
License-File: LICENSE
|
27
|
-
Requires-Dist: anyio <5.0.0,>=4.
|
27
|
+
Requires-Dist: anyio <5.0.0,>=4.4.0
|
28
28
|
Requires-Dist: asgi-lifespan <3.0,>=1.0
|
29
29
|
Requires-Dist: cachetools <6.0,>=5.3
|
30
30
|
Requires-Dist: cloudpickle <4.0,>=2.0
|
31
31
|
Requires-Dist: coolname <3.0.0,>=1.0.4
|
32
|
-
Requires-Dist: croniter <
|
32
|
+
Requires-Dist: croniter <4.0.0,>=1.0.12
|
33
33
|
Requires-Dist: exceptiongroup >=1.0.0
|
34
34
|
Requires-Dist: fastapi <1.0.0,>=0.111.0
|
35
35
|
Requires-Dist: fsspec >=2022.5.0
|
36
36
|
Requires-Dist: graphviz >=0.20.1
|
37
|
-
Requires-Dist: griffe
|
37
|
+
Requires-Dist: griffe <0.48.0,>=0.20.0
|
38
38
|
Requires-Dist: httpcore <2.0.0,>=1.0.5
|
39
39
|
Requires-Dist: httpx[http2] !=0.23.2,>=0.23
|
40
40
|
Requires-Dist: importlib-resources <6.2.0,>=6.1.3
|
@@ -2,49 +2,50 @@ prefect/.prefectignore,sha256=awSprvKT0vI8a64mEOLrMxhxqcO-b0ERQeYpA2rNKVQ,390
|
|
2
2
|
prefect/__init__.py,sha256=rFlBikby0TcAmljqECcleQE_se15eh1gLp5iac0ZhsU,3301
|
3
3
|
prefect/_version.py,sha256=I9JsXwt7BjAAbMEZgtmE3a6dJ2jqV-wqWto9D6msb3k,24597
|
4
4
|
prefect/agent.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
|
5
|
-
prefect/artifacts.py,sha256=
|
5
|
+
prefect/artifacts.py,sha256=wet3coxBtqK0914uTf-slYpXRVP0mjbZn804hXB-RS4,13011
|
6
6
|
prefect/automations.py,sha256=NlQ62GPJzy-gnWQqX7c6CQJKw7p60WLGDAFcy82vtg4,5613
|
7
7
|
prefect/cache_policies.py,sha256=uEKNGO-PJ3N35B2tjhRDtQULN6ok72D9raIoJaUyXk0,6365
|
8
|
-
prefect/context.py,sha256=
|
8
|
+
prefect/context.py,sha256=40FLSXI3Qd9dMwP8nQ7fGZFKpQIuEkjTpekT4V1MvF8,19942
|
9
9
|
prefect/engine.py,sha256=BpmDbe6miZcTl1vRkxfCPYcWSXADLigGPCagFwucMz0,1976
|
10
10
|
prefect/exceptions.py,sha256=3s69Z_IC3HKF6BKxcHrMPXkKdYwfbEfaTjy4-5LOtQ0,11132
|
11
11
|
prefect/filesystems.py,sha256=rbFvlqHXeeo71nK1Y5I0-ucmGOYUcdkbb6N2vpsRcWE,17229
|
12
|
-
prefect/flow_engine.py,sha256=
|
12
|
+
prefect/flow_engine.py,sha256=oNsRxLIZjjf-PyYl5m2cxWk1iRONI-U_KBZESfS4EAw,29328
|
13
13
|
prefect/flow_runs.py,sha256=EaXRIQTOnwnA0fO7_EjwafFRmS57K_CRy0Xsz3JDIhc,16070
|
14
|
-
prefect/flows.py,sha256=
|
15
|
-
prefect/futures.py,sha256=
|
14
|
+
prefect/flows.py,sha256=jskTdjUxH7Le1n3ME3TbkytRXrWs_B1LVRUy2-xOixk,84721
|
15
|
+
prefect/futures.py,sha256=w5M_iZwt5aI0AUfia0JC1FkitRmQ6Oxtc_L7g_INTOM,13695
|
16
16
|
prefect/main.py,sha256=bab5nBn37a6gmxdPbTlRS2a9Cf0KY0GaCotDOSbcQ7M,1930
|
17
17
|
prefect/manifests.py,sha256=477XcmfdC_yE81wT6zIAKnEUEJ0lH9ZLfOVSgX2FohE,676
|
18
18
|
prefect/plugins.py,sha256=7AICJzHIu8iAeF9vl9wAYm28pR_k7dkdnm3OyJRfCv4,2229
|
19
19
|
prefect/profiles.toml,sha256=Fs8hD_BdWHZgAijgk8pK_Zx-Pm-YFixqDIfEP6fM-qU,38
|
20
20
|
prefect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
|
-
prefect/results.py,sha256=
|
21
|
+
prefect/results.py,sha256=3mVkVWZn_VSQ9Pik79StNy113rB_SEiP83SdoUsFvTM,24635
|
22
22
|
prefect/serializers.py,sha256=Lo41EM0_qGzcfB_63390Izeo3DdK6cY6VZfxa9hpSGQ,8712
|
23
|
-
prefect/settings.py,sha256
|
23
|
+
prefect/settings.py,sha256=Xmgy4S_zQWKiT7VEXiRtSjhjihrqK5feNkH3QVdDTMQ,69090
|
24
24
|
prefect/states.py,sha256=lw22xucH46cN9stkxiV9ByIvq689mH5iL3gErri-Y18,22207
|
25
|
-
prefect/task_engine.py,sha256=
|
25
|
+
prefect/task_engine.py,sha256=GXWIDMNUl0--RecH9yc41mSSpCNnIFmapi8fMIFDsdQ,39911
|
26
26
|
prefect/task_runners.py,sha256=W1n0yMwbDIqnvffFVJADo9MGEbLaYkzWk52rqgnkMY4,15019
|
27
27
|
prefect/task_runs.py,sha256=eDWYH5H1K4SyduhKmn3GzO6vM3fZSwOZxAb8KhkMGsk,7798
|
28
|
-
prefect/task_worker.py,sha256=
|
29
|
-
prefect/tasks.py,sha256=
|
30
|
-
prefect/transactions.py,sha256=
|
28
|
+
prefect/task_worker.py,sha256=lV9rQb9YOaO28DZLW_avw6p0pTSVYtsA1gqODWxB7J0,17334
|
29
|
+
prefect/tasks.py,sha256=A-sQB8S5dxcLtl10crDThsfdKpMzm9Rknfwhu27rnvY,68085
|
30
|
+
prefect/transactions.py,sha256=XBbOjAUnDWw9QcxVwEamRaWxvRA_Ao-MkIN5dFL7h54,10008
|
31
31
|
prefect/variables.py,sha256=-t5LVY0N-K4f0fa6YwruVVQqwnU3fGWBMYXXE32XPkA,4821
|
32
32
|
prefect/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
33
|
prefect/_internal/_logging.py,sha256=HvNHY-8P469o5u4LYEDBTem69XZEt1QUeUaLToijpak,810
|
34
34
|
prefect/_internal/integrations.py,sha256=U4cZMDbnilzZSKaMxvzZcSL27a1tzRMjDoTfr2ul_eY,231
|
35
35
|
prefect/_internal/pytz.py,sha256=WWl9x16rKFWequGmcOGs_ljpCDPf2LDHMyZp_4D8e6c,13748
|
36
|
+
prefect/_internal/retries.py,sha256=8uuagUX32w5YANLHqjM_1hHmVe9b1HxcwuPMXb1G2Qk,2317
|
36
37
|
prefect/_internal/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
38
|
prefect/_internal/compatibility/deprecated.py,sha256=7vqE1_PAPS0cDalTfTumHWUIOqIzkbKvQl1iwHlfynQ,9205
|
38
39
|
prefect/_internal/compatibility/experimental.py,sha256=nrIeeAe1vZ0yMb1cPw5AroVR6_msx-bzTeBLzY4au6o,5634
|
39
40
|
prefect/_internal/compatibility/migration.py,sha256=O9HrcqxfQ-RrIklH0uGxeXMrQejPz1hmsgrw8zDLJuw,6801
|
40
41
|
prefect/_internal/concurrency/__init__.py,sha256=YlTwU9ryjPNwbJa45adLJY00t_DGCh1QrdtY9WdVFfw,2140
|
41
|
-
prefect/_internal/concurrency/api.py,sha256=
|
42
|
+
prefect/_internal/concurrency/api.py,sha256=mOajv_f9ms2u3O4sgegJDV2kLeCg9lBavlEZzPw5kr4,7126
|
42
43
|
prefect/_internal/concurrency/calls.py,sha256=UlNgzCoy3awKEPnMpexBSa1dk_2MNwCWoZ5YQODEmG4,15437
|
43
44
|
prefect/_internal/concurrency/cancellation.py,sha256=D1B_I2cBSGPNXcLaXNaLN_9_QAgFjRmA540RcTmS0rA,18050
|
44
45
|
prefect/_internal/concurrency/event_loop.py,sha256=1VBW862QZ6DV9dExWOT398A0fti4A7jW2kcY7Y5V-lI,2073
|
45
46
|
prefect/_internal/concurrency/inspection.py,sha256=xfyUNr5CoES8LFhybi2DmzHeW4RpTAbrGPiZOYMVLbQ,3464
|
46
47
|
prefect/_internal/concurrency/primitives.py,sha256=BQ0vObO7NUEq-IMbu5aTlfoZpWMbYwinzYP89GIyw68,2609
|
47
|
-
prefect/_internal/concurrency/services.py,sha256=
|
48
|
+
prefect/_internal/concurrency/services.py,sha256=6RYcGFrHh_xO5BXeRDgNOmWsjQnQrX9jyW7SN9zuOF0,12209
|
48
49
|
prefect/_internal/concurrency/threads.py,sha256=90Wi00pTebfihiFgP-P71DeGTnhlJKctzP69mtjphKU,8860
|
49
50
|
prefect/_internal/concurrency/waiters.py,sha256=X6xxsKcHB9ULnCkeUf0cLTI267kI_GC4k96XRuhPhnw,8790
|
50
51
|
prefect/_internal/pydantic/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
@@ -69,27 +70,27 @@ prefect/blocks/system.py,sha256=tkONKzDlaQgR6NtWXON0ZQm7nGuFKt0_Du3sj8ubs-M,3605
|
|
69
70
|
prefect/blocks/webhook.py,sha256=mnAfGF64WyjH55BKkTbC1AP9FETNcrm_PEjiqJNpigA,1867
|
70
71
|
prefect/client/__init__.py,sha256=fFtCXsGIsBCsAMFKlUPgRVUoIeqq_CsGtFE1knhbHlU,593
|
71
72
|
prefect/client/base.py,sha256=laxz64IEhbetMIcRh67_YDYd5ThCmUK9fgUgco8WyXQ,24647
|
72
|
-
prefect/client/cloud.py,sha256=
|
73
|
+
prefect/client/cloud.py,sha256=7iHff1YDABdzBW5BZFlyzmwgCMWUwbgVv2zTNlqW7lw,4132
|
73
74
|
prefect/client/collections.py,sha256=I9EgbTg4Fn57gn8vwP_WdDmgnATbx9gfkm2jjhCORjw,1037
|
74
75
|
prefect/client/constants.py,sha256=Z_GG8KF70vbbXxpJuqW5pLnwzujTVeHbcYYRikNmGH0,29
|
75
76
|
prefect/client/orchestration.py,sha256=W3tiqjND1lf0GtunLBayMRrUD5ykAcW0GfwxqT9fT-A,142479
|
76
77
|
prefect/client/subscriptions.py,sha256=J9uK9NGHO4VX4Y3NGgBJ4pIG_0cf-dJWPhF3f3PGYL4,3388
|
77
78
|
prefect/client/utilities.py,sha256=Qh1WdKLs8F_GuA04FeZ1GJsPYtiCN4DjKmLEaMfKmpQ,3264
|
78
79
|
prefect/client/schemas/__init__.py,sha256=KlyqFV-hMulMkNstBn_0ijoHoIwJZaBj6B1r07UmgvE,607
|
79
|
-
prefect/client/schemas/actions.py,sha256=
|
80
|
+
prefect/client/schemas/actions.py,sha256=sZFVfN-Xks7x-sfp0kX97lSzHDbMx99E-rzIngOUU6A,28184
|
80
81
|
prefect/client/schemas/filters.py,sha256=HyIYZQowhkHa_D6syj83zUp5uFEzA8UADLaS9mt1MTo,35305
|
81
|
-
prefect/client/schemas/objects.py,sha256=
|
82
|
+
prefect/client/schemas/objects.py,sha256=3-qhF8qTUSB-wax4s5_zBs6A1K2hdDr1WLxpTryQbRE,53547
|
82
83
|
prefect/client/schemas/responses.py,sha256=xW9QKmVgBftSEmtuSr5gp9HBFvIDzF6aSFq-mhv7dE8,14948
|
83
84
|
prefect/client/schemas/schedules.py,sha256=8rpqjOYtknu2-1n5_WD4cOplgu93P3mCyX86B22LfL4,13070
|
84
85
|
prefect/client/schemas/sorting.py,sha256=EIQ6FUjUWMwk6fn6ckVLQLXOP-GI5kce7ftjUkDFWV0,2490
|
85
86
|
prefect/client/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
86
87
|
prefect/client/types/flexible_schedule_list.py,sha256=F1VFAXGLM89dJRBLnVsxwAMGLmrRF2i81FirEMpbB5s,368
|
87
88
|
prefect/concurrency/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
88
|
-
prefect/concurrency/asyncio.py,sha256=
|
89
|
-
prefect/concurrency/events.py,sha256=
|
90
|
-
prefect/concurrency/services.py,sha256=
|
91
|
-
prefect/concurrency/sync.py,sha256=
|
92
|
-
prefect/deployments/__init__.py,sha256=
|
89
|
+
prefect/concurrency/asyncio.py,sha256=cCpjhq7z9hHpXUFLYp4fiGw_GcSfxOphhkOR4Xkf-4g,4738
|
90
|
+
prefect/concurrency/events.py,sha256=EjZwUbbtP-N-u8rk8nbyMIi-BnkshoLkHRYh913jUWU,1810
|
91
|
+
prefect/concurrency/services.py,sha256=akKoelFn6w70uYqGLIn2JcD5iCLy2CHPTnOz4XYrmOo,3039
|
92
|
+
prefect/concurrency/sync.py,sha256=tjAcMj9mtgGeCQNmHTk35jCvqoI9CEGQNyeHG8j1B3k,3496
|
93
|
+
prefect/deployments/__init__.py,sha256=_wb7NxDKhq11z9MjYsPckmT3o6MRhGLRgCV9TmvYtew,1002
|
93
94
|
prefect/deployments/base.py,sha256=j2VUHkghXCqbfYJD8Joeh12Ejh4KCzr2DgVPRpDpbLw,16600
|
94
95
|
prefect/deployments/deployments.py,sha256=EvC9qBdvJRc8CHJqRjFTqtzx75SE8bpZOl5C-2eULyA,109
|
95
96
|
prefect/deployments/flow_runs.py,sha256=eatcBD7pg-aaEqs9JxQQcKN_flf614O4gAvedAlRyNo,6803
|
@@ -97,7 +98,7 @@ prefect/deployments/runner.py,sha256=wVz2Ltis_tOpWLvLzPuOBJBIsdWqs8aXY2oCOuwhssc
|
|
97
98
|
prefect/deployments/schedules.py,sha256=KCYA6dOmLAoElHZuoWqdJn4Yno4TtOZtXfPOpTLb1cE,2046
|
98
99
|
prefect/deployments/steps/__init__.py,sha256=Dlz9VqMRyG1Gal8dj8vfGpPr0LyQhZdvcciozkK8WoY,206
|
99
100
|
prefect/deployments/steps/core.py,sha256=5vFf6BSpu992kkaYsvcPpsz-nZxFmayMIDmY9h0Hb8M,6846
|
100
|
-
prefect/deployments/steps/pull.py,sha256=
|
101
|
+
prefect/deployments/steps/pull.py,sha256=N98fU9S6Og204oKsqJf53eP1PdwwyRojtVg8GT2sVhE,7294
|
101
102
|
prefect/deployments/steps/utility.py,sha256=s5mMBmHVCS1ZRBRUCunwPueU_7Dii_GK6CqCoznwUCc,8134
|
102
103
|
prefect/docker/__init__.py,sha256=jumlacz2HY9l1ee0L9_kE0PFi9NO3l3pWINm9T5N9hs,524
|
103
104
|
prefect/docker/docker_image.py,sha256=Y84_ooCYA9NGl6FElJul9-FaW3teT-eia2SiNtZ1LG8,2999
|
@@ -113,7 +114,7 @@ prefect/events/cli/automations.py,sha256=WIZ3-EcDibjQB5BrMEx7OZ7UfOqP8VjCI1dNh64
|
|
113
114
|
prefect/events/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
114
115
|
prefect/events/schemas/automations.py,sha256=he9_v0Oq8AtCJe5gMti5GDQiaGa50sM4Jz9soDf-upU,14396
|
115
116
|
prefect/events/schemas/deployment_triggers.py,sha256=i_BtKscXU9kOHAeqmxrYQr8itEYfuPIxAnCW3fo1YeE,3114
|
116
|
-
prefect/events/schemas/events.py,sha256=
|
117
|
+
prefect/events/schemas/events.py,sha256=erAIoMtfFjPWeTPpja6Rg3WqUNZhlX7YM3b4CzzuomQ,9053
|
117
118
|
prefect/events/schemas/labelling.py,sha256=bU-XYaHXhI2MEBIHngth96R9D02m8HHb85KNcHZ_1Gc,3073
|
118
119
|
prefect/infrastructure/__init__.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
|
119
120
|
prefect/infrastructure/base.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
|
@@ -131,20 +132,20 @@ prefect/logging/filters.py,sha256=9keHLN4-cpnsWcii1qU0RITNi9-m7pOhkJ_t0MtCM4k,11
|
|
131
132
|
prefect/logging/formatters.py,sha256=3nBWgawvD48slT0zgkKeus1gIyf0OjmDKdLwMEe5mPU,3923
|
132
133
|
prefect/logging/handlers.py,sha256=eIf-0LFH8XUu8Ybnc3LXoocSsa8M8EdAIwbPTVFzZjI,10425
|
133
134
|
prefect/logging/highlighters.py,sha256=BpSXOy0n3lFVvlKWa7jC-HetAiClFi9jnQtEq5-rgok,1681
|
134
|
-
prefect/logging/loggers.py,sha256=
|
135
|
+
prefect/logging/loggers.py,sha256=xmJ4GIuSXyFV4yMMDK-VokMFGbfcX64PLPyzdM_aV9c,11544
|
135
136
|
prefect/logging/logging.yml,sha256=UkEewf0c3_dURI2uCU4RrxkhI5Devoa1s93fl7hilcg,3160
|
136
137
|
prefect/records/__init__.py,sha256=7q-lwyevfVgb5S7K9frzawmiJmpZ5ET0m5yXIHBYcVA,31
|
137
138
|
prefect/records/result_store.py,sha256=6Yh9zqqXMWjn0qWSfcjQBSfXCM7jVg9pve5TVsOodDc,1734
|
138
139
|
prefect/records/store.py,sha256=eQM1p2vZDshXZYg6SkJwL-DP3kUehL_Zgs8xa2-0DZs,224
|
139
140
|
prefect/runner/__init__.py,sha256=7U-vAOXFkzMfRz1q8Uv6Otsvc0OrPYLLP44srwkJ_8s,89
|
140
|
-
prefect/runner/runner.py,sha256=
|
141
|
-
prefect/runner/server.py,sha256=
|
141
|
+
prefect/runner/runner.py,sha256=zoW90-rYm6NLSVqmdXdQe7_aIBu6HuICe0gkz8FsKJc,47998
|
142
|
+
prefect/runner/server.py,sha256=2o5vhrL7Zbn-HBStWhCjqqViex5Ye9GiQ1EW9RSEzdo,10500
|
142
143
|
prefect/runner/storage.py,sha256=FFHk28iF_OLw-cnXQtJIgGXUV4xecxF70mobiszP8C4,24557
|
143
|
-
prefect/runner/submit.py,sha256=
|
144
|
+
prefect/runner/submit.py,sha256=RuyDr-ved9wjYYarXiehY5oJVFf_HE3XKKACNWpxpPc,8131
|
144
145
|
prefect/runner/utils.py,sha256=wVgVa7p5uUL7tfYfDOVuq6QIGf-I8U9dfAjYBmYf6n4,3286
|
145
146
|
prefect/runtime/__init__.py,sha256=JswiTlYRup2zXOYu8AqJ7czKtgcw9Kxo0tTbS6aWCqY,407
|
146
147
|
prefect/runtime/deployment.py,sha256=Kah8Xdh5f94-CEAXjBgnEB4xAQXXYPaEqDJ_gTqltIY,4752
|
147
|
-
prefect/runtime/flow_run.py,sha256=
|
148
|
+
prefect/runtime/flow_run.py,sha256=N16Z-GzATw-vZnaGdxjomWCfZx8_mMBQR2_cGUVj9m0,9436
|
148
149
|
prefect/runtime/task_run.py,sha256=B6v_nZiHy9nKZfnKFQF7izZjAjaiZOT0j80m-VcLxmY,3403
|
149
150
|
prefect/server/api/collections_data/views/aggregate-worker-metadata.json,sha256=gqrwGyylzBEzlFSPOJcMuUwdoK_zojpU0SZaBDgK5FE,79748
|
150
151
|
prefect/server/api/static/prefect-logo-mark-gradient.png,sha256=ylRjJkI_JHCw8VbQasNnXQHwZW-sH-IQiUGSD3aWP1E,73430
|
@@ -152,14 +153,14 @@ prefect/types/__init__.py,sha256=SAHJDtWEGidTKXQACJ38nj6fq8r57Gj0Pwo4Gy7pVWs,223
|
|
152
153
|
prefect/types/entrypoint.py,sha256=2FF03-wLPgtnqR_bKJDB2BsXXINPdu8ptY9ZYEZnXg8,328
|
153
154
|
prefect/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
154
155
|
prefect/utilities/annotations.py,sha256=bXB43j5Zsq5gaBcJe9qnszBlnNwCTwqSTgcu2OkkRLo,2776
|
155
|
-
prefect/utilities/asyncutils.py,sha256=
|
156
|
+
prefect/utilities/asyncutils.py,sha256=8bOtYljRoOn-LKaMhaQWx80MM2KwUQQC0jzOuO--ZX4,20123
|
156
157
|
prefect/utilities/callables.py,sha256=rkPPzwiVFRoVszSUq612s9S0v3nxcMC-rIwfXoJTn0E,24915
|
157
158
|
prefect/utilities/collections.py,sha256=pPa_SZZq80cja6l99b3TV7hRQy366WnuWpOW_FnutMI,17259
|
158
159
|
prefect/utilities/compat.py,sha256=mNQZDnzyKaOqy-OV-DnmH_dc7CNF5nQgW_EsA4xMr7g,906
|
159
160
|
prefect/utilities/context.py,sha256=BThuUW94-IYgFYTeMIM9KMo8ShT3oiI7w5ajZHzU1j0,1377
|
160
161
|
prefect/utilities/dispatch.py,sha256=c8G-gBo7hZlyoD7my9nO50Rzy8Retk-np5WGq9_E2AM,5856
|
161
162
|
prefect/utilities/dockerutils.py,sha256=kRozGQ7JO6Uxl-ljWtDryzxhf96rHL78aHYDh255Em4,20324
|
162
|
-
prefect/utilities/engine.py,sha256=
|
163
|
+
prefect/utilities/engine.py,sha256=jqE8RqixSbobaB9IxTGKIT2siv9zjT_w_99Y8dDeVVU,31518
|
163
164
|
prefect/utilities/filesystem.py,sha256=frAyy6qOeYa7c-jVbEUGZQEe6J1yF8I_SvUepPd59gI,4415
|
164
165
|
prefect/utilities/hashing.py,sha256=EOwZLmoIZImuSTxAvVqInabxJ-4RpEfYeg9e2EDQF8o,1752
|
165
166
|
prefect/utilities/importtools.py,sha256=YKmfib0_fYK_TaVjy8Ru1yxBI1OPH_Jh-utxlLpu2y8,15406
|
@@ -179,14 +180,14 @@ prefect/utilities/schema_tools/__init__.py,sha256=KsFsTEHQqgp89TkDpjggkgBBywoHQP
|
|
179
180
|
prefect/utilities/schema_tools/hydration.py,sha256=Nitnmr35Mcn5z9NXIvh9DuZW5nCZxpjyMc9RFawMsgs,8376
|
180
181
|
prefect/utilities/schema_tools/validation.py,sha256=zZHL_UFxAlgaUzi-qsEOrhWtZ7EkFQvPkX_YN1EJNTo,8414
|
181
182
|
prefect/workers/__init__.py,sha256=8dP8SLZbWYyC_l9DRTQSE3dEbDgns5DZDhxkp_NfsbQ,35
|
182
|
-
prefect/workers/base.py,sha256=
|
183
|
+
prefect/workers/base.py,sha256=gjv-ZxwJOSr9mytY5bVwj8rtFriLGacGghQhwcX9hQI,43457
|
183
184
|
prefect/workers/block.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
|
184
185
|
prefect/workers/cloud.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
|
185
|
-
prefect/workers/process.py,sha256=
|
186
|
-
prefect/workers/server.py,sha256=
|
186
|
+
prefect/workers/process.py,sha256=t1f1EYRoPL5B25KbLgUX2b5q-lCCAXb2Gpf6T2M9WfY,19822
|
187
|
+
prefect/workers/server.py,sha256=lgh2FfSuaNU7b6HPxSFm8JtKvAvHsZGkiOo4y4tW1Cw,2022
|
187
188
|
prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
|
188
|
-
prefect_client-3.0.
|
189
|
-
prefect_client-3.0.
|
190
|
-
prefect_client-3.0.
|
191
|
-
prefect_client-3.0.
|
192
|
-
prefect_client-3.0.
|
189
|
+
prefect_client-3.0.0rc12.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
|
190
|
+
prefect_client-3.0.0rc12.dist-info/METADATA,sha256=mpzyZ76ECL9XsRq4Squ61UkfenYkdhJzZM7FekCZjHg,7432
|
191
|
+
prefect_client-3.0.0rc12.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
192
|
+
prefect_client-3.0.0rc12.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
|
193
|
+
prefect_client-3.0.0rc12.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|