prefect-client 2.20.4__py3-none-any.whl → 3.0.0__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/__init__.py +74 -110
- prefect/_internal/compatibility/deprecated.py +6 -115
- prefect/_internal/compatibility/experimental.py +4 -79
- prefect/_internal/compatibility/migration.py +166 -0
- prefect/_internal/concurrency/__init__.py +2 -2
- prefect/_internal/concurrency/api.py +1 -35
- prefect/_internal/concurrency/calls.py +0 -6
- prefect/_internal/concurrency/cancellation.py +0 -3
- prefect/_internal/concurrency/event_loop.py +0 -20
- prefect/_internal/concurrency/inspection.py +3 -3
- prefect/_internal/concurrency/primitives.py +1 -0
- prefect/_internal/concurrency/services.py +23 -0
- prefect/_internal/concurrency/threads.py +35 -0
- prefect/_internal/concurrency/waiters.py +0 -28
- prefect/_internal/integrations.py +7 -0
- prefect/_internal/pydantic/__init__.py +0 -45
- prefect/_internal/pydantic/annotations/pendulum.py +2 -2
- prefect/_internal/pydantic/v1_schema.py +21 -22
- prefect/_internal/pydantic/v2_schema.py +0 -2
- prefect/_internal/pydantic/v2_validated_func.py +18 -23
- prefect/_internal/pytz.py +1 -1
- prefect/_internal/retries.py +61 -0
- prefect/_internal/schemas/bases.py +45 -177
- prefect/_internal/schemas/fields.py +1 -43
- prefect/_internal/schemas/validators.py +47 -233
- prefect/agent.py +3 -695
- prefect/artifacts.py +173 -14
- prefect/automations.py +39 -4
- prefect/blocks/abstract.py +1 -1
- prefect/blocks/core.py +405 -153
- prefect/blocks/fields.py +2 -57
- prefect/blocks/notifications.py +43 -28
- prefect/blocks/redis.py +168 -0
- prefect/blocks/system.py +67 -20
- prefect/blocks/webhook.py +2 -9
- prefect/cache_policies.py +239 -0
- prefect/client/__init__.py +4 -0
- prefect/client/base.py +33 -27
- prefect/client/cloud.py +65 -20
- prefect/client/collections.py +1 -1
- prefect/client/orchestration.py +650 -442
- prefect/client/schemas/actions.py +115 -100
- prefect/client/schemas/filters.py +46 -52
- prefect/client/schemas/objects.py +228 -178
- prefect/client/schemas/responses.py +18 -36
- prefect/client/schemas/schedules.py +55 -36
- prefect/client/schemas/sorting.py +2 -0
- prefect/client/subscriptions.py +8 -7
- prefect/client/types/flexible_schedule_list.py +11 -0
- prefect/client/utilities.py +9 -6
- prefect/concurrency/asyncio.py +60 -11
- prefect/concurrency/context.py +24 -0
- prefect/concurrency/events.py +2 -2
- prefect/concurrency/services.py +46 -16
- prefect/concurrency/sync.py +51 -7
- prefect/concurrency/v1/asyncio.py +143 -0
- prefect/concurrency/v1/context.py +27 -0
- prefect/concurrency/v1/events.py +61 -0
- prefect/concurrency/v1/services.py +116 -0
- prefect/concurrency/v1/sync.py +92 -0
- prefect/context.py +246 -149
- prefect/deployments/__init__.py +33 -18
- prefect/deployments/base.py +10 -15
- prefect/deployments/deployments.py +2 -1048
- prefect/deployments/flow_runs.py +178 -0
- prefect/deployments/runner.py +72 -173
- prefect/deployments/schedules.py +31 -25
- prefect/deployments/steps/__init__.py +0 -1
- prefect/deployments/steps/core.py +7 -0
- prefect/deployments/steps/pull.py +15 -21
- prefect/deployments/steps/utility.py +2 -1
- prefect/docker/__init__.py +20 -0
- prefect/docker/docker_image.py +82 -0
- prefect/engine.py +15 -2475
- prefect/events/actions.py +17 -23
- prefect/events/cli/automations.py +20 -7
- prefect/events/clients.py +142 -80
- prefect/events/filters.py +14 -18
- prefect/events/related.py +74 -75
- prefect/events/schemas/__init__.py +0 -5
- prefect/events/schemas/automations.py +55 -46
- prefect/events/schemas/deployment_triggers.py +7 -197
- prefect/events/schemas/events.py +46 -65
- prefect/events/schemas/labelling.py +10 -14
- prefect/events/utilities.py +4 -5
- prefect/events/worker.py +23 -8
- prefect/exceptions.py +15 -0
- prefect/filesystems.py +30 -529
- prefect/flow_engine.py +827 -0
- prefect/flow_runs.py +379 -7
- prefect/flows.py +470 -360
- prefect/futures.py +382 -331
- prefect/infrastructure/__init__.py +5 -26
- prefect/infrastructure/base.py +3 -320
- prefect/infrastructure/provisioners/__init__.py +5 -3
- prefect/infrastructure/provisioners/cloud_run.py +13 -8
- prefect/infrastructure/provisioners/container_instance.py +14 -9
- prefect/infrastructure/provisioners/ecs.py +10 -8
- prefect/infrastructure/provisioners/modal.py +8 -5
- prefect/input/__init__.py +4 -0
- prefect/input/actions.py +2 -4
- prefect/input/run_input.py +9 -9
- prefect/logging/formatters.py +2 -4
- prefect/logging/handlers.py +9 -14
- prefect/logging/loggers.py +5 -5
- prefect/main.py +72 -0
- prefect/plugins.py +2 -64
- prefect/profiles.toml +16 -2
- prefect/records/__init__.py +1 -0
- prefect/records/base.py +223 -0
- prefect/records/filesystem.py +207 -0
- prefect/records/memory.py +178 -0
- prefect/records/result_store.py +64 -0
- prefect/results.py +577 -504
- prefect/runner/runner.py +117 -47
- prefect/runner/server.py +32 -34
- prefect/runner/storage.py +3 -12
- prefect/runner/submit.py +2 -10
- prefect/runner/utils.py +2 -2
- prefect/runtime/__init__.py +1 -0
- prefect/runtime/deployment.py +1 -0
- prefect/runtime/flow_run.py +40 -5
- prefect/runtime/task_run.py +1 -0
- prefect/serializers.py +28 -39
- prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
- prefect/settings.py +209 -332
- prefect/states.py +160 -63
- prefect/task_engine.py +1478 -57
- prefect/task_runners.py +383 -287
- prefect/task_runs.py +240 -0
- prefect/task_worker.py +463 -0
- prefect/tasks.py +684 -374
- prefect/transactions.py +410 -0
- prefect/types/__init__.py +72 -86
- prefect/types/entrypoint.py +13 -0
- prefect/utilities/annotations.py +4 -3
- prefect/utilities/asyncutils.py +227 -148
- prefect/utilities/callables.py +137 -45
- prefect/utilities/collections.py +134 -86
- prefect/utilities/dispatch.py +27 -14
- prefect/utilities/dockerutils.py +11 -4
- prefect/utilities/engine.py +186 -32
- prefect/utilities/filesystem.py +4 -5
- prefect/utilities/importtools.py +26 -27
- prefect/utilities/pydantic.py +128 -38
- prefect/utilities/schema_tools/hydration.py +18 -1
- prefect/utilities/schema_tools/validation.py +30 -0
- prefect/utilities/services.py +35 -9
- prefect/utilities/templating.py +12 -2
- prefect/utilities/timeout.py +20 -5
- prefect/utilities/urls.py +195 -0
- prefect/utilities/visualization.py +1 -0
- prefect/variables.py +78 -59
- prefect/workers/__init__.py +0 -1
- prefect/workers/base.py +237 -244
- prefect/workers/block.py +5 -226
- prefect/workers/cloud.py +6 -0
- prefect/workers/process.py +265 -12
- prefect/workers/server.py +29 -11
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/METADATA +28 -24
- prefect_client-3.0.0.dist-info/RECORD +201 -0
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/WHEEL +1 -1
- prefect/_internal/pydantic/_base_model.py +0 -51
- prefect/_internal/pydantic/_compat.py +0 -82
- prefect/_internal/pydantic/_flags.py +0 -20
- prefect/_internal/pydantic/_types.py +0 -8
- prefect/_internal/pydantic/utilities/config_dict.py +0 -72
- prefect/_internal/pydantic/utilities/field_validator.py +0 -150
- prefect/_internal/pydantic/utilities/model_construct.py +0 -56
- prefect/_internal/pydantic/utilities/model_copy.py +0 -55
- prefect/_internal/pydantic/utilities/model_dump.py +0 -136
- prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
- prefect/_internal/pydantic/utilities/model_fields.py +0 -50
- prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
- prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
- prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
- prefect/_internal/pydantic/utilities/model_validate.py +0 -75
- prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
- prefect/_internal/pydantic/utilities/model_validator.py +0 -87
- prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
- prefect/_vendor/fastapi/__init__.py +0 -25
- prefect/_vendor/fastapi/applications.py +0 -946
- prefect/_vendor/fastapi/background.py +0 -3
- prefect/_vendor/fastapi/concurrency.py +0 -44
- prefect/_vendor/fastapi/datastructures.py +0 -58
- prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
- prefect/_vendor/fastapi/dependencies/models.py +0 -64
- prefect/_vendor/fastapi/dependencies/utils.py +0 -877
- prefect/_vendor/fastapi/encoders.py +0 -177
- prefect/_vendor/fastapi/exception_handlers.py +0 -40
- prefect/_vendor/fastapi/exceptions.py +0 -46
- prefect/_vendor/fastapi/logger.py +0 -3
- prefect/_vendor/fastapi/middleware/__init__.py +0 -1
- prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
- prefect/_vendor/fastapi/middleware/cors.py +0 -3
- prefect/_vendor/fastapi/middleware/gzip.py +0 -3
- prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
- prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
- prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
- prefect/_vendor/fastapi/openapi/__init__.py +0 -0
- prefect/_vendor/fastapi/openapi/constants.py +0 -2
- prefect/_vendor/fastapi/openapi/docs.py +0 -203
- prefect/_vendor/fastapi/openapi/models.py +0 -480
- prefect/_vendor/fastapi/openapi/utils.py +0 -485
- prefect/_vendor/fastapi/param_functions.py +0 -340
- prefect/_vendor/fastapi/params.py +0 -453
- prefect/_vendor/fastapi/py.typed +0 -0
- prefect/_vendor/fastapi/requests.py +0 -4
- prefect/_vendor/fastapi/responses.py +0 -40
- prefect/_vendor/fastapi/routing.py +0 -1331
- prefect/_vendor/fastapi/security/__init__.py +0 -15
- prefect/_vendor/fastapi/security/api_key.py +0 -98
- prefect/_vendor/fastapi/security/base.py +0 -6
- prefect/_vendor/fastapi/security/http.py +0 -172
- prefect/_vendor/fastapi/security/oauth2.py +0 -227
- prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
- prefect/_vendor/fastapi/security/utils.py +0 -10
- prefect/_vendor/fastapi/staticfiles.py +0 -1
- prefect/_vendor/fastapi/templating.py +0 -3
- prefect/_vendor/fastapi/testclient.py +0 -1
- prefect/_vendor/fastapi/types.py +0 -3
- prefect/_vendor/fastapi/utils.py +0 -235
- prefect/_vendor/fastapi/websockets.py +0 -7
- prefect/_vendor/starlette/__init__.py +0 -1
- prefect/_vendor/starlette/_compat.py +0 -28
- prefect/_vendor/starlette/_exception_handler.py +0 -80
- prefect/_vendor/starlette/_utils.py +0 -88
- prefect/_vendor/starlette/applications.py +0 -261
- prefect/_vendor/starlette/authentication.py +0 -159
- prefect/_vendor/starlette/background.py +0 -43
- prefect/_vendor/starlette/concurrency.py +0 -59
- prefect/_vendor/starlette/config.py +0 -151
- prefect/_vendor/starlette/convertors.py +0 -87
- prefect/_vendor/starlette/datastructures.py +0 -707
- prefect/_vendor/starlette/endpoints.py +0 -130
- prefect/_vendor/starlette/exceptions.py +0 -60
- prefect/_vendor/starlette/formparsers.py +0 -276
- prefect/_vendor/starlette/middleware/__init__.py +0 -17
- prefect/_vendor/starlette/middleware/authentication.py +0 -52
- prefect/_vendor/starlette/middleware/base.py +0 -220
- prefect/_vendor/starlette/middleware/cors.py +0 -176
- prefect/_vendor/starlette/middleware/errors.py +0 -265
- prefect/_vendor/starlette/middleware/exceptions.py +0 -74
- prefect/_vendor/starlette/middleware/gzip.py +0 -113
- prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
- prefect/_vendor/starlette/middleware/sessions.py +0 -82
- prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
- prefect/_vendor/starlette/middleware/wsgi.py +0 -147
- prefect/_vendor/starlette/py.typed +0 -0
- prefect/_vendor/starlette/requests.py +0 -328
- prefect/_vendor/starlette/responses.py +0 -347
- prefect/_vendor/starlette/routing.py +0 -933
- prefect/_vendor/starlette/schemas.py +0 -154
- prefect/_vendor/starlette/staticfiles.py +0 -248
- prefect/_vendor/starlette/status.py +0 -199
- prefect/_vendor/starlette/templating.py +0 -231
- prefect/_vendor/starlette/testclient.py +0 -804
- prefect/_vendor/starlette/types.py +0 -30
- prefect/_vendor/starlette/websockets.py +0 -193
- prefect/blocks/kubernetes.py +0 -119
- prefect/deprecated/__init__.py +0 -0
- prefect/deprecated/data_documents.py +0 -350
- prefect/deprecated/packaging/__init__.py +0 -12
- prefect/deprecated/packaging/base.py +0 -96
- prefect/deprecated/packaging/docker.py +0 -146
- prefect/deprecated/packaging/file.py +0 -92
- prefect/deprecated/packaging/orion.py +0 -80
- prefect/deprecated/packaging/serializers.py +0 -171
- prefect/events/instrument.py +0 -135
- prefect/infrastructure/container.py +0 -824
- prefect/infrastructure/kubernetes.py +0 -920
- prefect/infrastructure/process.py +0 -289
- prefect/manifests.py +0 -20
- prefect/new_flow_engine.py +0 -449
- prefect/new_task_engine.py +0 -423
- prefect/pydantic/__init__.py +0 -76
- prefect/pydantic/main.py +0 -39
- prefect/software/__init__.py +0 -2
- prefect/software/base.py +0 -50
- prefect/software/conda.py +0 -199
- prefect/software/pip.py +0 -122
- prefect/software/python.py +0 -52
- prefect/task_server.py +0 -322
- prefect_client-2.20.4.dist-info/RECORD +0 -294
- /prefect/{_internal/pydantic/utilities → client/types}/__init__.py +0 -0
- /prefect/{_vendor → concurrency/v1}/__init__.py +0 -0
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/top_level.txt +0 -0
prefect/artifacts.py
CHANGED
@@ -6,20 +6,27 @@ from __future__ import annotations
|
|
6
6
|
|
7
7
|
import json # noqa: I001
|
8
8
|
import math
|
9
|
-
|
9
|
+
import warnings
|
10
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
|
10
11
|
from uuid import UUID
|
11
12
|
|
12
|
-
from typing_extensions import Self
|
13
|
-
|
14
|
-
from prefect.client.orchestration import PrefectClient
|
15
13
|
from prefect.client.schemas.actions import ArtifactCreate as ArtifactRequest
|
14
|
+
from prefect.client.schemas.actions import ArtifactUpdate
|
16
15
|
from prefect.client.schemas.filters import ArtifactFilter, ArtifactFilterKey
|
17
|
-
from prefect.client.schemas.objects import Artifact as ArtifactResponse
|
18
16
|
from prefect.client.schemas.sorting import ArtifactSort
|
19
17
|
from prefect.client.utilities import get_or_create_client, inject_client
|
18
|
+
from prefect.logging.loggers import get_logger
|
20
19
|
from prefect.utilities.asyncutils import sync_compatible
|
21
20
|
from prefect.utilities.context import get_task_and_flow_run_ids
|
22
21
|
|
22
|
+
logger = get_logger("artifacts")
|
23
|
+
|
24
|
+
if TYPE_CHECKING:
|
25
|
+
from typing_extensions import Self
|
26
|
+
|
27
|
+
from prefect.client.orchestration import PrefectClient
|
28
|
+
from prefect.client.schemas.objects import Artifact as ArtifactResponse
|
29
|
+
|
23
30
|
|
24
31
|
class Artifact(ArtifactRequest):
|
25
32
|
"""
|
@@ -36,9 +43,9 @@ class Artifact(ArtifactRequest):
|
|
36
43
|
|
37
44
|
@sync_compatible
|
38
45
|
async def create(
|
39
|
-
self: Self,
|
40
|
-
client: Optional[PrefectClient] = None,
|
41
|
-
) -> ArtifactResponse:
|
46
|
+
self: "Self",
|
47
|
+
client: Optional["PrefectClient"] = None,
|
48
|
+
) -> "ArtifactResponse":
|
42
49
|
"""
|
43
50
|
A method to create an artifact.
|
44
51
|
|
@@ -48,8 +55,19 @@ class Artifact(ArtifactRequest):
|
|
48
55
|
Returns:
|
49
56
|
- The created artifact.
|
50
57
|
"""
|
58
|
+
from prefect.context import MissingContextError, get_run_context
|
59
|
+
|
51
60
|
client, _ = get_or_create_client(client)
|
52
61
|
task_run_id, flow_run_id = get_task_and_flow_run_ids()
|
62
|
+
|
63
|
+
try:
|
64
|
+
get_run_context()
|
65
|
+
except MissingContextError:
|
66
|
+
warnings.warn(
|
67
|
+
"Artifact creation outside of a flow or task run is deprecated and will be removed in a later version.",
|
68
|
+
FutureWarning,
|
69
|
+
)
|
70
|
+
|
53
71
|
return await client.create_artifact(
|
54
72
|
artifact=ArtifactRequest(
|
55
73
|
type=self.type,
|
@@ -64,8 +82,8 @@ class Artifact(ArtifactRequest):
|
|
64
82
|
@classmethod
|
65
83
|
@sync_compatible
|
66
84
|
async def get(
|
67
|
-
cls, key: Optional[str] = None, client: Optional[PrefectClient] = None
|
68
|
-
) -> Optional[ArtifactResponse]:
|
85
|
+
cls, key: Optional[str] = None, client: Optional["PrefectClient"] = None
|
86
|
+
) -> Optional["ArtifactResponse"]:
|
69
87
|
"""
|
70
88
|
A method to get an artifact.
|
71
89
|
|
@@ -95,9 +113,9 @@ class Artifact(ArtifactRequest):
|
|
95
113
|
key: Optional[str] = None,
|
96
114
|
description: Optional[str] = None,
|
97
115
|
data: Optional[Union[Dict[str, Any], Any]] = None,
|
98
|
-
client: Optional[PrefectClient] = None,
|
116
|
+
client: Optional["PrefectClient"] = None,
|
99
117
|
**kwargs: Any,
|
100
|
-
) -> Tuple[ArtifactResponse, bool]:
|
118
|
+
) -> Tuple["ArtifactResponse", bool]:
|
101
119
|
"""
|
102
120
|
A method to get or create an artifact.
|
103
121
|
|
@@ -171,13 +189,54 @@ class TableArtifact(Artifact):
|
|
171
189
|
return json.dumps(self._sanitize(self.table))
|
172
190
|
|
173
191
|
|
192
|
+
class ProgressArtifact(Artifact):
|
193
|
+
progress: float
|
194
|
+
type: Optional[str] = "progress"
|
195
|
+
|
196
|
+
async def format(self) -> float:
|
197
|
+
# Ensure progress is between 0 and 100
|
198
|
+
min_progress = 0.0
|
199
|
+
max_progress = 100.0
|
200
|
+
if self.progress < min_progress or self.progress > max_progress:
|
201
|
+
logger.warning(
|
202
|
+
f"ProgressArtifact received an invalid value, Progress: {self.progress}%"
|
203
|
+
)
|
204
|
+
self.progress = max(min_progress, min(self.progress, max_progress))
|
205
|
+
logger.warning(f"Interpreting as {self.progress}% progress")
|
206
|
+
|
207
|
+
return self.progress
|
208
|
+
|
209
|
+
|
210
|
+
class ImageArtifact(Artifact):
|
211
|
+
"""
|
212
|
+
An artifact that will display an image from a publicly accessible URL in the UI.
|
213
|
+
|
214
|
+
Arguments:
|
215
|
+
image_url: The URL of the image to display.
|
216
|
+
"""
|
217
|
+
|
218
|
+
image_url: str
|
219
|
+
type: Optional[str] = "image"
|
220
|
+
|
221
|
+
async def format(self) -> str:
|
222
|
+
"""
|
223
|
+
This method is used to format the artifact data so it can be properly sent
|
224
|
+
to the API when the .create() method is called. It is async because the
|
225
|
+
method is awaited in the parent class.
|
226
|
+
|
227
|
+
Returns:
|
228
|
+
str: The image URL.
|
229
|
+
"""
|
230
|
+
return self.image_url
|
231
|
+
|
232
|
+
|
174
233
|
@inject_client
|
175
234
|
async def _create_artifact(
|
176
235
|
type: str,
|
177
236
|
key: Optional[str] = None,
|
178
237
|
description: Optional[str] = None,
|
179
238
|
data: Optional[Union[Dict[str, Any], Any]] = None,
|
180
|
-
client: Optional[PrefectClient] = None,
|
239
|
+
client: Optional["PrefectClient"] = None,
|
181
240
|
) -> UUID:
|
182
241
|
"""
|
183
242
|
Helper function to create an artifact.
|
@@ -210,7 +269,7 @@ async def create_link_artifact(
|
|
210
269
|
link_text: Optional[str] = None,
|
211
270
|
key: Optional[str] = None,
|
212
271
|
description: Optional[str] = None,
|
213
|
-
client: Optional[PrefectClient] = None,
|
272
|
+
client: Optional["PrefectClient"] = None,
|
214
273
|
) -> UUID:
|
215
274
|
"""
|
216
275
|
Create a link artifact.
|
@@ -292,3 +351,103 @@ async def create_table_artifact(
|
|
292
351
|
).create()
|
293
352
|
|
294
353
|
return artifact.id
|
354
|
+
|
355
|
+
|
356
|
+
@sync_compatible
|
357
|
+
async def create_progress_artifact(
|
358
|
+
progress: float,
|
359
|
+
key: Optional[str] = None,
|
360
|
+
description: Optional[str] = None,
|
361
|
+
) -> UUID:
|
362
|
+
"""
|
363
|
+
Create a progress artifact.
|
364
|
+
|
365
|
+
Arguments:
|
366
|
+
progress: The percentage of progress represented by a float between 0 and 100.
|
367
|
+
key: A user-provided string identifier.
|
368
|
+
Required for the artifact to show in the Artifacts page in the UI.
|
369
|
+
The key must only contain lowercase letters, numbers, and dashes.
|
370
|
+
description: A user-specified description of the artifact.
|
371
|
+
|
372
|
+
Returns:
|
373
|
+
The progress artifact ID.
|
374
|
+
"""
|
375
|
+
|
376
|
+
artifact = await ProgressArtifact(
|
377
|
+
key=key,
|
378
|
+
description=description,
|
379
|
+
progress=progress,
|
380
|
+
).create()
|
381
|
+
|
382
|
+
return artifact.id
|
383
|
+
|
384
|
+
|
385
|
+
@sync_compatible
|
386
|
+
async def update_progress_artifact(
|
387
|
+
artifact_id: UUID,
|
388
|
+
progress: float,
|
389
|
+
description: Optional[str] = None,
|
390
|
+
client: Optional[PrefectClient] = None,
|
391
|
+
) -> UUID:
|
392
|
+
"""
|
393
|
+
Update a progress artifact.
|
394
|
+
|
395
|
+
Arguments:
|
396
|
+
artifact_id: The ID of the artifact to update.
|
397
|
+
progress: The percentage of progress represented by a float between 0 and 100.
|
398
|
+
description: A user-specified description of the artifact.
|
399
|
+
|
400
|
+
Returns:
|
401
|
+
The progress artifact ID.
|
402
|
+
"""
|
403
|
+
|
404
|
+
client, _ = get_or_create_client(client)
|
405
|
+
|
406
|
+
artifact = ProgressArtifact(
|
407
|
+
description=description,
|
408
|
+
progress=progress,
|
409
|
+
)
|
410
|
+
update = (
|
411
|
+
ArtifactUpdate(
|
412
|
+
description=artifact.description,
|
413
|
+
data=await artifact.format(),
|
414
|
+
)
|
415
|
+
if description
|
416
|
+
else ArtifactUpdate(data=await artifact.format())
|
417
|
+
)
|
418
|
+
|
419
|
+
await client.update_artifact(
|
420
|
+
artifact_id=artifact_id,
|
421
|
+
artifact=update,
|
422
|
+
)
|
423
|
+
|
424
|
+
return artifact_id
|
425
|
+
|
426
|
+
|
427
|
+
@sync_compatible
|
428
|
+
async def create_image_artifact(
|
429
|
+
image_url: str,
|
430
|
+
key: Optional[str] = None,
|
431
|
+
description: Optional[str] = None,
|
432
|
+
) -> UUID:
|
433
|
+
"""
|
434
|
+
Create an image artifact.
|
435
|
+
|
436
|
+
Arguments:
|
437
|
+
image_url: The URL of the image to display.
|
438
|
+
key: A user-provided string identifier.
|
439
|
+
Required for the artifact to show in the Artifacts page in the UI.
|
440
|
+
The key must only contain lowercase letters, numbers, and dashes.
|
441
|
+
description: A user-specified description of the artifact.
|
442
|
+
|
443
|
+
Returns:
|
444
|
+
The image artifact ID.
|
445
|
+
"""
|
446
|
+
|
447
|
+
artifact = await ImageArtifact(
|
448
|
+
key=key,
|
449
|
+
description=description,
|
450
|
+
image_url=image_url,
|
451
|
+
).create()
|
452
|
+
|
453
|
+
return artifact.id
|
prefect/automations.py
CHANGED
@@ -5,6 +5,24 @@ from pydantic import Field
|
|
5
5
|
from typing_extensions import Self
|
6
6
|
|
7
7
|
from prefect.client.utilities import get_or_create_client
|
8
|
+
from prefect.events.actions import (
|
9
|
+
CallWebhook,
|
10
|
+
CancelFlowRun,
|
11
|
+
ChangeFlowRunState,
|
12
|
+
DeclareIncident,
|
13
|
+
DoNothing,
|
14
|
+
PauseAutomation,
|
15
|
+
PauseDeployment,
|
16
|
+
PauseWorkPool,
|
17
|
+
PauseWorkQueue,
|
18
|
+
ResumeAutomation,
|
19
|
+
ResumeDeployment,
|
20
|
+
ResumeWorkPool,
|
21
|
+
ResumeWorkQueue,
|
22
|
+
RunDeployment,
|
23
|
+
SendNotification,
|
24
|
+
SuspendFlowRun,
|
25
|
+
)
|
8
26
|
from prefect.events.schemas.automations import (
|
9
27
|
AutomationCore,
|
10
28
|
CompositeTrigger,
|
@@ -37,6 +55,23 @@ __all__ = [
|
|
37
55
|
"SequenceTrigger",
|
38
56
|
"CompoundTrigger",
|
39
57
|
"MetricTriggerQuery",
|
58
|
+
# action types
|
59
|
+
"DoNothing",
|
60
|
+
"RunDeployment",
|
61
|
+
"PauseDeployment",
|
62
|
+
"ResumeDeployment",
|
63
|
+
"CancelFlowRun",
|
64
|
+
"ChangeFlowRunState",
|
65
|
+
"PauseWorkQueue",
|
66
|
+
"ResumeWorkQueue",
|
67
|
+
"SendNotification",
|
68
|
+
"CallWebhook",
|
69
|
+
"PauseAutomation",
|
70
|
+
"ResumeAutomation",
|
71
|
+
"SuspendFlowRun",
|
72
|
+
"PauseWorkPool",
|
73
|
+
"ResumeWorkPool",
|
74
|
+
"DeclareIncident",
|
40
75
|
]
|
41
76
|
|
42
77
|
|
@@ -65,7 +100,7 @@ class Automation(AutomationCore):
|
|
65
100
|
created_automation = auto_to_create.create()
|
66
101
|
"""
|
67
102
|
client, _ = get_or_create_client()
|
68
|
-
automation = AutomationCore(**self.
|
103
|
+
automation = AutomationCore(**self.model_dump(exclude={"id"}))
|
69
104
|
self.id = await client.create_automation(automation=automation)
|
70
105
|
return self
|
71
106
|
|
@@ -79,7 +114,7 @@ class Automation(AutomationCore):
|
|
79
114
|
"""
|
80
115
|
|
81
116
|
client, _ = get_or_create_client()
|
82
|
-
automation = AutomationCore(**self.
|
117
|
+
automation = AutomationCore(**self.model_dump(exclude={"id", "owner_resource"}))
|
83
118
|
await client.update_automation(automation_id=self.id, automation=automation)
|
84
119
|
|
85
120
|
@classmethod
|
@@ -106,11 +141,11 @@ class Automation(AutomationCore):
|
|
106
141
|
except PrefectHTTPStatusError as exc:
|
107
142
|
if exc.response.status_code == 404:
|
108
143
|
raise ValueError(f"Automation with ID {id!r} not found")
|
109
|
-
return Automation(**automation.
|
144
|
+
return Automation(**automation.model_dump())
|
110
145
|
else:
|
111
146
|
automation = await client.read_automations_by_name(name=name)
|
112
147
|
if len(automation) > 0:
|
113
|
-
return Automation(**automation[0].
|
148
|
+
return Automation(**automation[0].model_dump()) if automation else None
|
114
149
|
else:
|
115
150
|
raise ValueError(f"Automation with name {name!r} not found")
|
116
151
|
|
prefect/blocks/abstract.py
CHANGED
@@ -73,7 +73,7 @@ class NotificationBlock(Block, ABC):
|
|
73
73
|
"""
|
74
74
|
|
75
75
|
_block_schema_capabilities = ["notify"]
|
76
|
-
_events_excluded_methods = Block._events_excluded_methods + ["notify"]
|
76
|
+
_events_excluded_methods = Block._events_excluded_methods.default + ["notify"]
|
77
77
|
|
78
78
|
@property
|
79
79
|
def logger(self) -> Logger:
|