prefect-client 3.0.0rc8__py3-none-any.whl → 3.0.0rc9__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.
@@ -16,6 +16,7 @@ import warnings
16
16
  from typing import Any, Callable, List, Optional, Type, TypeVar
17
17
 
18
18
  import pendulum
19
+ import wrapt
19
20
  from pydantic import BaseModel
20
21
 
21
22
  from prefect.utilities.callables import get_call_parameters
@@ -272,3 +273,55 @@ def register_renamed_module(old_name: str, new_name: str, start_date: str):
272
273
  DEPRECATED_MODULE_ALIASES.append(
273
274
  AliasedModuleDefinition(old_name, new_name, callback)
274
275
  )
276
+
277
+
278
+ class AsyncCompatProxy(wrapt.ObjectProxy):
279
+ """
280
+ A proxy object that allows for awaiting a method that is no longer async.
281
+
282
+ See https://wrapt.readthedocs.io/en/master/wrappers.html#object-proxy for more
283
+ """
284
+
285
+ def __init__(self, wrapped, class_name: str, method_name: str):
286
+ super().__init__(wrapped)
287
+ self._self_class_name = class_name
288
+ self._self_method_name = method_name
289
+ self._self_already_awaited = False
290
+
291
+ def __await__(self):
292
+ if not self._self_already_awaited:
293
+ warnings.warn(
294
+ (
295
+ f"The {self._self_method_name!r} method on {self._self_class_name!r}"
296
+ " is no longer async and awaiting it will raise an error after Dec 2024"
297
+ " - please remove the `await` keyword."
298
+ ),
299
+ DeprecationWarning,
300
+ stacklevel=2,
301
+ )
302
+ self._self_already_awaited = True
303
+ yield
304
+ return self.__wrapped__
305
+
306
+ def __repr__(self):
307
+ return repr(self.__wrapped__)
308
+
309
+ def __reduce_ex__(self, protocol):
310
+ return (
311
+ type(self),
312
+ (self.__wrapped__,),
313
+ {"_self_already_awaited": self._self_already_awaited},
314
+ )
315
+
316
+
317
+ def deprecated_async_method(wrapped):
318
+ """Decorator that wraps a sync method to allow awaiting it even though it is no longer async."""
319
+
320
+ @wrapt.decorator
321
+ def wrapper(wrapped, instance, args, kwargs):
322
+ result = wrapped(*args, **kwargs)
323
+ return AsyncCompatProxy(
324
+ result, class_name=instance.__class__.__name__, method_name=wrapped.__name__
325
+ )
326
+
327
+ return wrapper(wrapped)
@@ -27,15 +27,17 @@ MOVED_IN_V3 = {
27
27
  "prefect.engine:resume_flow_run": "prefect.flow_runs:resume_flow_run",
28
28
  "prefect.engine:suspend_flow_run": "prefect.flow_runs:suspend_flow_run",
29
29
  "prefect.engine:_in_process_pause": "prefect.flow_runs:_in_process_pause",
30
+ "prefect.client:get_client": "prefect.client.orchestration:get_client",
30
31
  }
31
32
 
32
33
  REMOVED_IN_V3 = {
33
- "prefect.deployments.deployments:Deployment": "Use 'flow.serve()', `flow.deploy()`, or `prefect deploy` instead.",
34
- "prefect.deployments:Deployment": "Use 'flow.serve()', `flow.deploy()`, or `prefect deploy` instead.",
35
- "prefect.filesystems:GCS": "Use 'prefect_gcp' instead.",
36
- "prefect.filesystems:Azure": "Use 'prefect_azure' instead.",
37
- "prefect.filesystems:S3": "Use 'prefect_aws' instead.",
38
- "prefect.engine:_out_of_process_pause": "Use 'prefect.flow_runs.pause_flow_run' instead.",
34
+ "prefect.client.schemas.objects:MinimalDeploymentSchedule": "Use `prefect.client.schemas.actions.DeploymentScheduleCreate` instead.",
35
+ "prefect.deployments.deployments:Deployment": "Use `flow.serve()`, `flow.deploy()`, or `prefect deploy` instead.",
36
+ "prefect.deployments:Deployment": "Use `flow.serve()`, `flow.deploy()`, or `prefect deploy` instead.",
37
+ "prefect.filesystems:GCS": "Use `prefect_gcp` instead.",
38
+ "prefect.filesystems:Azure": "Use `prefect_azure` instead.",
39
+ "prefect.filesystems:S3": "Use `prefect_aws` instead.",
40
+ "prefect.engine:_out_of_process_pause": "Use `prefect.flow_runs.pause_flow_run` instead.",
39
41
  }
40
42
 
41
43
  # IMPORTANT FOR USAGE: When adding new modules to MOVED_IN_V3 or REMOVED_IN_V3, include the following lines at the bottom of that module:
@@ -0,0 +1,7 @@
1
+ KNOWN_EXTRAS_FOR_PACKAGES = {
2
+ "prefect-kubernetes": "prefect[kubernetes]",
3
+ "prefect-aws": "prefect[aws]",
4
+ "prefect-gcp": "prefect[gcp]",
5
+ "prefect-azure": "prefect[azure]",
6
+ "prefect-docker": "prefect[docker]",
7
+ }
prefect/blocks/core.py CHANGED
@@ -798,7 +798,7 @@ class Block(BaseModel, ABC):
798
798
  name: str,
799
799
  validate: bool = True,
800
800
  client: Optional["PrefectClient"] = None,
801
- ):
801
+ ) -> "Self":
802
802
  """
803
803
  Retrieves data from the block document with the given name for the block type
804
804
  that corresponds with the current class and returns an instantiated version of
@@ -15,3 +15,7 @@ $ python -m asyncio
15
15
  ```
16
16
  </div>
17
17
  """
18
+
19
+ from prefect._internal.compatibility.migration import getattr_migration
20
+
21
+ __getattr__ = getattr_migration(__name__)
@@ -28,6 +28,7 @@ from pydantic import (
28
28
  from pydantic_extra_types.pendulum_dt import DateTime
29
29
  from typing_extensions import Literal, Self
30
30
 
31
+ from prefect._internal.compatibility.migration import getattr_migration
31
32
  from prefect._internal.schemas.bases import ObjectBaseModel, PrefectBaseModel
32
33
  from prefect._internal.schemas.fields import CreatedBy, UpdatedBy
33
34
  from prefect._internal.schemas.validators import (
@@ -1604,3 +1605,6 @@ class CsrfToken(ObjectBaseModel):
1604
1605
  expiration: datetime.datetime = Field(
1605
1606
  default=..., description="The expiration time of the CSRF token"
1606
1607
  )
1608
+
1609
+
1610
+ __getattr__ = getattr_migration(__name__)
@@ -78,10 +78,10 @@ def client_injector(
78
78
 
79
79
 
80
80
  def inject_client(
81
- fn: Callable[P, Coroutine[Any, Any, Any]],
82
- ) -> Callable[P, Coroutine[Any, Any, Any]]:
81
+ fn: Callable[P, Coroutine[Any, Any, R]],
82
+ ) -> Callable[P, Coroutine[Any, Any, R]]:
83
83
  """
84
- Simple helper to provide a context managed client to a asynchronous function.
84
+ Simple helper to provide a context managed client to an asynchronous function.
85
85
 
86
86
  The decorated function _must_ take a `client` kwarg and if a client is passed when
87
87
  called it will be used instead of creating a new one, but it will not be context
@@ -89,7 +89,7 @@ def inject_client(
89
89
  """
90
90
 
91
91
  @wraps(fn)
92
- async def with_injected_client(*args: P.args, **kwargs: P.kwargs) -> Any:
92
+ async def with_injected_client(*args: P.args, **kwargs: P.kwargs) -> R:
93
93
  client = cast(Optional["PrefectClient"], kwargs.pop("client", None))
94
94
  client, inferred = get_or_create_client(client)
95
95
  if not inferred:
@@ -22,6 +22,7 @@ from typing import Any, Dict, List, Optional, Tuple, Union
22
22
 
23
23
  from prefect._internal.compatibility.deprecated import PrefectDeprecationWarning
24
24
  from prefect._internal.concurrency.api import Call, from_async
25
+ from prefect._internal.integrations import KNOWN_EXTRAS_FOR_PACKAGES
25
26
  from prefect.logging.loggers import get_logger
26
27
  from prefect.settings import PREFECT_DEBUG_MODE
27
28
  from prefect.utilities.importtools import import_object
@@ -84,6 +85,11 @@ def _get_function_for_step(
84
85
  raise
85
86
 
86
87
  try:
88
+ packages = [
89
+ KNOWN_EXTRAS_FOR_PACKAGES.get(package, package)
90
+ for package in packages
91
+ if package
92
+ ]
87
93
  subprocess.check_call([sys.executable, "-m", "pip", "install", *packages])
88
94
  except subprocess.CalledProcessError:
89
95
  get_logger("deployments.steps.core").warning(
prefect/engine.py CHANGED
@@ -31,16 +31,16 @@ if __name__ == "__main__":
31
31
  try:
32
32
  from prefect.flow_engine import (
33
33
  load_flow_and_flow_run,
34
- run_flow_async,
35
- run_flow_sync,
34
+ run_flow,
36
35
  )
37
36
 
38
37
  flow_run, flow = load_flow_and_flow_run(flow_run_id=flow_run_id)
39
38
  # run the flow
40
39
  if flow.isasync:
41
- run_coro_as_sync(run_flow_async(flow, flow_run=flow_run))
40
+ run_coro_as_sync(run_flow(flow, flow_run=flow_run))
42
41
  else:
43
- run_flow_sync(flow, flow_run=flow_run)
42
+ run_flow(flow, flow_run=flow_run)
43
+
44
44
  except Abort as exc:
45
45
  engine_logger.info(
46
46
  f"Engine execution of flow run '{flow_run_id}' aborted by orchestrator:"
prefect/flow_engine.py CHANGED
@@ -51,7 +51,11 @@ from prefect.states import (
51
51
  return_value_to_state,
52
52
  )
53
53
  from prefect.utilities.asyncutils import run_coro_as_sync
54
- from prefect.utilities.callables import call_with_parameters, parameters_to_args_kwargs
54
+ from prefect.utilities.callables import (
55
+ call_with_parameters,
56
+ get_call_parameters,
57
+ parameters_to_args_kwargs,
58
+ )
55
59
  from prefect.utilities.collections import visit_collection
56
60
  from prefect.utilities.engine import (
57
61
  _get_hook_name,
@@ -595,10 +599,11 @@ def run_flow_sync(
595
599
  wait_for: Optional[Iterable[PrefectFuture]] = None,
596
600
  return_type: Literal["state", "result"] = "result",
597
601
  ) -> Union[R, State, None]:
598
- parameters = flow_run.parameters if flow_run else parameters
599
-
600
602
  engine = FlowRunEngine[P, R](
601
- flow=flow, parameters=parameters, flow_run=flow_run, wait_for=wait_for
603
+ flow=flow,
604
+ parameters=parameters,
605
+ flow_run=flow_run,
606
+ wait_for=wait_for,
602
607
  )
603
608
 
604
609
  with engine.start():
@@ -616,8 +621,6 @@ async def run_flow_async(
616
621
  wait_for: Optional[Iterable[PrefectFuture]] = None,
617
622
  return_type: Literal["state", "result"] = "result",
618
623
  ) -> Union[R, State, None]:
619
- parameters = flow_run.parameters if flow_run else parameters
620
-
621
624
  engine = FlowRunEngine[P, R](
622
625
  flow=flow, parameters=parameters, flow_run=flow_run, wait_for=wait_for
623
626
  )
@@ -714,10 +717,13 @@ def run_flow(
714
717
  kwargs = dict(
715
718
  flow=flow,
716
719
  flow_run=flow_run,
717
- parameters=parameters,
720
+ parameters=_flow_parameters(
721
+ flow=flow, flow_run=flow_run, parameters=parameters
722
+ ),
718
723
  wait_for=wait_for,
719
724
  return_type=return_type,
720
725
  )
726
+
721
727
  if flow.isasync and flow.isgenerator:
722
728
  return run_generator_flow_async(**kwargs)
723
729
  elif flow.isgenerator:
@@ -726,3 +732,20 @@ def run_flow(
726
732
  return run_flow_async(**kwargs)
727
733
  else:
728
734
  return run_flow_sync(**kwargs)
735
+
736
+
737
+ def _flow_parameters(
738
+ flow: Flow[P, R], flow_run: Optional[FlowRun], parameters: Optional[Dict[str, Any]]
739
+ ) -> Dict[str, Any]:
740
+ if parameters:
741
+ # This path is taken when a flow is being called directly with
742
+ # parameters, in that case just return the parameters as-is.
743
+ return parameters
744
+
745
+ # Otherwise the flow is being executed indirectly and we may need to grab
746
+ # the parameters from the flow run. We also need to resolve any default
747
+ # parameters that are defined on the flow function itself.
748
+
749
+ parameters = flow_run.parameters if flow_run else {}
750
+ call_args, call_kwargs = parameters_to_args_kwargs(flow.fn, parameters)
751
+ return get_call_parameters(flow.fn, call_args, call_kwargs)
prefect/flow_runs.py CHANGED
@@ -340,7 +340,7 @@ async def suspend_flow_run(
340
340
  already started will run until completion. When resumed, the flow run will
341
341
  be rescheduled to finish execution. In order suspend a flow run in this
342
342
  way, the flow needs to have an associated deployment and results need to be
343
- configured with the `persist_results` option.
343
+ configured with the `persist_result` option.
344
344
 
345
345
  Args:
346
346
  flow_run_id: a flow run id. If supplied, this function will attempt to
prefect/flows.py CHANGED
@@ -53,8 +53,6 @@ from prefect.client.schemas.objects import Flow as FlowSchema
53
53
  from prefect.client.schemas.objects import FlowRun
54
54
  from prefect.client.schemas.schedules import SCHEDULE_TYPES
55
55
  from prefect.client.utilities import client_injector
56
- from prefect.deployments.runner import deploy
57
- from prefect.deployments.steps.core import run_steps
58
56
  from prefect.docker.docker_image import DockerImage
59
57
  from prefect.events import DeploymentTriggerTypes, TriggerTypes
60
58
  from prefect.exceptions import (
@@ -69,12 +67,6 @@ from prefect.futures import PrefectFuture
69
67
  from prefect.logging import get_logger
70
68
  from prefect.logging.loggers import flow_run_logger
71
69
  from prefect.results import ResultSerializer, ResultStorage
72
- from prefect.runner.storage import (
73
- BlockStorageAdapter,
74
- LocalStorage,
75
- RunnerStorage,
76
- create_storage_from_source,
77
- )
78
70
  from prefect.settings import (
79
71
  PREFECT_DEFAULT_WORK_POOL_NAME,
80
72
  PREFECT_FLOW_DEFAULT_RETRIES,
@@ -120,6 +112,7 @@ if TYPE_CHECKING:
120
112
  from prefect.client.types.flexible_schedule_list import FlexibleScheduleList
121
113
  from prefect.deployments.runner import RunnerDeployment
122
114
  from prefect.flows import FlowRun
115
+ from prefect.runner.storage import RunnerStorage
123
116
 
124
117
 
125
118
  class Flow(Generic[P, R]):
@@ -353,7 +346,7 @@ class Flow(Generic[P, R]):
353
346
  self.on_running_hooks = on_running or []
354
347
 
355
348
  # Used for flows loaded from remote storage
356
- self._storage: Optional[RunnerStorage] = None
349
+ self._storage: Optional["RunnerStorage"] = None
357
350
  self._entrypoint: Optional[str] = None
358
351
 
359
352
  module = fn.__module__
@@ -919,7 +912,7 @@ class Flow(Generic[P, R]):
919
912
  @sync_compatible
920
913
  async def from_source(
921
914
  cls: Type[F],
922
- source: Union[str, RunnerStorage, ReadableDeploymentStorage],
915
+ source: Union[str, "RunnerStorage", ReadableDeploymentStorage],
923
916
  entrypoint: str,
924
917
  ) -> F:
925
918
  """
@@ -968,6 +961,14 @@ class Flow(Generic[P, R]):
968
961
  my_flow()
969
962
  ```
970
963
  """
964
+
965
+ from prefect.runner.storage import (
966
+ BlockStorageAdapter,
967
+ LocalStorage,
968
+ RunnerStorage,
969
+ create_storage_from_source,
970
+ )
971
+
971
972
  if isinstance(source, str):
972
973
  storage = create_storage_from_source(source)
973
974
  elif isinstance(source, RunnerStorage):
@@ -1145,7 +1146,9 @@ class Flow(Generic[P, R]):
1145
1146
  entrypoint_type=entrypoint_type,
1146
1147
  )
1147
1148
 
1148
- deployment_ids = await deploy(
1149
+ from prefect.deployments import runner
1150
+
1151
+ deployment_ids = await runner.deploy(
1149
1152
  deployment,
1150
1153
  work_pool_name=work_pool_name,
1151
1154
  image=image,
@@ -1833,6 +1836,9 @@ async def load_flow_from_flow_run(
1833
1836
  run_logger.debug(
1834
1837
  f"Running {len(deployment.pull_steps)} deployment pull step(s)"
1835
1838
  )
1839
+
1840
+ from prefect.deployments.steps.core import run_steps
1841
+
1836
1842
  output = await run_steps(deployment.pull_steps)
1837
1843
  if output.get("directory"):
1838
1844
  run_logger.debug(f"Changing working directory to {output['directory']!r}")
prefect/futures.py CHANGED
@@ -8,6 +8,7 @@ from typing import Any, Generic, List, Optional, Set, Union, cast
8
8
 
9
9
  from typing_extensions import TypeVar
10
10
 
11
+ from prefect._internal.compatibility.deprecated import deprecated_async_method
11
12
  from prefect.client.orchestration import get_client
12
13
  from prefect.client.schemas.objects import TaskRun
13
14
  from prefect.exceptions import ObjectNotFound
@@ -111,6 +112,7 @@ class PrefectConcurrentFuture(PrefectWrappedFuture[R, concurrent.futures.Future]
111
112
  when the task run is submitted to a ThreadPoolExecutor.
112
113
  """
113
114
 
115
+ @deprecated_async_method
114
116
  def wait(self, timeout: Optional[float] = None) -> None:
115
117
  try:
116
118
  result = self._wrapped_future.result(timeout=timeout)
@@ -119,6 +121,7 @@ class PrefectConcurrentFuture(PrefectWrappedFuture[R, concurrent.futures.Future]
119
121
  if isinstance(result, State):
120
122
  self._final_state = result
121
123
 
124
+ @deprecated_async_method
122
125
  def result(
123
126
  self,
124
127
  timeout: Optional[float] = None,
@@ -168,6 +171,7 @@ class PrefectDistributedFuture(PrefectFuture[R]):
168
171
  any task run scheduled in Prefect's API.
169
172
  """
170
173
 
174
+ @deprecated_async_method
171
175
  def wait(self, timeout: Optional[float] = None) -> None:
172
176
  return run_coro_as_sync(self.wait_async(timeout=timeout))
173
177
 
@@ -204,6 +208,7 @@ class PrefectDistributedFuture(PrefectFuture[R]):
204
208
  self._final_state = task_run.state
205
209
  return
206
210
 
211
+ @deprecated_async_method
207
212
  def result(
208
213
  self,
209
214
  timeout: Optional[float] = None,
@@ -115,7 +115,7 @@ def get_run_logger(
115
115
  addition to the run metadata
116
116
 
117
117
  Raises:
118
- RuntimeError: If no context can be found
118
+ MissingContextError: If no context can be found
119
119
  """
120
120
  # Check for existing contexts
121
121
  task_run_context = prefect.context.TaskRunContext.get()
prefect/results.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import abc
2
+ import inspect
2
3
  import uuid
3
4
  from functools import partial
4
5
  from typing import (
@@ -620,9 +621,42 @@ class PersistedResult(BaseResult):
620
621
  try:
621
622
  data = serializer.dumps(obj)
622
623
  except Exception as exc:
624
+ extra_info = (
625
+ 'You can try a different serializer (e.g. result_serializer="json") '
626
+ "or disabling persistence (persist_result=False) for this flow or task."
627
+ )
628
+ # check if this is a known issue with cloudpickle and pydantic
629
+ # and add extra information to help the user recover
630
+
631
+ if (
632
+ isinstance(exc, TypeError)
633
+ and isinstance(obj, BaseModel)
634
+ and str(exc).startswith("cannot pickle")
635
+ ):
636
+ try:
637
+ from IPython import get_ipython
638
+
639
+ if get_ipython() is not None:
640
+ extra_info = inspect.cleandoc(
641
+ """
642
+ This is a known issue in Pydantic that prevents
643
+ locally-defined (non-imported) models from being
644
+ serialized by cloudpickle in IPython/Jupyter
645
+ environments. Please see
646
+ https://github.com/pydantic/pydantic/issues/8232 for
647
+ more information. To fix the issue, either: (1) move
648
+ your Pydantic class definition to an importable
649
+ location, (2) use the JSON serializer for your flow
650
+ or task (`result_serializer="json"`), or (3)
651
+ disable result persistence for your flow or task
652
+ (`persist_result=False`).
653
+ """
654
+ ).replace("\n", " ")
655
+ except ImportError:
656
+ pass
623
657
  raise ValueError(
624
658
  f"Failed to serialize object of type {type(obj).__name__!r} with "
625
- f"serializer {serializer.type!r}."
659
+ f"serializer {serializer.type!r}. {extra_info}"
626
660
  ) from exc
627
661
  blob = PersistedResultBlob(
628
662
  serializer=serializer, data=data, expiration=self.expiration
prefect/settings.py CHANGED
@@ -734,7 +734,7 @@ PREFECT_RESULTS_DEFAULT_SERIALIZER = Setting(
734
734
 
735
735
  PREFECT_RESULTS_PERSIST_BY_DEFAULT = Setting(
736
736
  bool,
737
- default=True,
737
+ default=False,
738
738
  )
739
739
  """
740
740
  The default setting for persisting results when not otherwise specified. If enabled,
prefect/task_engine.py CHANGED
@@ -602,6 +602,7 @@ class TaskRunEngine(Generic[P, R]):
602
602
  key=self.compute_transaction_key(),
603
603
  store=ResultFactoryStore(result_factory=result_factory),
604
604
  overwrite=overwrite,
605
+ logger=self.logger,
605
606
  ) as txn:
606
607
  yield txn
607
608
 
prefect/task_worker.py CHANGED
@@ -7,7 +7,7 @@ import sys
7
7
  from concurrent.futures import ThreadPoolExecutor
8
8
  from contextlib import AsyncExitStack
9
9
  from contextvars import copy_context
10
- from typing import List, Optional
10
+ from typing import Optional
11
11
  from uuid import UUID
12
12
 
13
13
  import anyio
@@ -20,6 +20,7 @@ from websockets.exceptions import InvalidStatusCode
20
20
 
21
21
  from prefect import Task
22
22
  from prefect._internal.concurrency.api import create_call, from_sync
23
+ from prefect.cache_policies import DEFAULT, NONE
23
24
  from prefect.client.orchestration import get_client
24
25
  from prefect.client.schemas.objects import TaskRun
25
26
  from prefect.client.subscriptions import Subscription
@@ -32,6 +33,7 @@ from prefect.settings import (
32
33
  )
33
34
  from prefect.states import Pending
34
35
  from prefect.task_engine import run_task_async, run_task_sync
36
+ from prefect.utilities.annotations import NotSet
35
37
  from prefect.utilities.asyncutils import asyncnullcontext, sync_compatible
36
38
  from prefect.utilities.engine import emit_task_run_state_change_event, propose_state
37
39
  from prefect.utilities.processutils import _register_signal
@@ -76,7 +78,16 @@ class TaskWorker:
76
78
  *tasks: Task,
77
79
  limit: Optional[int] = 10,
78
80
  ):
79
- self.tasks: List[Task] = list(tasks)
81
+ self.tasks = []
82
+ for t in tasks:
83
+ if isinstance(t, Task):
84
+ if t.cache_policy in [None, NONE, NotSet]:
85
+ self.tasks.append(
86
+ t.with_options(persist_result=True, cache_policy=DEFAULT)
87
+ )
88
+ else:
89
+ self.tasks.append(t.with_options(persist_result=True))
90
+
80
91
  self.task_keys = set(t.task_key for t in tasks if isinstance(t, Task))
81
92
 
82
93
  self._started_at: Optional[pendulum.DateTime] = None
prefect/tasks.py CHANGED
@@ -33,6 +33,9 @@ from uuid import UUID, uuid4
33
33
 
34
34
  from typing_extensions import Literal, ParamSpec
35
35
 
36
+ from prefect._internal.compatibility.deprecated import (
37
+ deprecated_async_method,
38
+ )
36
39
  from prefect.cache_policies import DEFAULT, NONE, CachePolicy
37
40
  from prefect.client.orchestration import get_client
38
41
  from prefect.client.schemas import TaskRun
@@ -477,7 +480,7 @@ class Task(Generic[P, R]):
477
480
  cache_key_fn: Optional[
478
481
  Callable[["TaskRunContext", Dict[str, Any]], Optional[str]]
479
482
  ] = None,
480
- task_run_name: Optional[Union[Callable[[], str], str]] = None,
483
+ task_run_name: Optional[Union[Callable[[], str], str, Type[NotSet]]] = NotSet,
481
484
  cache_expiration: Optional[datetime.timedelta] = None,
482
485
  retries: Union[int, Type[NotSet]] = NotSet,
483
486
  retry_delay_seconds: Union[
@@ -591,7 +594,9 @@ class Task(Generic[P, R]):
591
594
  else self.cache_policy,
592
595
  cache_key_fn=cache_key_fn or self.cache_key_fn,
593
596
  cache_expiration=cache_expiration or self.cache_expiration,
594
- task_run_name=task_run_name,
597
+ task_run_name=task_run_name
598
+ if task_run_name is not NotSet
599
+ else self.task_run_name,
595
600
  retries=retries if retries is not NotSet else self.retries,
596
601
  retry_delay_seconds=(
597
602
  retry_delay_seconds
@@ -869,6 +874,7 @@ class Task(Generic[P, R]):
869
874
  ) -> State[T]:
870
875
  ...
871
876
 
877
+ @deprecated_async_method
872
878
  def submit(
873
879
  self,
874
880
  *args: Any,
@@ -1033,6 +1039,7 @@ class Task(Generic[P, R]):
1033
1039
  ) -> PrefectFutureList[State[T]]:
1034
1040
  ...
1035
1041
 
1042
+ @deprecated_async_method
1036
1043
  def map(
1037
1044
  self,
1038
1045
  *args: Any,
prefect/transactions.py CHANGED
@@ -1,3 +1,4 @@
1
+ import logging
1
2
  from contextlib import contextmanager
2
3
  from contextvars import ContextVar, Token
3
4
  from typing import (
@@ -7,12 +8,15 @@ from typing import (
7
8
  List,
8
9
  Optional,
9
10
  Type,
11
+ Union,
10
12
  )
11
13
 
12
14
  from pydantic import Field
13
15
  from typing_extensions import Self
14
16
 
15
17
  from prefect.context import ContextModel, FlowRunContext, TaskRunContext
18
+ from prefect.exceptions import MissingContextError
19
+ from prefect.logging.loggers import PrefectLogAdapter, get_logger, get_run_logger
16
20
  from prefect.records import RecordStore
17
21
  from prefect.records.result_store import ResultFactoryStore
18
22
  from prefect.results import (
@@ -22,6 +26,7 @@ from prefect.results import (
22
26
  )
23
27
  from prefect.utilities.asyncutils import run_coro_as_sync
24
28
  from prefect.utilities.collections import AutoEnum
29
+ from prefect.utilities.engine import _get_hook_name
25
30
 
26
31
 
27
32
  class IsolationLevel(AutoEnum):
@@ -58,6 +63,7 @@ class Transaction(ContextModel):
58
63
  default_factory=list
59
64
  )
60
65
  overwrite: bool = False
66
+ logger: Union[logging.Logger, logging.LoggerAdapter, None] = None
61
67
  _staged_value: Any = None
62
68
  __var__: ContextVar = ContextVar("transaction")
63
69
 
@@ -174,10 +180,13 @@ class Transaction(ContextModel):
174
180
  return False
175
181
 
176
182
  try:
183
+ hook_name = None
184
+
177
185
  for child in self.children:
178
186
  child.commit()
179
187
 
180
188
  for hook in self.on_commit_hooks:
189
+ hook_name = _get_hook_name(hook)
181
190
  hook(self)
182
191
 
183
192
  if self.store and self.key:
@@ -185,6 +194,19 @@ class Transaction(ContextModel):
185
194
  self.state = TransactionState.COMMITTED
186
195
  return True
187
196
  except Exception:
197
+ if self.logger:
198
+ if hook_name:
199
+ msg = (
200
+ f"An error was encountered while running commit hook {hook_name!r}",
201
+ )
202
+ else:
203
+ msg = (
204
+ f"An error was encountered while committing transaction {self.key!r}",
205
+ )
206
+ self.logger.exception(
207
+ msg,
208
+ exc_info=True,
209
+ )
188
210
  self.rollback()
189
211
  return False
190
212
 
@@ -212,6 +234,7 @@ class Transaction(ContextModel):
212
234
 
213
235
  try:
214
236
  for hook in reversed(self.on_rollback_hooks):
237
+ hook_name = _get_hook_name(hook)
215
238
  hook(self)
216
239
 
217
240
  self.state = TransactionState.ROLLED_BACK
@@ -221,6 +244,11 @@ class Transaction(ContextModel):
221
244
 
222
245
  return True
223
246
  except Exception:
247
+ if self.logger:
248
+ self.logger.exception(
249
+ f"An error was encountered while running rollback hook {hook_name!r}",
250
+ exc_info=True,
251
+ )
224
252
  return False
225
253
 
226
254
  @classmethod
@@ -238,6 +266,7 @@ def transaction(
238
266
  store: Optional[RecordStore] = None,
239
267
  commit_mode: Optional[CommitMode] = None,
240
268
  overwrite: bool = False,
269
+ logger: Optional[PrefectLogAdapter] = None,
241
270
  ) -> Generator[Transaction, None, None]:
242
271
  """
243
272
  A context manager for opening and managing a transaction.
@@ -288,7 +317,16 @@ def transaction(
288
317
  result_factory=new_factory,
289
318
  )
290
319
 
320
+ try:
321
+ logger = logger or get_run_logger()
322
+ except MissingContextError:
323
+ logger = get_logger("transactions")
324
+
291
325
  with Transaction(
292
- key=key, store=store, commit_mode=commit_mode, overwrite=overwrite
326
+ key=key,
327
+ store=store,
328
+ commit_mode=commit_mode,
329
+ overwrite=overwrite,
330
+ logger=logger,
293
331
  ) as txn:
294
332
  yield txn
@@ -21,6 +21,7 @@ from typing import (
21
21
  TypeVar,
22
22
  Union,
23
23
  cast,
24
+ overload,
24
25
  )
25
26
  from uuid import UUID, uuid4
26
27
 
@@ -29,6 +30,7 @@ import anyio.abc
29
30
  import anyio.from_thread
30
31
  import anyio.to_thread
31
32
  import sniffio
33
+ import wrapt
32
34
  from typing_extensions import Literal, ParamSpec, TypeGuard
33
35
 
34
36
  from prefect._internal.concurrency.api import _cast_to_call, from_sync
@@ -41,6 +43,7 @@ from prefect.logging import get_logger
41
43
  T = TypeVar("T")
42
44
  P = ParamSpec("P")
43
45
  R = TypeVar("R")
46
+ F = TypeVar("F", bound=Callable[..., Any])
44
47
  Async = Literal[True]
45
48
  Sync = Literal[False]
46
49
  A = TypeVar("A", Async, Sync, covariant=True)
@@ -207,6 +210,11 @@ def run_coro_as_sync(
207
210
  Returns:
208
211
  The result of the coroutine if wait_for_result is True, otherwise None.
209
212
  """
213
+ if not asyncio.iscoroutine(coroutine):
214
+ if isinstance(coroutine, wrapt.ObjectProxy):
215
+ return coroutine.__wrapped__
216
+ else:
217
+ raise TypeError("`coroutine` must be a coroutine object")
210
218
 
211
219
  async def coroutine_wrapper():
212
220
  """
@@ -298,7 +306,23 @@ def in_async_main_thread() -> bool:
298
306
  return not in_async_worker_thread()
299
307
 
300
308
 
301
- def sync_compatible(async_fn: T, force_sync: bool = False) -> T:
309
+ @overload
310
+ def sync_compatible(
311
+ async_fn: Callable[..., Coroutine[Any, Any, R]], force_sync: bool = False
312
+ ) -> Callable[..., R]:
313
+ ...
314
+
315
+
316
+ @overload
317
+ def sync_compatible(
318
+ async_fn: Callable[..., Coroutine[Any, Any, R]], force_sync: bool = False
319
+ ) -> Callable[..., Coroutine[Any, Any, R]]:
320
+ ...
321
+
322
+
323
+ def sync_compatible(
324
+ async_fn: Callable[..., Coroutine[Any, Any, R]], force_sync: bool = False
325
+ ) -> Callable[..., Union[R, Coroutine[Any, Any, R]]]:
302
326
  """
303
327
  Converts an async function into a dual async and sync function.
304
328
 
@@ -314,7 +338,9 @@ def sync_compatible(async_fn: T, force_sync: bool = False) -> T:
314
338
  """
315
339
 
316
340
  @wraps(async_fn)
317
- def coroutine_wrapper(*args, _sync: Optional[bool] = None, **kwargs):
341
+ def coroutine_wrapper(
342
+ *args: Any, _sync: Optional[bool] = None, **kwargs: Any
343
+ ) -> Union[R, Coroutine[Any, Any, R]]:
318
344
  from prefect.context import MissingContextError, get_run_context
319
345
  from prefect.settings import (
320
346
  PREFECT_EXPERIMENTAL_DISABLE_SYNC_COMPAT,
@@ -362,8 +388,6 @@ def sync_compatible(async_fn: T, force_sync: bool = False) -> T:
362
388
  else:
363
389
  return run_coro_as_sync(ctx_call())
364
390
 
365
- # TODO: This is breaking type hints on the callable... mypy is behind the curve
366
- # on argument annotations. We can still fix this for editors though.
367
391
  if is_async_fn(async_fn):
368
392
  wrapper = coroutine_wrapper
369
393
  elif is_async_gen_fn(async_fn):
@@ -371,7 +395,7 @@ def sync_compatible(async_fn: T, force_sync: bool = False) -> T:
371
395
  else:
372
396
  raise TypeError("The decorated function must be async.")
373
397
 
374
- wrapper.aio = async_fn
398
+ wrapper.aio = async_fn # type: ignore
375
399
  return wrapper
376
400
 
377
401
 
@@ -369,7 +369,7 @@ def visit_collection(
369
369
 
370
370
  # --- Sequences
371
371
 
372
- elif typ in (list, tuple, set):
372
+ elif isinstance(expr, (list, tuple, set)):
373
373
  items = [visit_nested(o) for o in expr]
374
374
  if return_data:
375
375
  modified = any(item is not orig for item, orig in zip(items, expr))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.0.0rc8
3
+ Version: 3.0.0rc9
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -60,6 +60,7 @@ Requires-Dist: typing-extensions <5.0.0,>=4.5.0
60
60
  Requires-Dist: ujson <6.0.0,>=5.8.0
61
61
  Requires-Dist: uvicorn <0.29.0,>=0.14.0
62
62
  Requires-Dist: websockets <13.0,>=10.4
63
+ Requires-Dist: wrapt >=1.16.0
63
64
  Requires-Dist: importlib-metadata >=4.4 ; python_version < "3.10"
64
65
  Provides-Extra: notifications
65
66
  Requires-Dist: apprise <2.0.0,>=1.1.0 ; extra == 'notifications'
@@ -5,36 +5,37 @@ prefect/artifacts.py,sha256=G-jCyce3XGtTyQpCk_s3L7e-TWFyJY8Dcnk_i4_CsY4,12647
5
5
  prefect/automations.py,sha256=NlQ62GPJzy-gnWQqX7c6CQJKw7p60WLGDAFcy82vtg4,5613
6
6
  prefect/cache_policies.py,sha256=uEKNGO-PJ3N35B2tjhRDtQULN6ok72D9raIoJaUyXk0,6365
7
7
  prefect/context.py,sha256=OEmbC61D3l0E50HIaMlVNNJShhYC6I1-4TQhpP321tw,19480
8
- prefect/engine.py,sha256=asH7iMb1IfEOOIVIxM3ZalfvCe9PUp7f9ceKyT6isa8,2019
8
+ prefect/engine.py,sha256=BpmDbe6miZcTl1vRkxfCPYcWSXADLigGPCagFwucMz0,1976
9
9
  prefect/exceptions.py,sha256=kRiEX6qpT9errs0SuYJDYG7ioMNddTvqK7gT8RVFajk,11076
10
10
  prefect/filesystems.py,sha256=HrPoehZKpuVxzWDXaTiuJqgVCgxlQ4lyTEZKSYKiZUc,17169
11
- prefect/flow_engine.py,sha256=3JM3LpgqCGLUsTbrh5-CL3IFnHSHRWHbqV9xMEC3nyM,26149
12
- prefect/flow_runs.py,sha256=7mHGjb3-6MfR4XKQjy9sJPS9dS0yTxVO6MYQ8YlGjGw,16071
13
- prefect/flows.py,sha256=wR3bkeS5MuAk_T2UzcBMWx5idghE66CfDVcgR4_6DIE,79033
14
- prefect/futures.py,sha256=P3ZZdoOFaxJFDtquJce6PwUz4VWZd0G3Pf74uMVRGQY,11958
11
+ prefect/flow_engine.py,sha256=zTPQ_qSIKfDdmzQgtLKmAXGQVWWp6JUGVhoB6OVoRVM,26896
12
+ prefect/flow_runs.py,sha256=EaXRIQTOnwnA0fO7_EjwafFRmS57K_CRy0Xsz3JDIhc,16070
13
+ prefect/flows.py,sha256=mninDvvSt2pcfyGIr1YOsHKbGfNjfcOTx3651VAaUBw,79159
14
+ prefect/futures.py,sha256=nGD195sLosqBIpBtESLeVMKAorUVRNLstipiqs6e7w8,12153
15
15
  prefect/main.py,sha256=bab5nBn37a6gmxdPbTlRS2a9Cf0KY0GaCotDOSbcQ7M,1930
16
16
  prefect/manifests.py,sha256=477XcmfdC_yE81wT6zIAKnEUEJ0lH9ZLfOVSgX2FohE,676
17
17
  prefect/plugins.py,sha256=7AICJzHIu8iAeF9vl9wAYm28pR_k7dkdnm3OyJRfCv4,2229
18
18
  prefect/profiles.toml,sha256=Fs8hD_BdWHZgAijgk8pK_Zx-Pm-YFixqDIfEP6fM-qU,38
19
19
  prefect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- prefect/results.py,sha256=Lty6G1zeDyxSmJTYHg3ESXhqt535DsK6gvbtkDsNYWg,25360
20
+ prefect/results.py,sha256=V-x--5xlFok5AZvAxVGeXjCF_s_v-KtZaqZwPawcCkQ,27074
21
21
  prefect/serializers.py,sha256=8ON--RmaLX3Td3Rpd1lshGcqWyjlCFkmO3sblxsdT_c,8699
22
- prefect/settings.py,sha256=IauUadC63B5D4CjVrLca7yaG2qYO4umPAW6t1zYShrE,70565
22
+ prefect/settings.py,sha256=PtlBckPyMY2qnmvHRtOkmlgbczcBLMHZMuE09N5fWhU,70566
23
23
  prefect/states.py,sha256=lw22xucH46cN9stkxiV9ByIvq689mH5iL3gErri-Y18,22207
24
- prefect/task_engine.py,sha256=P8Tl7gp7PzvnxjBqk-M6iev2NTVDlsJ7FOPruJvnn0k,33018
24
+ prefect/task_engine.py,sha256=yibsXJw5hzYXjb5qAgqBnUcXMCiPhJZy1hDtiPmj1uA,33050
25
25
  prefect/task_runners.py,sha256=KulKKV1_Pkt7Pt2to3NLc1tp-idpV8EXdSuFJXS8ZyY,14622
26
26
  prefect/task_runs.py,sha256=eDWYH5H1K4SyduhKmn3GzO6vM3fZSwOZxAb8KhkMGsk,7798
27
- prefect/task_worker.py,sha256=iawQZn4hNcrXR-CHtM4jzhlnotqeNHiRuHc-eumJ9Oc,16788
28
- prefect/tasks.py,sha256=CKFlMcJ7Sw3zYTgPp3fhZZK2oTy33RoQmLNvavgUAxg,61427
29
- prefect/transactions.py,sha256=XhEXdhid1457m5V7VTz1U8JCek6U6jSFD7EffGhCLag,9149
27
+ prefect/task_worker.py,sha256=fyRP5K1U6LGMBoCZOPtbxKs0ay2A6o2gJiw1to0vNYk,17219
28
+ prefect/tasks.py,sha256=Z_8yQPTTlm0ujNudHqCOioQSsTBH8irmF5WJY2uOPSQ,61668
29
+ prefect/transactions.py,sha256=15ZrRp7Csp2uNol8rMvBnZLBKEvlIGiUFsMjk63ha6c,10480
30
30
  prefect/variables.py,sha256=-t5LVY0N-K4f0fa6YwruVVQqwnU3fGWBMYXXE32XPkA,4821
31
31
  prefect/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  prefect/_internal/_logging.py,sha256=HvNHY-8P469o5u4LYEDBTem69XZEt1QUeUaLToijpak,810
33
+ prefect/_internal/integrations.py,sha256=U4cZMDbnilzZSKaMxvzZcSL27a1tzRMjDoTfr2ul_eY,231
33
34
  prefect/_internal/pytz.py,sha256=WWl9x16rKFWequGmcOGs_ljpCDPf2LDHMyZp_4D8e6c,13748
34
35
  prefect/_internal/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- prefect/_internal/compatibility/deprecated.py,sha256=nqevphK00rakKgCfkbqBQ4NCktdb4338uuROjFcq6xA,7517
36
+ prefect/_internal/compatibility/deprecated.py,sha256=7vqE1_PAPS0cDalTfTumHWUIOqIzkbKvQl1iwHlfynQ,9205
36
37
  prefect/_internal/compatibility/experimental.py,sha256=nrIeeAe1vZ0yMb1cPw5AroVR6_msx-bzTeBLzY4au6o,5634
37
- prefect/_internal/compatibility/migration.py,sha256=ec5H2VFCMT1diwW1hinkQpDDSz_PpiArdP1ypEOtNys,4792
38
+ prefect/_internal/compatibility/migration.py,sha256=WcxP0heqBXxlZHEdpGcTWHbAf2EBddSuQdt-z9ZykD4,5006
38
39
  prefect/_internal/concurrency/__init__.py,sha256=YlTwU9ryjPNwbJa45adLJY00t_DGCh1QrdtY9WdVFfw,2140
39
40
  prefect/_internal/concurrency/api.py,sha256=mE2IahRxGX1DgyxIryDXhF6gwhOJ-cdghsTjJtNil9U,7132
40
41
  prefect/_internal/concurrency/calls.py,sha256=UlNgzCoy3awKEPnMpexBSa1dk_2MNwCWoZ5YQODEmG4,15437
@@ -59,24 +60,24 @@ prefect/_internal/schemas/serializers.py,sha256=G_RGHfObjisUiRvd29p-zc6W4bwt5rE1
59
60
  prefect/_internal/schemas/validators.py,sha256=McSijrOcrqQpE-fvp4WRMoxsVn5fWIyBIXdYys1YRhk,29690
60
61
  prefect/blocks/__init__.py,sha256=BUfh6gIwA6HEjRyVCAiv0he3M1zfM-oY-JrlBfeWeY8,182
61
62
  prefect/blocks/abstract.py,sha256=YLzCaf3yXv6wFCF5ZqCIHJNwH7fME1rLxC-SijARHzk,16319
62
- prefect/blocks/core.py,sha256=cgkPF1rpNl_4Asekh2RJ0RiMmjqtuQEbp52BDXgxdbY,46657
63
+ prefect/blocks/core.py,sha256=zB0A0824u3MclXYd9Nt82uARbrDEi-onAtYmCi-XNCk,46667
63
64
  prefect/blocks/fields.py,sha256=1m507VVmkpOnMF_7N-qboRjtw4_ceIuDneX3jZ3Jm54,63
64
65
  prefect/blocks/notifications.py,sha256=QV2ndeiERBbL9vNW2zR1LzH86llDY1sJVh2DN0sh1eo,28198
65
66
  prefect/blocks/redis.py,sha256=GUKYyx2QLtyNvgf5FT_dJxbgQcOzWCja3I23J1-AXhM,5629
66
67
  prefect/blocks/system.py,sha256=tkONKzDlaQgR6NtWXON0ZQm7nGuFKt0_Du3sj8ubs-M,3605
67
68
  prefect/blocks/webhook.py,sha256=mnAfGF64WyjH55BKkTbC1AP9FETNcrm_PEjiqJNpigA,1867
68
- prefect/client/__init__.py,sha256=yJ5FRF9RxNUio2V_HmyKCKw5G6CZO0h8cv6xA_Hkpcc,477
69
+ prefect/client/__init__.py,sha256=fFtCXsGIsBCsAMFKlUPgRVUoIeqq_CsGtFE1knhbHlU,593
69
70
  prefect/client/base.py,sha256=laxz64IEhbetMIcRh67_YDYd5ThCmUK9fgUgco8WyXQ,24647
70
71
  prefect/client/cloud.py,sha256=5T84QP9IRa_cqL7rmY3lR1wxFW6C41PajFZgelurhK0,4124
71
72
  prefect/client/collections.py,sha256=I9EgbTg4Fn57gn8vwP_WdDmgnATbx9gfkm2jjhCORjw,1037
72
73
  prefect/client/constants.py,sha256=Z_GG8KF70vbbXxpJuqW5pLnwzujTVeHbcYYRikNmGH0,29
73
74
  prefect/client/orchestration.py,sha256=W3tiqjND1lf0GtunLBayMRrUD5ykAcW0GfwxqT9fT-A,142479
74
75
  prefect/client/subscriptions.py,sha256=J9uK9NGHO4VX4Y3NGgBJ4pIG_0cf-dJWPhF3f3PGYL4,3388
75
- prefect/client/utilities.py,sha256=Ni1DsFDhnvxpXWerlvZpK8tCg-uZ8UyZwOmDTKEb1DI,3269
76
+ prefect/client/utilities.py,sha256=Qh1WdKLs8F_GuA04FeZ1GJsPYtiCN4DjKmLEaMfKmpQ,3264
76
77
  prefect/client/schemas/__init__.py,sha256=KlyqFV-hMulMkNstBn_0ijoHoIwJZaBj6B1r07UmgvE,607
77
78
  prefect/client/schemas/actions.py,sha256=wiyq87MrHBVbZZVqA6IX4Gy_rw7sogLfqRSXK3Id0cc,28019
78
79
  prefect/client/schemas/filters.py,sha256=HyIYZQowhkHa_D6syj83zUp5uFEzA8UADLaS9mt1MTo,35305
79
- prefect/client/schemas/objects.py,sha256=tLFLEuSnISVeLPkOUDsgcZo5Rq7is1ZCladDa_abR-Q,53422
80
+ prefect/client/schemas/objects.py,sha256=oxFupZM77x8J6HdA8Vx1nVhz-w0WIBbklOhJmDqKYRQ,53538
80
81
  prefect/client/schemas/responses.py,sha256=xW9QKmVgBftSEmtuSr5gp9HBFvIDzF6aSFq-mhv7dE8,14948
81
82
  prefect/client/schemas/schedules.py,sha256=8rpqjOYtknu2-1n5_WD4cOplgu93P3mCyX86B22LfL4,13070
82
83
  prefect/client/schemas/sorting.py,sha256=EIQ6FUjUWMwk6fn6ckVLQLXOP-GI5kce7ftjUkDFWV0,2490
@@ -94,7 +95,7 @@ prefect/deployments/flow_runs.py,sha256=eatcBD7pg-aaEqs9JxQQcKN_flf614O4gAvedAlR
94
95
  prefect/deployments/runner.py,sha256=wVz2Ltis_tOpWLvLzPuOBJBIsdWqs8aXY2oCOuwhssc,41763
95
96
  prefect/deployments/schedules.py,sha256=l1xOHBmJJ-VZFPTX4RWScJ802P-iE81Vzp4EniQ65k4,2004
96
97
  prefect/deployments/steps/__init__.py,sha256=Dlz9VqMRyG1Gal8dj8vfGpPr0LyQhZdvcciozkK8WoY,206
97
- prefect/deployments/steps/core.py,sha256=yKBVi8pi_7fzdng28kUD8vcSl5aED5yFnu9KxCdquKA,6627
98
+ prefect/deployments/steps/core.py,sha256=5vFf6BSpu992kkaYsvcPpsz-nZxFmayMIDmY9h0Hb8M,6846
98
99
  prefect/deployments/steps/pull.py,sha256=ylp3fd72hEfmY67LQs7sMwdcK6KKobsTZOeay-YUl8Q,7125
99
100
  prefect/deployments/steps/utility.py,sha256=s5mMBmHVCS1ZRBRUCunwPueU_7Dii_GK6CqCoznwUCc,8134
100
101
  prefect/docker/__init__.py,sha256=jumlacz2HY9l1ee0L9_kE0PFi9NO3l3pWINm9T5N9hs,524
@@ -128,7 +129,7 @@ prefect/logging/filters.py,sha256=9keHLN4-cpnsWcii1qU0RITNi9-m7pOhkJ_t0MtCM4k,11
128
129
  prefect/logging/formatters.py,sha256=3nBWgawvD48slT0zgkKeus1gIyf0OjmDKdLwMEe5mPU,3923
129
130
  prefect/logging/handlers.py,sha256=eIf-0LFH8XUu8Ybnc3LXoocSsa8M8EdAIwbPTVFzZjI,10425
130
131
  prefect/logging/highlighters.py,sha256=BpSXOy0n3lFVvlKWa7jC-HetAiClFi9jnQtEq5-rgok,1681
131
- prefect/logging/loggers.py,sha256=qWM-5IxN3U5MlK7srfALOC9sCpGqt20Vu9WSxpU2zIs,11527
132
+ prefect/logging/loggers.py,sha256=tvd2uacDOndMKt_jvVlk-bsHGx6lRTaYNtbrvjIaUg8,11534
132
133
  prefect/logging/logging.yml,sha256=UkEewf0c3_dURI2uCU4RrxkhI5Devoa1s93fl7hilcg,3160
133
134
  prefect/records/__init__.py,sha256=7q-lwyevfVgb5S7K9frzawmiJmpZ5ET0m5yXIHBYcVA,31
134
135
  prefect/records/result_store.py,sha256=6Yh9zqqXMWjn0qWSfcjQBSfXCM7jVg9pve5TVsOodDc,1734
@@ -149,9 +150,9 @@ prefect/types/__init__.py,sha256=SAHJDtWEGidTKXQACJ38nj6fq8r57Gj0Pwo4Gy7pVWs,223
149
150
  prefect/types/entrypoint.py,sha256=2FF03-wLPgtnqR_bKJDB2BsXXINPdu8ptY9ZYEZnXg8,328
150
151
  prefect/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
152
  prefect/utilities/annotations.py,sha256=bXB43j5Zsq5gaBcJe9qnszBlnNwCTwqSTgcu2OkkRLo,2776
152
- prefect/utilities/asyncutils.py,sha256=GRDiA3S9vGRpM3aKSq6iZnNP9XNBcfUg0NBwbjUFeAw,19200
153
+ prefect/utilities/asyncutils.py,sha256=5wo5Ya3fimaRy353nApCde9lzXkDLMc_BJjHTg2WbIw,19797
153
154
  prefect/utilities/callables.py,sha256=rkPPzwiVFRoVszSUq612s9S0v3nxcMC-rIwfXoJTn0E,24915
154
- prefect/utilities/collections.py,sha256=2W7cgdB_c_LGMbHPmFSKJbwue_Ai8h5CukSmFoZ8svE,17248
155
+ prefect/utilities/collections.py,sha256=pPa_SZZq80cja6l99b3TV7hRQy366WnuWpOW_FnutMI,17259
155
156
  prefect/utilities/compat.py,sha256=mNQZDnzyKaOqy-OV-DnmH_dc7CNF5nQgW_EsA4xMr7g,906
156
157
  prefect/utilities/context.py,sha256=BThuUW94-IYgFYTeMIM9KMo8ShT3oiI7w5ajZHzU1j0,1377
157
158
  prefect/utilities/dispatch.py,sha256=c8G-gBo7hZlyoD7my9nO50Rzy8Retk-np5WGq9_E2AM,5856
@@ -180,8 +181,8 @@ prefect/workers/base.py,sha256=62E0Q41pPr3eQdSBSUBfiR4WYx01OfuqUp5INRqHGgo,46942
180
181
  prefect/workers/process.py,sha256=vylkSSswaSCew-V65YW0HcxIxyKI-uqWkbSKpkkLamQ,9372
181
182
  prefect/workers/server.py,sha256=EfPiMxI7TVgkqpHkdPwSaYG-ydi99sG7jwXhkAcACbI,1519
182
183
  prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
183
- prefect_client-3.0.0rc8.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
184
- prefect_client-3.0.0rc8.dist-info/METADATA,sha256=HxD4j94rGwv_w89XcuyGmUFJsgSjo22pZNJA99XFK1A,7392
185
- prefect_client-3.0.0rc8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
186
- prefect_client-3.0.0rc8.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
187
- prefect_client-3.0.0rc8.dist-info/RECORD,,
184
+ prefect_client-3.0.0rc9.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
185
+ prefect_client-3.0.0rc9.dist-info/METADATA,sha256=6OG1-1e_ST_fDwjKngTXj3p7NBcxfFJlsZ75vMm1gJE,7422
186
+ prefect_client-3.0.0rc9.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
187
+ prefect_client-3.0.0rc9.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
188
+ prefect_client-3.0.0rc9.dist-info/RECORD,,