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.
- prefect/_internal/compatibility/deprecated.py +53 -0
- prefect/_internal/compatibility/migration.py +8 -6
- prefect/_internal/integrations.py +7 -0
- prefect/blocks/core.py +1 -1
- prefect/client/__init__.py +4 -0
- prefect/client/schemas/objects.py +4 -0
- prefect/client/utilities.py +4 -4
- prefect/deployments/steps/core.py +6 -0
- prefect/engine.py +4 -4
- prefect/flow_engine.py +30 -7
- prefect/flow_runs.py +1 -1
- prefect/flows.py +17 -11
- prefect/futures.py +5 -0
- prefect/logging/loggers.py +1 -1
- prefect/results.py +35 -1
- prefect/settings.py +1 -1
- prefect/task_engine.py +1 -0
- prefect/task_worker.py +13 -2
- prefect/tasks.py +9 -2
- prefect/transactions.py +39 -1
- prefect/utilities/asyncutils.py +29 -5
- prefect/utilities/collections.py +1 -1
- {prefect_client-3.0.0rc8.dist-info → prefect_client-3.0.0rc9.dist-info}/METADATA +2 -1
- {prefect_client-3.0.0rc8.dist-info → prefect_client-3.0.0rc9.dist-info}/RECORD +27 -26
- {prefect_client-3.0.0rc8.dist-info → prefect_client-3.0.0rc9.dist-info}/LICENSE +0 -0
- {prefect_client-3.0.0rc8.dist-info → prefect_client-3.0.0rc9.dist-info}/WHEEL +0 -0
- {prefect_client-3.0.0rc8.dist-info → prefect_client-3.0.0rc9.dist-info}/top_level.txt +0 -0
@@ -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.
|
34
|
-
"prefect.deployments:Deployment": "Use
|
35
|
-
"prefect.
|
36
|
-
"prefect.filesystems:
|
37
|
-
"prefect.filesystems:
|
38
|
-
"prefect.
|
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:
|
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
|
prefect/client/__init__.py
CHANGED
@@ -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__)
|
prefect/client/utilities.py
CHANGED
@@ -78,10 +78,10 @@ def client_injector(
|
|
78
78
|
|
79
79
|
|
80
80
|
def inject_client(
|
81
|
-
fn: Callable[P, Coroutine[Any, Any,
|
82
|
-
) -> Callable[P, Coroutine[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
|
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) ->
|
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
|
-
|
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(
|
40
|
+
run_coro_as_sync(run_flow(flow, flow_run=flow_run))
|
42
41
|
else:
|
43
|
-
|
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
|
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,
|
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=
|
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 `
|
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
|
-
|
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,
|
prefect/logging/loggers.py
CHANGED
@@ -115,7 +115,7 @@ def get_run_logger(
|
|
115
115
|
addition to the run metadata
|
116
116
|
|
117
117
|
Raises:
|
118
|
-
|
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
prefect/task_engine.py
CHANGED
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
|
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
|
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]] =
|
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,
|
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
|
prefect/utilities/asyncutils.py
CHANGED
@@ -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
|
-
|
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(
|
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
|
|
prefect/utilities/collections.py
CHANGED
@@ -369,7 +369,7 @@ def visit_collection(
|
|
369
369
|
|
370
370
|
# --- Sequences
|
371
371
|
|
372
|
-
elif
|
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.
|
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=
|
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=
|
12
|
-
prefect/flow_runs.py,sha256=
|
13
|
-
prefect/flows.py,sha256=
|
14
|
-
prefect/futures.py,sha256=
|
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=
|
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=
|
22
|
+
prefect/settings.py,sha256=PtlBckPyMY2qnmvHRtOkmlgbczcBLMHZMuE09N5fWhU,70566
|
23
23
|
prefect/states.py,sha256=lw22xucH46cN9stkxiV9ByIvq689mH5iL3gErri-Y18,22207
|
24
|
-
prefect/task_engine.py,sha256=
|
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=
|
28
|
-
prefect/tasks.py,sha256=
|
29
|
-
prefect/transactions.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
184
|
-
prefect_client-3.0.
|
185
|
-
prefect_client-3.0.
|
186
|
-
prefect_client-3.0.
|
187
|
-
prefect_client-3.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|