prefect-client 2.18.2__py3-none-any.whl → 2.18.3__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/engine.py CHANGED
@@ -163,6 +163,7 @@ from prefect.logging.loggers import (
163
163
  from prefect.results import ResultFactory, UnknownResult
164
164
  from prefect.settings import (
165
165
  PREFECT_DEBUG_MODE,
166
+ PREFECT_EXPERIMENTAL_ENABLE_NEW_ENGINE,
166
167
  PREFECT_TASK_INTROSPECTION_WARN_THRESHOLD,
167
168
  PREFECT_TASKS_REFRESH_CACHE,
168
169
  PREFECT_UI_URL,
@@ -189,6 +190,7 @@ from prefect.utilities.annotations import allow_failure, quote, unmapped
189
190
  from prefect.utilities.asyncutils import (
190
191
  gather,
191
192
  is_async_fn,
193
+ run_sync,
192
194
  sync_compatible,
193
195
  )
194
196
  from prefect.utilities.callables import (
@@ -2433,7 +2435,21 @@ if __name__ == "__main__":
2433
2435
  exit(1)
2434
2436
 
2435
2437
  try:
2436
- enter_flow_run_engine_from_subprocess(flow_run_id)
2438
+ if PREFECT_EXPERIMENTAL_ENABLE_NEW_ENGINE.value():
2439
+ from prefect.new_flow_engine import (
2440
+ load_flow_and_flow_run,
2441
+ run_flow,
2442
+ run_flow_sync,
2443
+ )
2444
+
2445
+ flow_run, flow = run_sync(load_flow_and_flow_run)
2446
+ # run the flow
2447
+ if flow.isasync:
2448
+ run_sync(run_flow(flow, flow_run=flow_run))
2449
+ else:
2450
+ run_flow_sync(flow, flow_run=flow_run)
2451
+ else:
2452
+ enter_flow_run_engine_from_subprocess(flow_run_id)
2437
2453
  except Abort as exc:
2438
2454
  engine_logger.info(
2439
2455
  f"Engine execution of flow run '{flow_run_id}' aborted by orchestrator:"
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import inspect
3
+ import os
3
4
  from contextlib import AsyncExitStack, asynccontextmanager, contextmanager
4
5
  from dataclasses import dataclass
5
6
  from typing import (
@@ -10,22 +11,26 @@ from typing import (
10
11
  Iterable,
11
12
  Literal,
12
13
  Optional,
14
+ Tuple,
13
15
  TypeVar,
14
16
  Union,
15
17
  cast,
16
18
  )
19
+ from uuid import UUID
17
20
 
18
21
  import anyio
19
22
  import anyio._backends._asyncio
20
23
  from sniffio import AsyncLibraryNotFoundError
21
24
  from typing_extensions import ParamSpec
22
25
 
23
- from prefect import Flow, Task, get_client
26
+ from prefect import Task, get_client
24
27
  from prefect.client.orchestration import PrefectClient
25
28
  from prefect.client.schemas import FlowRun, TaskRun
26
29
  from prefect.client.schemas.filters import FlowRunFilter
27
30
  from prefect.client.schemas.sorting import FlowRunSort
28
31
  from prefect.context import FlowRunContext
32
+ from prefect.deployments import load_flow_from_flow_run
33
+ from prefect.flows import Flow, load_flow_from_entrypoint
29
34
  from prefect.futures import PrefectFuture, resolve_futures_to_states
30
35
  from prefect.logging.loggers import flow_run_logger
31
36
  from prefect.results import ResultFactory
@@ -49,16 +54,34 @@ P = ParamSpec("P")
49
54
  R = TypeVar("R")
50
55
 
51
56
 
57
+ async def load_flow_and_flow_run(flow_run_id: UUID) -> Tuple[FlowRun, Flow]:
58
+ ## TODO: add error handling to update state and log tracebacks
59
+ entrypoint = os.environ.get("PREFECT__FLOW_ENTRYPOINT")
60
+
61
+ async with get_client() as client:
62
+ flow_run = await client.read_flow_run(flow_run_id)
63
+ flow = (
64
+ load_flow_from_entrypoint(entrypoint)
65
+ if entrypoint
66
+ else await load_flow_from_flow_run(flow_run, client=client)
67
+ )
68
+ return flow_run, flow
69
+
70
+
52
71
  @dataclass
53
72
  class FlowRunEngine(Generic[P, R]):
54
- flow: Union[Flow[P, R], Flow[P, Coroutine[Any, Any, R]]]
73
+ flow: Optional[Union[Flow[P, R], Flow[P, Coroutine[Any, Any, R]]]] = None
55
74
  parameters: Optional[Dict[str, Any]] = None
56
75
  flow_run: Optional[FlowRun] = None
76
+ flow_run_id: Optional[UUID] = None
57
77
  _is_started: bool = False
58
78
  _client: Optional[PrefectClient] = None
59
79
  short_circuit: bool = False
60
80
 
61
81
  def __post_init__(self):
82
+ if self.flow is None and self.flow_run_id is None:
83
+ raise ValueError("Either a flow or a flow_run_id must be provided.")
84
+
62
85
  if self.parameters is None:
63
86
  self.parameters = {}
64
87
 
@@ -304,6 +327,18 @@ class FlowRunEngine(Generic[P, R]):
304
327
  self._client = client
305
328
  self._is_started = True
306
329
 
330
+ # this conditional is engaged whenever a run is triggered via deployment
331
+ if self.flow_run_id and not self.flow:
332
+ self.flow_run = await client.read_flow_run(self.flow_run_id)
333
+ try:
334
+ self.flow = await self.load_flow(client)
335
+ except Exception as exc:
336
+ await self.handle_exception(
337
+ exc,
338
+ msg="Failed to load flow from entrypoint.",
339
+ )
340
+ self.short_circuit = True
341
+
307
342
  if not self.flow_run:
308
343
  self.flow_run = await self.create_flow_run(client)
309
344
 
@@ -373,8 +408,9 @@ class FlowRunEngine(Generic[P, R]):
373
408
 
374
409
 
375
410
  async def run_flow(
376
- flow: Flow[P, Coroutine[Any, Any, R]],
411
+ flow: Optional[Flow[P, Coroutine[Any, Any, R]]] = None,
377
412
  flow_run: Optional[FlowRun] = None,
413
+ flow_run_id: Optional[UUID] = None,
378
414
  parameters: Optional[Dict[str, Any]] = None,
379
415
  wait_for: Optional[Iterable[PrefectFuture[A, Async]]] = None,
380
416
  return_type: Literal["state", "result"] = "result",
@@ -385,7 +421,7 @@ async def run_flow(
385
421
  We will most likely want to use this logic as a wrapper and return a coroutine for type inference.
386
422
  """
387
423
 
388
- engine = FlowRunEngine[P, R](flow, parameters, flow_run)
424
+ engine = FlowRunEngine[P, R](flow, parameters, flow_run, flow_run_id)
389
425
 
390
426
  # This is a context manager that keeps track of the state of the flow run.
391
427
  async with engine.start() as run:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 2.18.2
3
+ Version: 2.18.3
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -5,14 +5,14 @@ prefect/agent.py,sha256=HaGT0yh3fciluYpO99dVHo_LHq7N2cYLuWNrEV_kPV8,27789
5
5
  prefect/artifacts.py,sha256=mreaBE4qMoXkjc9YI-5cAxoye7ixraHB_zr8GTK9xPU,8694
6
6
  prefect/automations.py,sha256=rjVtQblBlKhD_q24bG6zbxJeb_XQJnodMlhr565aZJY,4853
7
7
  prefect/context.py,sha256=BMT8VbI5OmQPFll6I5BlP5lZYn8IoxFsuRjjkqu7wK4,18144
8
- prefect/engine.py,sha256=fzBIleMz7QYM96ENov4t91L3dhrwHcK0AX9a-jL_uOE,89858
8
+ prefect/engine.py,sha256=iDzMZRwB_avmftGVxCJwO4ezW-faLpaoTxeGLWNXqKY,90406
9
9
  prefect/exceptions.py,sha256=Fyl-GXvF9OuKHtsyn5EhWg81pkU1UG3DFHsI1JzhOQE,10851
10
10
  prefect/filesystems.py,sha256=XniPSdBAqywj43X7GyfuWJQIbz07QJ5Y3cVNLhIF3lQ,35260
11
11
  prefect/flow_runs.py,sha256=mFHLavZk1yZ62H3UazuNDBZWAF7AqKttA4rMcHgsVSw,3119
12
12
  prefect/flows.py,sha256=eAn4sGqGHG8afpjMIDOwY1xl5CciioYIYB5v8fsrwc0,71253
13
13
  prefect/futures.py,sha256=RaWfYIXtH7RsWxQ5QWTTlAzwtVV8XWpXaZT_hLq35vQ,12590
14
14
  prefect/manifests.py,sha256=sTM7j8Us5d49zaydYKWsKb7zJ96v1ChkLkLeR0GFYD8,683
15
- prefect/new_flow_engine.py,sha256=sLIimdG3-Nyg8VVy4ItGe4YRdcq7nj7-3jNhz3rwfkM,16174
15
+ prefect/new_flow_engine.py,sha256=OyKq0ngvQMWajCESfUsTu15mARv3zoM7sC6kP2uBm-w,17649
16
16
  prefect/new_task_engine.py,sha256=orLK-RPeJleJ5ID5zKRk-g0TQFtxT_qSTCvOK775pKU,17458
17
17
  prefect/plugins.py,sha256=0C-D3-dKi06JZ44XEGmLjCiAkefbE_lKX-g3urzdbQ4,4163
18
18
  prefect/profiles.toml,sha256=Fs8hD_BdWHZgAijgk8pK_Zx-Pm-YFixqDIfEP6fM-qU,38
@@ -284,8 +284,8 @@ prefect/workers/block.py,sha256=5bdCuqT-4I-et_8ZLG2y1AODzYiCQwFiivhdt5NMEog,7635
284
284
  prefect/workers/process.py,sha256=JkmG-juTiVR6acy1t29NkTdLgp5p5VbBHA-2dCCOdv4,10094
285
285
  prefect/workers/server.py,sha256=WVZJxR8nTMzK0ov0BD0xw5OyQpT26AxlXbsGQ1OrxeQ,1551
286
286
  prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
287
- prefect_client-2.18.2.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
288
- prefect_client-2.18.2.dist-info/METADATA,sha256=3blkjGy7AWMyMJJC4C9GYoO-xKRgbJOgEzIGCo-FkjM,7401
289
- prefect_client-2.18.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
290
- prefect_client-2.18.2.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
291
- prefect_client-2.18.2.dist-info/RECORD,,
287
+ prefect_client-2.18.3.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
288
+ prefect_client-2.18.3.dist-info/METADATA,sha256=OTl_Gv2PvAeIT0Cc0nDWRRxdA16Ro2ZSlEulpPdfu7o,7401
289
+ prefect_client-2.18.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
290
+ prefect_client-2.18.3.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
291
+ prefect_client-2.18.3.dist-info/RECORD,,