prefect-client 3.2.4__py3-none-any.whl → 3.2.6__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/_build_info.py +3 -3
- prefect/_experimental/bundles.py +143 -0
- prefect/_internal/schemas/validators.py +1 -1
- prefect/_vendor/croniter/__init__.py +25 -0
- prefect/_vendor/croniter/croniter.py +1456 -0
- prefect/deployments/runner.py +14 -6
- prefect/engine.py +63 -29
- prefect/flow_engine.py +2 -32
- prefect/runner/runner.py +142 -10
- {prefect_client-3.2.4.dist-info → prefect_client-3.2.6.dist-info}/METADATA +1 -2
- {prefect_client-3.2.4.dist-info → prefect_client-3.2.6.dist-info}/RECORD +13 -10
- {prefect_client-3.2.4.dist-info → prefect_client-3.2.6.dist-info}/WHEEL +0 -0
- {prefect_client-3.2.4.dist-info → prefect_client-3.2.6.dist-info}/licenses/LICENSE +0 -0
prefect/deployments/runner.py
CHANGED
@@ -351,15 +351,23 @@ class RunnerDeployment(BaseModel):
|
|
351
351
|
parameter_openapi_schema = self._parameter_openapi_schema.model_dump(
|
352
352
|
exclude_unset=True
|
353
353
|
)
|
354
|
+
|
355
|
+
update_payload = self.model_dump(
|
356
|
+
mode="json",
|
357
|
+
exclude_unset=True,
|
358
|
+
exclude={"storage", "name", "flow_name", "triggers"},
|
359
|
+
)
|
360
|
+
|
361
|
+
if self.storage:
|
362
|
+
pull_steps = self.storage.to_pull_step()
|
363
|
+
if not isinstance(pull_steps, list):
|
364
|
+
pull_steps = [pull_steps]
|
365
|
+
update_payload["pull_steps"] = pull_steps
|
366
|
+
|
354
367
|
await client.update_deployment(
|
355
368
|
deployment_id,
|
356
369
|
deployment=DeploymentUpdate(
|
357
|
-
parameter_openapi_schema=parameter_openapi_schema
|
358
|
-
**self.model_dump(
|
359
|
-
mode="json",
|
360
|
-
exclude_unset=True,
|
361
|
-
exclude={"storage", "name", "flow_name", "triggers"},
|
362
|
-
),
|
370
|
+
**update_payload, parameter_openapi_schema=parameter_openapi_schema
|
363
371
|
),
|
364
372
|
)
|
365
373
|
|
prefect/engine.py
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import os
|
2
4
|
import sys
|
5
|
+
from contextlib import contextmanager
|
3
6
|
from typing import TYPE_CHECKING, Any, Callable
|
4
7
|
from uuid import UUID
|
5
8
|
|
@@ -18,13 +21,71 @@ from prefect.utilities.asyncutils import (
|
|
18
21
|
if TYPE_CHECKING:
|
19
22
|
import logging
|
20
23
|
|
21
|
-
from prefect.
|
24
|
+
from prefect.client.schemas.objects import FlowRun
|
22
25
|
from prefect.flows import Flow
|
23
26
|
from prefect.logging.loggers import LoggingAdapter
|
24
27
|
|
25
28
|
engine_logger: "logging.Logger" = get_logger("engine")
|
26
29
|
|
27
30
|
|
31
|
+
@contextmanager
|
32
|
+
def handle_engine_signals(flow_run_id: UUID | None = None):
|
33
|
+
"""
|
34
|
+
Handle signals from the orchestrator to abort or pause the flow run or otherwise
|
35
|
+
handle unexpected exceptions.
|
36
|
+
|
37
|
+
This context manager will handle exiting the process depending on the signal received.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
flow_run_id: The ID of the flow run to handle signals for.
|
41
|
+
|
42
|
+
Example:
|
43
|
+
```python
|
44
|
+
from prefect import flow
|
45
|
+
from prefect.engine import handle_engine_signals
|
46
|
+
from prefect.flow_engine import run_flow
|
47
|
+
|
48
|
+
@flow
|
49
|
+
def my_flow():
|
50
|
+
print("Hello, world!")
|
51
|
+
|
52
|
+
with handle_engine_signals():
|
53
|
+
run_flow(my_flow)
|
54
|
+
```
|
55
|
+
"""
|
56
|
+
try:
|
57
|
+
yield
|
58
|
+
except Abort:
|
59
|
+
if flow_run_id:
|
60
|
+
msg = f"Execution of flow run '{flow_run_id}' aborted by orchestrator."
|
61
|
+
else:
|
62
|
+
msg = "Execution aborted by orchestrator."
|
63
|
+
engine_logger.info(msg)
|
64
|
+
exit(0)
|
65
|
+
except Pause:
|
66
|
+
if flow_run_id:
|
67
|
+
msg = f"Execution of flow run '{flow_run_id}' is paused."
|
68
|
+
else:
|
69
|
+
msg = "Execution is paused."
|
70
|
+
engine_logger.info(msg)
|
71
|
+
exit(0)
|
72
|
+
except Exception:
|
73
|
+
if flow_run_id:
|
74
|
+
msg = f"Execution of flow run '{flow_run_id}' exited with unexpected exception"
|
75
|
+
else:
|
76
|
+
msg = "Execution exited with unexpected exception"
|
77
|
+
engine_logger.error(msg, exc_info=True)
|
78
|
+
exit(1)
|
79
|
+
except BaseException:
|
80
|
+
if flow_run_id:
|
81
|
+
msg = f"Execution of flow run '{flow_run_id}' interrupted by base exception"
|
82
|
+
else:
|
83
|
+
msg = "Execution interrupted by base exception"
|
84
|
+
engine_logger.error(msg, exc_info=True)
|
85
|
+
# Let the exit code be determined by the base exception type
|
86
|
+
raise
|
87
|
+
|
88
|
+
|
28
89
|
if __name__ == "__main__":
|
29
90
|
try:
|
30
91
|
flow_run_id: UUID = UUID(
|
@@ -36,7 +97,7 @@ if __name__ == "__main__":
|
|
36
97
|
)
|
37
98
|
exit(1)
|
38
99
|
|
39
|
-
|
100
|
+
with handle_engine_signals(flow_run_id):
|
40
101
|
from prefect.flow_engine import (
|
41
102
|
flow_run_logger,
|
42
103
|
load_flow,
|
@@ -62,32 +123,5 @@ if __name__ == "__main__":
|
|
62
123
|
else:
|
63
124
|
run_flow(flow, flow_run=flow_run, error_logger=run_logger)
|
64
125
|
|
65
|
-
except Abort:
|
66
|
-
engine_logger.info(
|
67
|
-
f"Engine execution of flow run '{flow_run_id}' aborted by orchestrator."
|
68
|
-
)
|
69
|
-
exit(0)
|
70
|
-
except Pause:
|
71
|
-
engine_logger.info(f"Engine execution of flow run '{flow_run_id}' is paused.")
|
72
|
-
exit(0)
|
73
|
-
except Exception:
|
74
|
-
engine_logger.error(
|
75
|
-
(
|
76
|
-
f"Engine execution of flow run '{flow_run_id}' exited with unexpected "
|
77
|
-
"exception"
|
78
|
-
),
|
79
|
-
exc_info=True,
|
80
|
-
)
|
81
|
-
exit(1)
|
82
|
-
except BaseException:
|
83
|
-
engine_logger.error(
|
84
|
-
(
|
85
|
-
f"Engine execution of flow run '{flow_run_id}' interrupted by base "
|
86
|
-
"exception"
|
87
|
-
),
|
88
|
-
exc_info=True,
|
89
|
-
)
|
90
|
-
# Let the exit code be determined by the base exception type
|
91
|
-
raise
|
92
126
|
|
93
127
|
__getattr__: Callable[[str], Any] = getattr_migration(__name__)
|
prefect/flow_engine.py
CHANGED
@@ -47,6 +47,7 @@ from prefect.context import (
|
|
47
47
|
hydrated_context,
|
48
48
|
serialize_context,
|
49
49
|
)
|
50
|
+
from prefect.engine import handle_engine_signals
|
50
51
|
from prefect.exceptions import (
|
51
52
|
Abort,
|
52
53
|
MissingFlowError,
|
@@ -1592,8 +1593,6 @@ def run_flow_in_subprocess(
|
|
1592
1593
|
"""
|
1593
1594
|
Wrapper function to update environment variables and settings before running the flow.
|
1594
1595
|
"""
|
1595
|
-
engine_logger = logging.getLogger("prefect.engine")
|
1596
|
-
|
1597
1596
|
os.environ.update(env or {})
|
1598
1597
|
settings_context = get_settings_context()
|
1599
1598
|
# Create a new settings context with a new settings object to pick up the updated
|
@@ -1602,41 +1601,12 @@ def run_flow_in_subprocess(
|
|
1602
1601
|
profile=settings_context.profile,
|
1603
1602
|
settings=Settings(),
|
1604
1603
|
):
|
1605
|
-
|
1604
|
+
with handle_engine_signals(getattr(flow_run, "id", None)):
|
1606
1605
|
maybe_coro = run_flow(*args, **kwargs)
|
1607
1606
|
if asyncio.iscoroutine(maybe_coro):
|
1608
1607
|
# This is running in a brand new process, so there won't be an existing
|
1609
1608
|
# event loop.
|
1610
1609
|
asyncio.run(maybe_coro)
|
1611
|
-
except Abort:
|
1612
|
-
if flow_run:
|
1613
|
-
msg = f"Execution of flow run '{flow_run.id}' aborted by orchestrator."
|
1614
|
-
else:
|
1615
|
-
msg = "Execution aborted by orchestrator."
|
1616
|
-
engine_logger.info(msg)
|
1617
|
-
exit(0)
|
1618
|
-
except Pause:
|
1619
|
-
if flow_run:
|
1620
|
-
msg = f"Execution of flow run '{flow_run.id}' is paused."
|
1621
|
-
else:
|
1622
|
-
msg = "Execution is paused."
|
1623
|
-
engine_logger.info(msg)
|
1624
|
-
exit(0)
|
1625
|
-
except Exception:
|
1626
|
-
if flow_run:
|
1627
|
-
msg = f"Execution of flow run '{flow_run.id}' exited with unexpected exception"
|
1628
|
-
else:
|
1629
|
-
msg = "Execution exited with unexpected exception"
|
1630
|
-
engine_logger.error(msg, exc_info=True)
|
1631
|
-
exit(1)
|
1632
|
-
except BaseException:
|
1633
|
-
if flow_run:
|
1634
|
-
msg = f"Execution of flow run '{flow_run.id}' interrupted by base exception"
|
1635
|
-
else:
|
1636
|
-
msg = "Execution interrupted by base exception"
|
1637
|
-
engine_logger.error(msg, exc_info=True)
|
1638
|
-
# Let the exit code be determined by the base exception type
|
1639
|
-
raise
|
1640
1610
|
|
1641
1611
|
ctx = multiprocessing.get_context("spawn")
|
1642
1612
|
|
prefect/runner/runner.py
CHANGED
@@ -64,9 +64,15 @@ from uuid import UUID, uuid4
|
|
64
64
|
|
65
65
|
import anyio
|
66
66
|
import anyio.abc
|
67
|
+
import anyio.to_thread
|
67
68
|
from cachetools import LRUCache
|
68
69
|
from typing_extensions import Self
|
69
70
|
|
71
|
+
from prefect._experimental.bundles import (
|
72
|
+
SerializedBundle,
|
73
|
+
execute_bundle_in_subprocess,
|
74
|
+
extract_flow_from_bundle,
|
75
|
+
)
|
70
76
|
from prefect._internal.concurrency.api import (
|
71
77
|
create_call,
|
72
78
|
from_async,
|
@@ -135,7 +141,7 @@ __all__ = ["Runner"]
|
|
135
141
|
|
136
142
|
|
137
143
|
class ProcessMapEntry(TypedDict):
|
138
|
-
flow_run: FlowRun
|
144
|
+
flow_run: "FlowRun"
|
139
145
|
pid: int
|
140
146
|
|
141
147
|
|
@@ -221,6 +227,7 @@ class Runner:
|
|
221
227
|
self._scheduled_task_scopes: set[anyio.abc.CancelScope] = set()
|
222
228
|
self._deployment_ids: set[UUID] = set()
|
223
229
|
self._flow_run_process_map: dict[UUID, ProcessMapEntry] = dict()
|
230
|
+
self._flow_run_bundle_map: dict[UUID, SerializedBundle] = dict()
|
224
231
|
|
225
232
|
self._tmp_dir: Path = (
|
226
233
|
Path(tempfile.gettempdir()) / "runner_storage" / str(uuid4())
|
@@ -508,7 +515,7 @@ class Runner:
|
|
508
515
|
return asyncio.run_coroutine_threadsafe(func(*args, **kwargs), self._loop)
|
509
516
|
|
510
517
|
async def cancel_all(self) -> None:
|
511
|
-
runs_to_cancel: list[FlowRun] = []
|
518
|
+
runs_to_cancel: list["FlowRun"] = []
|
512
519
|
|
513
520
|
# done to avoid dictionary size changing during iteration
|
514
521
|
for info in self._flow_run_process_map.values():
|
@@ -602,7 +609,120 @@ class Runner:
|
|
602
609
|
)
|
603
610
|
)
|
604
611
|
|
605
|
-
def
|
612
|
+
async def execute_bundle(self, bundle: SerializedBundle) -> None:
|
613
|
+
"""
|
614
|
+
Executes a bundle in a subprocess.
|
615
|
+
"""
|
616
|
+
from prefect.client.schemas.objects import FlowRun
|
617
|
+
|
618
|
+
self.pause_on_shutdown = False
|
619
|
+
context = self if not self.started else asyncnullcontext()
|
620
|
+
|
621
|
+
flow_run = FlowRun.model_validate(bundle["flow_run"])
|
622
|
+
|
623
|
+
async with context:
|
624
|
+
if not self._acquire_limit_slot(flow_run.id):
|
625
|
+
return
|
626
|
+
|
627
|
+
process = execute_bundle_in_subprocess(bundle)
|
628
|
+
|
629
|
+
if process.pid is None:
|
630
|
+
# This shouldn't happen because `execute_bundle_in_subprocess` starts the process
|
631
|
+
# but we'll handle it gracefully anyway
|
632
|
+
msg = "Failed to start process for flow execution. No PID returned."
|
633
|
+
await self._propose_crashed_state(flow_run, msg)
|
634
|
+
raise RuntimeError(msg)
|
635
|
+
|
636
|
+
self._flow_run_process_map[flow_run.id] = ProcessMapEntry(
|
637
|
+
pid=process.pid, flow_run=flow_run
|
638
|
+
)
|
639
|
+
self._flow_run_bundle_map[flow_run.id] = bundle
|
640
|
+
|
641
|
+
tasks: list[asyncio.Task[None]] = []
|
642
|
+
tasks.append(
|
643
|
+
asyncio.create_task(
|
644
|
+
critical_service_loop(
|
645
|
+
workload=self._check_for_cancelled_flow_runs,
|
646
|
+
interval=self.query_seconds,
|
647
|
+
jitter_range=0.3,
|
648
|
+
)
|
649
|
+
)
|
650
|
+
)
|
651
|
+
if self.heartbeat_seconds is not None:
|
652
|
+
tasks.append(
|
653
|
+
asyncio.create_task(
|
654
|
+
critical_service_loop(
|
655
|
+
workload=self._emit_flow_run_heartbeats,
|
656
|
+
interval=self.heartbeat_seconds,
|
657
|
+
jitter_range=0.1,
|
658
|
+
)
|
659
|
+
)
|
660
|
+
)
|
661
|
+
|
662
|
+
await anyio.to_thread.run_sync(process.join)
|
663
|
+
|
664
|
+
for task in tasks:
|
665
|
+
task.cancel()
|
666
|
+
|
667
|
+
await asyncio.gather(*tasks, return_exceptions=True)
|
668
|
+
|
669
|
+
self._flow_run_process_map.pop(flow_run.id)
|
670
|
+
|
671
|
+
flow_run_logger = self._get_flow_run_logger(flow_run)
|
672
|
+
if process.exitcode is None:
|
673
|
+
raise RuntimeError("Process has no exit code")
|
674
|
+
|
675
|
+
if process.exitcode:
|
676
|
+
help_message = None
|
677
|
+
level = logging.ERROR
|
678
|
+
if process.exitcode == -9:
|
679
|
+
level = logging.INFO
|
680
|
+
help_message = (
|
681
|
+
"This indicates that the process exited due to a SIGKILL signal. "
|
682
|
+
"Typically, this is either caused by manual cancellation or "
|
683
|
+
"high memory usage causing the operating system to "
|
684
|
+
"terminate the process."
|
685
|
+
)
|
686
|
+
if process.exitcode == -15:
|
687
|
+
level = logging.INFO
|
688
|
+
help_message = (
|
689
|
+
"This indicates that the process exited due to a SIGTERM signal. "
|
690
|
+
"Typically, this is caused by manual cancellation."
|
691
|
+
)
|
692
|
+
elif process.exitcode == 247:
|
693
|
+
help_message = (
|
694
|
+
"This indicates that the process was terminated due to high "
|
695
|
+
"memory usage."
|
696
|
+
)
|
697
|
+
elif (
|
698
|
+
sys.platform == "win32"
|
699
|
+
and process.returncode == STATUS_CONTROL_C_EXIT
|
700
|
+
):
|
701
|
+
level = logging.INFO
|
702
|
+
help_message = (
|
703
|
+
"Process was terminated due to a Ctrl+C or Ctrl+Break signal. "
|
704
|
+
"Typically, this is caused by manual cancellation."
|
705
|
+
)
|
706
|
+
|
707
|
+
flow_run_logger.log(
|
708
|
+
level,
|
709
|
+
f"Process for flow run {flow_run.name!r} exited with status code:"
|
710
|
+
f" {process.exitcode}"
|
711
|
+
+ (f"; {help_message}" if help_message else ""),
|
712
|
+
)
|
713
|
+
terminal_state = await self._propose_crashed_state(
|
714
|
+
flow_run, help_message or "Process exited with non-zero exit code"
|
715
|
+
)
|
716
|
+
if terminal_state:
|
717
|
+
await self._run_on_crashed_hooks(
|
718
|
+
flow_run=flow_run, state=terminal_state
|
719
|
+
)
|
720
|
+
else:
|
721
|
+
flow_run_logger.info(
|
722
|
+
f"Process for flow run {flow_run.name!r} exited cleanly."
|
723
|
+
)
|
724
|
+
|
725
|
+
def _get_flow_run_logger(self, flow_run: "FlowRun") -> PrefectLogAdapter:
|
606
726
|
return flow_run_logger(flow_run=flow_run).getChild(
|
607
727
|
"runner",
|
608
728
|
extra={
|
@@ -1308,8 +1428,11 @@ class Runner:
|
|
1308
1428
|
exc_info=True,
|
1309
1429
|
)
|
1310
1430
|
|
1311
|
-
async def _propose_crashed_state(
|
1431
|
+
async def _propose_crashed_state(
|
1432
|
+
self, flow_run: "FlowRun", message: str
|
1433
|
+
) -> State[Any] | None:
|
1312
1434
|
run_logger = self._get_flow_run_logger(flow_run)
|
1435
|
+
state = None
|
1313
1436
|
try:
|
1314
1437
|
state = await propose_state(
|
1315
1438
|
self._client,
|
@@ -1326,6 +1449,7 @@ class Runner:
|
|
1326
1449
|
run_logger.info(
|
1327
1450
|
f"Reported flow run '{flow_run.id}' as crashed: {message}"
|
1328
1451
|
)
|
1452
|
+
return state
|
1329
1453
|
|
1330
1454
|
async def _mark_flow_run_as_cancelled(
|
1331
1455
|
self, flow_run: "FlowRun", state_updates: Optional[dict[str, Any]] = None
|
@@ -1391,9 +1515,14 @@ class Runner:
|
|
1391
1515
|
"""
|
1392
1516
|
if state.is_cancelling():
|
1393
1517
|
try:
|
1394
|
-
|
1395
|
-
|
1396
|
-
|
1518
|
+
if flow_run.id in self._flow_run_bundle_map:
|
1519
|
+
flow = extract_flow_from_bundle(
|
1520
|
+
self._flow_run_bundle_map[flow_run.id]
|
1521
|
+
)
|
1522
|
+
else:
|
1523
|
+
flow = await load_flow_from_flow_run(
|
1524
|
+
flow_run, storage_base_path=str(self._tmp_dir)
|
1525
|
+
)
|
1397
1526
|
hooks = flow.on_cancellation_hooks or []
|
1398
1527
|
|
1399
1528
|
await _run_hooks(hooks, flow_run, flow, state)
|
@@ -1412,9 +1541,12 @@ class Runner:
|
|
1412
1541
|
Run the hooks for a flow.
|
1413
1542
|
"""
|
1414
1543
|
if state.is_crashed():
|
1415
|
-
|
1416
|
-
|
1417
|
-
|
1544
|
+
if flow_run.id in self._flow_run_bundle_map:
|
1545
|
+
flow = extract_flow_from_bundle(self._flow_run_bundle_map[flow_run.id])
|
1546
|
+
else:
|
1547
|
+
flow = await load_flow_from_flow_run(
|
1548
|
+
flow_run, storage_base_path=str(self._tmp_dir)
|
1549
|
+
)
|
1418
1550
|
hooks = flow.on_crashed_hooks or []
|
1419
1551
|
|
1420
1552
|
await _run_hooks(hooks, flow_run, flow, state)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: prefect-client
|
3
|
-
Version: 3.2.
|
3
|
+
Version: 3.2.6
|
4
4
|
Summary: Workflow orchestration and management.
|
5
5
|
Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
|
6
6
|
Project-URL: Documentation, https://docs.prefect.io
|
@@ -25,7 +25,6 @@ Requires-Dist: asgi-lifespan<3.0,>=1.0
|
|
25
25
|
Requires-Dist: cachetools<6.0,>=5.3
|
26
26
|
Requires-Dist: cloudpickle<4.0,>=2.0
|
27
27
|
Requires-Dist: coolname<3.0.0,>=1.0.4
|
28
|
-
Requires-Dist: croniter<7.0.0,>=1.0.12
|
29
28
|
Requires-Dist: exceptiongroup>=1.0.0
|
30
29
|
Requires-Dist: fastapi<1.0.0,>=0.111.0
|
31
30
|
Requires-Dist: fsspec>=2022.5.0
|
@@ -1,17 +1,17 @@
|
|
1
1
|
prefect/.prefectignore,sha256=awSprvKT0vI8a64mEOLrMxhxqcO-b0ERQeYpA2rNKVQ,390
|
2
2
|
prefect/__init__.py,sha256=iCdcC5ZmeewikCdnPEP6YBAjPNV5dvfxpYCTpw30Hkw,3685
|
3
3
|
prefect/__main__.py,sha256=WFjw3kaYJY6pOTA7WDOgqjsz8zUEUZHCcj3P5wyVa-g,66
|
4
|
-
prefect/_build_info.py,sha256=
|
4
|
+
prefect/_build_info.py,sha256=4oC7HpoKzqi-JGuQXctloFjee21Vq-csRlUUkWKnvI0,180
|
5
5
|
prefect/_result_records.py,sha256=S6QmsODkehGVSzbMm6ig022PYbI6gNKz671p_8kBYx4,7789
|
6
6
|
prefect/agent.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
|
7
7
|
prefect/artifacts.py,sha256=dMBUOAWnUamzjb5HSqwB5-GR2Qb-Gxee26XG5NDCUuw,22720
|
8
8
|
prefect/automations.py,sha256=ZzPxn2tINdlXTQo805V4rIlbXuNWxd7cdb3gTJxZIeY,12567
|
9
9
|
prefect/cache_policies.py,sha256=cF_6eqg34x7XgaCIw6S8Vr-Eq0wIr4Y6t3FOuXaPBrY,11912
|
10
10
|
prefect/context.py,sha256=iJe4pkFqX6lz8ax1Mde_YqVmBVWmzeBe0ca2_nT6KPQ,23673
|
11
|
-
prefect/engine.py,sha256=
|
11
|
+
prefect/engine.py,sha256=uB5JN4l045i5JTlRQNT1x7MwlSiGQ5Bop2Q6jHHOgxY,3699
|
12
12
|
prefect/exceptions.py,sha256=-nih8qqdxRm6CX-4yrqwePVh8Mcpvla_V6N_KbdJsIU,11593
|
13
13
|
prefect/filesystems.py,sha256=v5YqGB4uXf9Ew2VuB9VCSkawvYMMVvEtZf7w1VmAmr8,18036
|
14
|
-
prefect/flow_engine.py,sha256=
|
14
|
+
prefect/flow_engine.py,sha256=gR44YU7aCAbHEqoMDdxL1SDrtS5Xx1Kzg3M7FWjHcvY,58967
|
15
15
|
prefect/flow_runs.py,sha256=MzjfRFgQwOqUSC3Iuu6E0hWkWdn089Urk6BY3qjEwEE,16113
|
16
16
|
prefect/flows.py,sha256=cp9TF3pSg73jhkL3SkzaUGbdU9hbsieKz95Wgfk-VA4,108408
|
17
17
|
prefect/futures.py,sha256=NYWGeC8uRGe1WWB1MxkUshdvAdYibhc32HdFjffdiW0,17217
|
@@ -30,6 +30,7 @@ prefect/tasks.py,sha256=g__kIAXvbvdY7NtK7R-KbJg7qUP31xjf5uK80zRS3Ds,74049
|
|
30
30
|
prefect/transactions.py,sha256=kOXwghBW3jM71gg49MkjJPTnImEzXWeTCUE_zpq2MlI,16068
|
31
31
|
prefect/variables.py,sha256=dCK3vX7TbkqXZhnNT_v7rcGh3ISRqoR6pJVLpoll3Js,8342
|
32
32
|
prefect/_experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
|
+
prefect/_experimental/bundles.py,sha256=7oumoEW7L6ZnRQJhO6ii3BsXIfPkE9Ic3yzX56vauR4,3821
|
33
34
|
prefect/_experimental/lineage.py,sha256=8LssReoq7eLtQScUCu-7FCtrWoRZstXKRdpO0PxgbKg,9958
|
34
35
|
prefect/_experimental/sla/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
36
|
prefect/_experimental/sla/client.py,sha256=XTkYHFZiBy_O7RgUyGEdl9MxaHP-6fEAKBk3ksNQobU,3611
|
@@ -64,7 +65,9 @@ prefect/_internal/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
64
65
|
prefect/_internal/schemas/bases.py,sha256=UpGMovMZe8z2VxqeqIjFLwWYPNLa7rdeeGamRwZH2qw,4286
|
65
66
|
prefect/_internal/schemas/fields.py,sha256=m4LrFNz8rA9uBhMk9VyQT6FIXmV_EVAW92hdXeSvHbY,837
|
66
67
|
prefect/_internal/schemas/serializers.py,sha256=G_RGHfObjisUiRvd29p-zc6W4bwt5rE1OdR6TXNrRhQ,825
|
67
|
-
prefect/_internal/schemas/validators.py,sha256=
|
68
|
+
prefect/_internal/schemas/validators.py,sha256=Z5EQ9xFlUJ09LTDlX5MEJctj3J5YUL7urWcrxtV6R5s,19527
|
69
|
+
prefect/_vendor/croniter/__init__.py,sha256=NUFzdbyPcTQhIOFtzmFM0nbClAvBbKh2mlnTBa6NfHU,523
|
70
|
+
prefect/_vendor/croniter/croniter.py,sha256=eJ2HzStNAYV-vNiLOgDXl4sYWWHOsSA0dgwbkQoguhY,53009
|
68
71
|
prefect/blocks/__init__.py,sha256=D0hB72qMfgqnBB2EMZRxUxlX9yLfkab5zDChOwJZmkY,220
|
69
72
|
prefect/blocks/abstract.py,sha256=mpOAWopSR_RrzdxeurBTXVSKisP8ne-k8LYos-tp7go,17021
|
70
73
|
prefect/blocks/core.py,sha256=CgxU59KUWiHLWUdTxOSDOfHkfFAyjLXc7eibmFc_xCo,62186
|
@@ -134,7 +137,7 @@ prefect/deployments/__init__.py,sha256=_wb7NxDKhq11z9MjYsPckmT3o6MRhGLRgCV9TmvYt
|
|
134
137
|
prefect/deployments/base.py,sha256=KEc07W35yyzGJcV6GIZry8bKcNfvQk6JjJ99KKB6XpQ,11729
|
135
138
|
prefect/deployments/deployments.py,sha256=K3Rgnpjxo_T8I8LMwlq24OKqZiZBTE8-YnPg-YGUStM,171
|
136
139
|
prefect/deployments/flow_runs.py,sha256=VunxRsw4DyqVJHNjooDAPGJaGvSGucLX83SaxHO8ugU,7227
|
137
|
-
prefect/deployments/runner.py,sha256=
|
140
|
+
prefect/deployments/runner.py,sha256=FUmBuuF5X8o2wGf8aIdqjijDJy3FWuNYPpwaKhrVaHs,54052
|
138
141
|
prefect/deployments/schedules.py,sha256=2eL1-w8qXtwKVkgfUK7cuamwpKK3X6tN1QYTDa_gWxU,2190
|
139
142
|
prefect/deployments/steps/__init__.py,sha256=Dlz9VqMRyG1Gal8dj8vfGpPr0LyQhZdvcciozkK8WoY,206
|
140
143
|
prefect/deployments/steps/core.py,sha256=ulSgBFSx1lhBt1fP-UxebrernkumBDlympR6IPffV1g,6900
|
@@ -180,7 +183,7 @@ prefect/logging/highlighters.py,sha256=BCf_LNhFInIfGPqwuu8YVrGa4wVxNc4YXo2pYgftp
|
|
180
183
|
prefect/logging/loggers.py,sha256=xkmHXsiuoPZZXcrrEgMA-ZQu0E-gW3tNVd4BIxWjnpM,12704
|
181
184
|
prefect/logging/logging.yml,sha256=tT7gTyC4NmngFSqFkCdHaw7R0GPNPDDsTCGZQByiJAQ,3169
|
182
185
|
prefect/runner/__init__.py,sha256=7U-vAOXFkzMfRz1q8Uv6Otsvc0OrPYLLP44srwkJ_8s,89
|
183
|
-
prefect/runner/runner.py,sha256=
|
186
|
+
prefect/runner/runner.py,sha256=s40phNASP-dj-sDStQTucwaum3Khn4BmxJQzrnZXh1I,60966
|
184
187
|
prefect/runner/server.py,sha256=WDDjCbnd2F_3LZBpVX2Y398xpmHvxjyBLKVHWkh5QxI,11240
|
185
188
|
prefect/runner/storage.py,sha256=Uxx_7SPm-F0LR1LUq64cT-xHL2ofd37hHqLHtRYjGW0,27527
|
186
189
|
prefect/runner/submit.py,sha256=3Ey6H4XrhYhCII4AobpvzZf21vAunWlMu40zAjMC0gc,8353
|
@@ -314,7 +317,7 @@ prefect/workers/cloud.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
|
|
314
317
|
prefect/workers/process.py,sha256=6VWon_LK7fQNLlQTjTBFeU4KFUa4faqP4EUuTvrbtbg,20176
|
315
318
|
prefect/workers/server.py,sha256=SEuyScZ5nGm2OotdtbHjpvqJlTRVWCh29ND7FeL_fZA,1974
|
316
319
|
prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
|
317
|
-
prefect_client-3.2.
|
318
|
-
prefect_client-3.2.
|
319
|
-
prefect_client-3.2.
|
320
|
-
prefect_client-3.2.
|
320
|
+
prefect_client-3.2.6.dist-info/METADATA,sha256=v5sEVFq8xBfcOCWp8dmFcDP7LkvRoV1IPTY7vfWLy64,7192
|
321
|
+
prefect_client-3.2.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
322
|
+
prefect_client-3.2.6.dist-info/licenses/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
|
323
|
+
prefect_client-3.2.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|