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.
@@ -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.flow_engine import FlowRun
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
- try:
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
- try:
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 _get_flow_run_logger(self, flow_run: "FlowRun | FlowRun") -> PrefectLogAdapter:
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(self, flow_run: "FlowRun", message: str) -> None:
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
- flow = await load_flow_from_flow_run(
1395
- flow_run, storage_base_path=str(self._tmp_dir)
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
- flow = await load_flow_from_flow_run(
1416
- flow_run, storage_base_path=str(self._tmp_dir)
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.4
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=e434diXhYl_qvdeW6g7XxxVRtotlQjlwD7FERjcUhyE,180
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=4ZGTKFZA_t7K0XUSJqbJ6Ec20SFVFHasBTM--47fTyA,2610
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=mW95w_fBpEPejYFXuMyjfnhm7J1jMSv_VtAYGD0VlCo,60226
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=i-MdHhmP1S8UQG4dZuHIwbqiM_O95g_Ghn0BcehDaaU,19511
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=lgLvp759BhDJtuF8LeNZFqJZT8dxJxF6SH9Jq_NYFl0,53835
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=bR3lR2hEKSHtd4V0gbEM7WDz6rx_trmWuovXy6Ifomc,55656
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.4.dist-info/METADATA,sha256=wA8CGBB7gfDHiy7qZko23qYiShsCGNbPZXgV8YbuSAg,7231
318
- prefect_client-3.2.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
319
- prefect_client-3.2.4.dist-info/licenses/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
320
- prefect_client-3.2.4.dist-info/RECORD,,
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,,