prefect-client 2.19.3__py3-none-any.whl → 3.0.0rc1__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 +8 -56
- prefect/_internal/compatibility/deprecated.py +6 -115
- prefect/_internal/compatibility/experimental.py +4 -79
- prefect/_internal/concurrency/api.py +0 -34
- 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/threads.py +35 -0
- prefect/_internal/concurrency/waiters.py +0 -28
- prefect/_internal/pydantic/__init__.py +0 -45
- 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/schemas/bases.py +44 -177
- prefect/_internal/schemas/fields.py +1 -43
- prefect/_internal/schemas/validators.py +60 -158
- prefect/artifacts.py +161 -14
- prefect/automations.py +39 -4
- prefect/blocks/abstract.py +1 -1
- prefect/blocks/core.py +268 -148
- prefect/blocks/fields.py +2 -57
- prefect/blocks/kubernetes.py +8 -12
- prefect/blocks/notifications.py +40 -20
- prefect/blocks/system.py +22 -11
- prefect/blocks/webhook.py +2 -9
- prefect/client/base.py +4 -4
- prefect/client/cloud.py +8 -13
- prefect/client/orchestration.py +347 -341
- prefect/client/schemas/actions.py +92 -86
- prefect/client/schemas/filters.py +20 -40
- prefect/client/schemas/objects.py +147 -145
- prefect/client/schemas/responses.py +16 -24
- prefect/client/schemas/schedules.py +47 -35
- prefect/client/subscriptions.py +2 -2
- prefect/client/utilities.py +5 -2
- prefect/concurrency/asyncio.py +3 -1
- prefect/concurrency/events.py +1 -1
- prefect/concurrency/services.py +6 -3
- prefect/context.py +195 -27
- prefect/deployments/__init__.py +5 -6
- prefect/deployments/base.py +7 -5
- prefect/deployments/flow_runs.py +185 -0
- prefect/deployments/runner.py +50 -45
- prefect/deployments/schedules.py +28 -23
- prefect/deployments/steps/__init__.py +0 -1
- prefect/deployments/steps/core.py +1 -0
- prefect/deployments/steps/pull.py +7 -21
- prefect/engine.py +12 -2422
- prefect/events/actions.py +17 -23
- prefect/events/cli/automations.py +19 -6
- prefect/events/clients.py +14 -37
- prefect/events/filters.py +14 -18
- prefect/events/related.py +2 -2
- 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 +34 -65
- prefect/events/schemas/labelling.py +10 -14
- prefect/events/utilities.py +2 -3
- prefect/events/worker.py +2 -3
- prefect/filesystems.py +6 -517
- prefect/{new_flow_engine.py → flow_engine.py} +313 -72
- prefect/flow_runs.py +377 -5
- prefect/flows.py +248 -165
- prefect/futures.py +186 -345
- prefect/infrastructure/__init__.py +0 -27
- prefect/infrastructure/provisioners/__init__.py +5 -3
- prefect/infrastructure/provisioners/cloud_run.py +11 -6
- prefect/infrastructure/provisioners/container_instance.py +11 -7
- prefect/infrastructure/provisioners/ecs.py +6 -4
- prefect/infrastructure/provisioners/modal.py +8 -5
- prefect/input/actions.py +2 -4
- prefect/input/run_input.py +5 -7
- prefect/logging/formatters.py +0 -2
- prefect/logging/handlers.py +3 -11
- prefect/logging/loggers.py +2 -2
- prefect/manifests.py +2 -1
- prefect/records/__init__.py +1 -0
- prefect/records/result_store.py +42 -0
- prefect/records/store.py +9 -0
- prefect/results.py +43 -39
- prefect/runner/runner.py +9 -9
- prefect/runner/server.py +6 -10
- prefect/runner/storage.py +3 -8
- prefect/runner/submit.py +2 -2
- prefect/runner/utils.py +2 -2
- prefect/serializers.py +24 -35
- prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
- prefect/settings.py +70 -133
- prefect/states.py +17 -47
- prefect/task_engine.py +697 -58
- prefect/task_runners.py +269 -301
- prefect/task_server.py +53 -34
- prefect/tasks.py +327 -337
- prefect/transactions.py +220 -0
- prefect/types/__init__.py +61 -82
- prefect/utilities/asyncutils.py +195 -136
- prefect/utilities/callables.py +121 -41
- prefect/utilities/collections.py +23 -38
- prefect/utilities/dispatch.py +11 -3
- prefect/utilities/dockerutils.py +4 -0
- prefect/utilities/engine.py +140 -20
- prefect/utilities/importtools.py +26 -27
- prefect/utilities/pydantic.py +128 -38
- prefect/utilities/schema_tools/hydration.py +5 -1
- prefect/utilities/templating.py +12 -2
- prefect/variables.py +78 -61
- prefect/workers/__init__.py +0 -1
- prefect/workers/base.py +15 -17
- prefect/workers/process.py +3 -8
- prefect/workers/server.py +2 -2
- {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/METADATA +22 -21
- prefect_client-3.0.0rc1.dist-info/RECORD +176 -0
- 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/__init__.py +0 -0
- 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/__init__.py +0 -0
- 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/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/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/agent.py +0 -698
- prefect/deployments/deployments.py +0 -1042
- 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/base.py +0 -323
- prefect/infrastructure/container.py +0 -818
- prefect/infrastructure/kubernetes.py +0 -920
- prefect/infrastructure/process.py +0 -289
- 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/workers/block.py +0 -218
- prefect_client-2.19.3.dist-info/RECORD +0 -292
- {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/LICENSE +0 -0
- {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/WHEEL +0 -0
- {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/top_level.txt +0 -0
prefect/blocks/fields.py
CHANGED
@@ -1,58 +1,3 @@
|
|
1
|
-
from
|
1
|
+
from prefect.types import SecretDict
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
if HAS_PYDANTIC_V2:
|
6
|
-
from pydantic.v1 import SecretField
|
7
|
-
from pydantic.v1.utils import update_not_none
|
8
|
-
from pydantic.v1.validators import dict_validator
|
9
|
-
|
10
|
-
if TYPE_CHECKING:
|
11
|
-
from pydantic.v1.typing import CallableGenerator
|
12
|
-
|
13
|
-
else:
|
14
|
-
from pydantic import SecretField
|
15
|
-
from pydantic.utils import update_not_none
|
16
|
-
from pydantic.validators import dict_validator
|
17
|
-
|
18
|
-
if TYPE_CHECKING:
|
19
|
-
from pydantic.typing import CallableGenerator
|
20
|
-
|
21
|
-
|
22
|
-
class SecretDict(SecretField):
|
23
|
-
@classmethod
|
24
|
-
def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None:
|
25
|
-
update_not_none(
|
26
|
-
field_schema,
|
27
|
-
type="object",
|
28
|
-
)
|
29
|
-
|
30
|
-
@classmethod
|
31
|
-
def __get_validators__(cls) -> "CallableGenerator":
|
32
|
-
yield cls.validate
|
33
|
-
|
34
|
-
@classmethod
|
35
|
-
def validate(cls, value: Any) -> "SecretDict":
|
36
|
-
if isinstance(value, cls):
|
37
|
-
return value
|
38
|
-
value = dict_validator(value)
|
39
|
-
return cls(value)
|
40
|
-
|
41
|
-
def __init__(self, value: Dict[str, Any]):
|
42
|
-
self._secret_value = value
|
43
|
-
|
44
|
-
def __str__(self) -> str:
|
45
|
-
return (
|
46
|
-
str({key: "**********" for key in self.get_secret_value().keys()})
|
47
|
-
if self.get_secret_value()
|
48
|
-
else ""
|
49
|
-
)
|
50
|
-
|
51
|
-
def __repr__(self) -> str:
|
52
|
-
return f"SecretDict('{self}')"
|
53
|
-
|
54
|
-
def get_secret_value(self) -> Dict[str, Any]:
|
55
|
-
return self._secret_value
|
56
|
-
|
57
|
-
def dict(self) -> Dict:
|
58
|
-
return {key: "**********" for key in self.get_secret_value().keys()}
|
3
|
+
__all__ = ["SecretDict"]
|
prefect/blocks/kubernetes.py
CHANGED
@@ -1,19 +1,12 @@
|
|
1
1
|
from pathlib import Path
|
2
|
-
from typing import TYPE_CHECKING, Dict, Type
|
2
|
+
from typing import TYPE_CHECKING, Dict, Optional, Type
|
3
3
|
|
4
4
|
import yaml
|
5
|
+
from pydantic import Field, field_validator
|
6
|
+
from typing_extensions import Self
|
5
7
|
|
6
8
|
from prefect._internal.compatibility.deprecated import deprecated_class
|
7
|
-
from prefect._internal.pydantic import HAS_PYDANTIC_V2
|
8
9
|
from prefect._internal.schemas.validators import validate_yaml
|
9
|
-
|
10
|
-
if HAS_PYDANTIC_V2:
|
11
|
-
from pydantic.v1 import Field, validator
|
12
|
-
else:
|
13
|
-
from pydantic import Field, validator
|
14
|
-
|
15
|
-
from typing_extensions import Self
|
16
|
-
|
17
10
|
from prefect.blocks.core import Block
|
18
11
|
from prefect.utilities.collections import listrepr
|
19
12
|
from prefect.utilities.importtools import lazy_import
|
@@ -59,12 +52,15 @@ class KubernetesClusterConfig(Block):
|
|
59
52
|
default=..., description="The name of the kubectl context to use."
|
60
53
|
)
|
61
54
|
|
62
|
-
@
|
55
|
+
@field_validator("config", mode="before")
|
56
|
+
@classmethod
|
63
57
|
def parse_yaml_config(cls, value):
|
64
58
|
return validate_yaml(value)
|
65
59
|
|
66
60
|
@classmethod
|
67
|
-
def from_file(
|
61
|
+
def from_file(
|
62
|
+
cls: Type[Self], path: Optional[Path] = None, context_name: Optional[str] = None
|
63
|
+
) -> Self:
|
68
64
|
"""
|
69
65
|
Create a cluster config from the a Kubernetes config file.
|
70
66
|
|
prefect/blocks/notifications.py
CHANGED
@@ -2,19 +2,12 @@ import logging
|
|
2
2
|
from abc import ABC
|
3
3
|
from typing import Dict, List, Optional
|
4
4
|
|
5
|
-
from
|
6
|
-
from prefect.logging import LogEavesdropper
|
7
|
-
|
8
|
-
if HAS_PYDANTIC_V2:
|
9
|
-
from pydantic.v1 import AnyHttpUrl, Field, SecretStr
|
10
|
-
else:
|
11
|
-
from pydantic import AnyHttpUrl, Field, SecretStr
|
12
|
-
|
5
|
+
from pydantic import AnyHttpUrl, Field, SecretStr
|
13
6
|
from typing_extensions import Literal
|
14
7
|
|
15
8
|
from prefect.blocks.abstract import NotificationBlock, NotificationError
|
16
|
-
from prefect.
|
17
|
-
from prefect.
|
9
|
+
from prefect.logging import LogEavesdropper
|
10
|
+
from prefect.types import SecretDict
|
18
11
|
from prefect.utilities.asyncutils import sync_compatible
|
19
12
|
from prefect.utilities.templating import apply_values, find_placeholders
|
20
13
|
|
@@ -62,7 +55,6 @@ class AbstractAppriseNotificationBlock(NotificationBlock, ABC):
|
|
62
55
|
self._start_apprise_client(self.url)
|
63
56
|
|
64
57
|
@sync_compatible
|
65
|
-
@instrument_instance_method_call
|
66
58
|
async def notify(
|
67
59
|
self,
|
68
60
|
body: str,
|
@@ -235,7 +227,12 @@ class PagerDutyWebHook(AbstractAppriseNotificationBlock):
|
|
235
227
|
)
|
236
228
|
|
237
229
|
def block_initialization(self) -> None:
|
238
|
-
|
230
|
+
try:
|
231
|
+
# Try importing for apprise>=1.18.0
|
232
|
+
from apprise.plugins.pagerduty import NotifyPagerDuty
|
233
|
+
except ImportError:
|
234
|
+
# Fallback for versions apprise<1.18.0
|
235
|
+
from apprise.plugins.NotifyPagerDuty import NotifyPagerDuty
|
239
236
|
|
240
237
|
url = SecretStr(
|
241
238
|
NotifyPagerDuty(
|
@@ -303,8 +300,12 @@ class TwilioSMS(AbstractAppriseNotificationBlock):
|
|
303
300
|
)
|
304
301
|
|
305
302
|
def block_initialization(self) -> None:
|
306
|
-
|
307
|
-
|
303
|
+
try:
|
304
|
+
# Try importing for apprise>=1.18.0
|
305
|
+
from apprise.plugins.twilio import NotifyTwilio
|
306
|
+
except ImportError:
|
307
|
+
# Fallback for versions apprise<1.18.0
|
308
|
+
from apprise.plugins.NotifyTwilio import NotifyTwilio
|
308
309
|
url = SecretStr(
|
309
310
|
NotifyTwilio(
|
310
311
|
account_sid=self.account_sid,
|
@@ -378,7 +379,7 @@ class OpsgenieWebhook(AbstractAppriseNotificationBlock):
|
|
378
379
|
examples=['["tag1", "tag2"]'],
|
379
380
|
)
|
380
381
|
|
381
|
-
priority: Optional[
|
382
|
+
priority: Optional[int] = Field(
|
382
383
|
default=3,
|
383
384
|
description=(
|
384
385
|
"The priority to associate with the message. It is on a scale between 1"
|
@@ -401,7 +402,12 @@ class OpsgenieWebhook(AbstractAppriseNotificationBlock):
|
|
401
402
|
)
|
402
403
|
|
403
404
|
def block_initialization(self) -> None:
|
404
|
-
|
405
|
+
try:
|
406
|
+
# Try importing for apprise>=1.18.0
|
407
|
+
from apprise.plugins.opsgenie import NotifyOpsgenie
|
408
|
+
except ImportError:
|
409
|
+
# Fallback for versions apprise<1.18.0
|
410
|
+
from apprise.plugins.NotifyOpsgenie import NotifyOpsgenie
|
405
411
|
|
406
412
|
targets = []
|
407
413
|
if self.target_user:
|
@@ -489,7 +495,12 @@ class MattermostWebhook(AbstractAppriseNotificationBlock):
|
|
489
495
|
)
|
490
496
|
|
491
497
|
def block_initialization(self) -> None:
|
492
|
-
|
498
|
+
try:
|
499
|
+
# Try importing for apprise>=1.18.0
|
500
|
+
from apprise.plugins.mattermost import NotifyMattermost
|
501
|
+
except ImportError:
|
502
|
+
# Fallback for versions apprise<1.18.0
|
503
|
+
from apprise.plugins.NotifyMattermost import NotifyMattermost
|
493
504
|
|
494
505
|
url = SecretStr(
|
495
506
|
NotifyMattermost(
|
@@ -582,7 +593,12 @@ class DiscordWebhook(AbstractAppriseNotificationBlock):
|
|
582
593
|
)
|
583
594
|
|
584
595
|
def block_initialization(self) -> None:
|
585
|
-
|
596
|
+
try:
|
597
|
+
# Try importing for apprise>=1.18.0
|
598
|
+
from apprise.plugins.discord import NotifyDiscord
|
599
|
+
except ImportError:
|
600
|
+
# Fallback for versions apprise<1.18.0
|
601
|
+
from apprise.plugins.NotifyDiscord import NotifyDiscord
|
586
602
|
|
587
603
|
url = SecretStr(
|
588
604
|
NotifyDiscord(
|
@@ -717,7 +733,6 @@ class CustomWebhookNotificationBlock(NotificationBlock):
|
|
717
733
|
raise KeyError(f"{name}/{placeholder}")
|
718
734
|
|
719
735
|
@sync_compatible
|
720
|
-
@instrument_instance_method_call
|
721
736
|
async def notify(self, body: str, subject: Optional[str] = None):
|
722
737
|
import httpx
|
723
738
|
|
@@ -773,7 +788,12 @@ class SendgridEmail(AbstractAppriseNotificationBlock):
|
|
773
788
|
)
|
774
789
|
|
775
790
|
def block_initialization(self) -> None:
|
776
|
-
|
791
|
+
try:
|
792
|
+
# Try importing for apprise>=1.18.0
|
793
|
+
from apprise.plugins.sendgrid import NotifySendGrid
|
794
|
+
except ImportError:
|
795
|
+
# Fallback for versions apprise<1.18.0
|
796
|
+
from apprise.plugins.NotifySendGrid import NotifySendGrid
|
777
797
|
|
778
798
|
url = SecretStr(
|
779
799
|
NotifySendGrid(
|
prefect/blocks/system.py
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
from typing import Any
|
2
2
|
|
3
|
-
from
|
3
|
+
from pydantic import Field, SecretStr
|
4
|
+
from pydantic_extra_types.pendulum_dt import DateTime
|
4
5
|
|
5
|
-
|
6
|
-
from pydantic.v1 import Field, SecretStr
|
7
|
-
else:
|
8
|
-
from pydantic import Field, SecretStr
|
9
|
-
|
10
|
-
from prefect._internal.schemas.fields import DateTimeTZ
|
6
|
+
from prefect._internal.compatibility.deprecated import deprecated_class
|
11
7
|
from prefect.blocks.core import Block
|
12
8
|
|
13
9
|
|
10
|
+
@deprecated_class(
|
11
|
+
start_date="Jun 2024",
|
12
|
+
end_date="Jun 2025",
|
13
|
+
help="Use Variables to store json data instead.",
|
14
|
+
)
|
14
15
|
class JSON(Block):
|
15
16
|
"""
|
16
|
-
A block that represents JSON
|
17
|
+
A block that represents JSON. Deprecated, please use Variables to store JSON data instead.
|
17
18
|
|
18
19
|
Attributes:
|
19
20
|
value: A JSON-compatible value.
|
@@ -33,9 +34,14 @@ class JSON(Block):
|
|
33
34
|
value: Any = Field(default=..., description="A JSON-compatible value.")
|
34
35
|
|
35
36
|
|
37
|
+
@deprecated_class(
|
38
|
+
start_date="Jun 2024",
|
39
|
+
end_date="Jun 2025",
|
40
|
+
help="Use Variables to store string data instead.",
|
41
|
+
)
|
36
42
|
class String(Block):
|
37
43
|
"""
|
38
|
-
A block that represents a string
|
44
|
+
A block that represents a string. Deprecated, please use Variables to store string data instead.
|
39
45
|
|
40
46
|
Attributes:
|
41
47
|
value: A string value.
|
@@ -55,9 +61,14 @@ class String(Block):
|
|
55
61
|
value: str = Field(default=..., description="A string value.")
|
56
62
|
|
57
63
|
|
64
|
+
@deprecated_class(
|
65
|
+
start_date="Jun 2024",
|
66
|
+
end_date="Jun 2025",
|
67
|
+
help="Use Variables to store datetime data instead.",
|
68
|
+
)
|
58
69
|
class DateTime(Block):
|
59
70
|
"""
|
60
|
-
A block that represents a datetime
|
71
|
+
A block that represents a datetime. Deprecated, please use Variables to store datetime data instead.
|
61
72
|
|
62
73
|
Attributes:
|
63
74
|
value: An ISO 8601-compatible datetime value.
|
@@ -75,7 +86,7 @@ class DateTime(Block):
|
|
75
86
|
_logo_url = "https://cdn.sanity.io/images/3ugk85nk/production/8b3da9a6621e92108b8e6a75b82e15374e170ff7-48x48.png"
|
76
87
|
_documentation_url = "https://docs.prefect.io/api-ref/prefect/blocks/system/#prefect.blocks.system.DateTime"
|
77
88
|
|
78
|
-
value:
|
89
|
+
value: DateTime = Field(
|
79
90
|
default=...,
|
80
91
|
description="An ISO 8601-compatible datetime value.",
|
81
92
|
)
|
prefect/blocks/webhook.py
CHANGED
@@ -1,18 +1,11 @@
|
|
1
1
|
from typing import Optional
|
2
2
|
|
3
3
|
from httpx import AsyncClient, AsyncHTTPTransport, Response
|
4
|
-
|
5
|
-
from prefect._internal.pydantic import HAS_PYDANTIC_V2
|
6
|
-
|
7
|
-
if HAS_PYDANTIC_V2:
|
8
|
-
from pydantic.v1 import Field, SecretStr
|
9
|
-
else:
|
10
|
-
from pydantic import Field, SecretStr
|
11
|
-
|
4
|
+
from pydantic import Field, SecretStr
|
12
5
|
from typing_extensions import Literal
|
13
6
|
|
14
7
|
from prefect.blocks.core import Block
|
15
|
-
from prefect.
|
8
|
+
from prefect.types import SecretDict
|
16
9
|
|
17
10
|
# Use a global HTTP transport to maintain a process-wide connection pool for
|
18
11
|
# interservice requests
|
prefect/client/base.py
CHANGED
@@ -25,8 +25,8 @@ import anyio
|
|
25
25
|
import httpx
|
26
26
|
from asgi_lifespan import LifespanManager
|
27
27
|
from httpx import HTTPStatusError, Request, Response
|
28
|
-
from
|
29
|
-
from
|
28
|
+
from starlette import status
|
29
|
+
from starlette.testclient import TestClient
|
30
30
|
from typing_extensions import Self
|
31
31
|
|
32
32
|
import prefect
|
@@ -390,7 +390,7 @@ class PrefectHttpxAsyncClient(httpx.AsyncClient):
|
|
390
390
|
|
391
391
|
raise
|
392
392
|
|
393
|
-
token: CsrfToken = CsrfToken.
|
393
|
+
token: CsrfToken = CsrfToken.model_validate(token_response.json())
|
394
394
|
self.csrf_token = token.token
|
395
395
|
self.csrf_token_expiration = token.expiration
|
396
396
|
|
@@ -604,7 +604,7 @@ class PrefectHttpxSyncClient(httpx.Client):
|
|
604
604
|
|
605
605
|
raise
|
606
606
|
|
607
|
-
token: CsrfToken = CsrfToken.
|
607
|
+
token: CsrfToken = CsrfToken.model_validate(token_response.json())
|
608
608
|
self.csrf_token = token.token
|
609
609
|
self.csrf_token_expiration = token.expiration
|
610
610
|
|
prefect/client/cloud.py
CHANGED
@@ -3,21 +3,14 @@ from typing import Any, Dict, List, Optional
|
|
3
3
|
|
4
4
|
import anyio
|
5
5
|
import httpx
|
6
|
-
|
7
|
-
from
|
8
|
-
|
9
|
-
if HAS_PYDANTIC_V2:
|
10
|
-
import pydantic.v1 as pydantic
|
11
|
-
else:
|
12
|
-
import pydantic
|
13
|
-
|
14
|
-
from prefect._vendor.starlette import status
|
6
|
+
import pydantic
|
7
|
+
from starlette import status
|
15
8
|
|
16
9
|
import prefect.context
|
17
10
|
import prefect.settings
|
18
11
|
from prefect.client.base import PrefectHttpxAsyncClient
|
19
12
|
from prefect.client.schemas import Workspace
|
20
|
-
from prefect.exceptions import PrefectException
|
13
|
+
from prefect.exceptions import ObjectNotFound, PrefectException
|
21
14
|
from prefect.settings import (
|
22
15
|
PREFECT_API_KEY,
|
23
16
|
PREFECT_CLOUD_API_URL,
|
@@ -87,8 +80,8 @@ class CloudClient:
|
|
87
80
|
await self.read_workspaces()
|
88
81
|
|
89
82
|
async def read_workspaces(self) -> List[Workspace]:
|
90
|
-
workspaces = pydantic.
|
91
|
-
|
83
|
+
workspaces = pydantic.TypeAdapter(List[Workspace]).validate_python(
|
84
|
+
await self.get("/me/workspaces")
|
92
85
|
)
|
93
86
|
return workspaces
|
94
87
|
|
@@ -128,8 +121,10 @@ class CloudClient:
|
|
128
121
|
status.HTTP_403_FORBIDDEN,
|
129
122
|
):
|
130
123
|
raise CloudUnauthorizedError
|
124
|
+
elif exc.response.status_code == status.HTTP_404_NOT_FOUND:
|
125
|
+
raise ObjectNotFound(http_exc=exc) from exc
|
131
126
|
else:
|
132
|
-
raise
|
127
|
+
raise
|
133
128
|
|
134
129
|
if res.status_code == status.HTTP_204_NO_CONTENT:
|
135
130
|
return
|