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.
Files changed (239) hide show
  1. prefect/__init__.py +8 -56
  2. prefect/_internal/compatibility/deprecated.py +6 -115
  3. prefect/_internal/compatibility/experimental.py +4 -79
  4. prefect/_internal/concurrency/api.py +0 -34
  5. prefect/_internal/concurrency/calls.py +0 -6
  6. prefect/_internal/concurrency/cancellation.py +0 -3
  7. prefect/_internal/concurrency/event_loop.py +0 -20
  8. prefect/_internal/concurrency/inspection.py +3 -3
  9. prefect/_internal/concurrency/threads.py +35 -0
  10. prefect/_internal/concurrency/waiters.py +0 -28
  11. prefect/_internal/pydantic/__init__.py +0 -45
  12. prefect/_internal/pydantic/v1_schema.py +21 -22
  13. prefect/_internal/pydantic/v2_schema.py +0 -2
  14. prefect/_internal/pydantic/v2_validated_func.py +18 -23
  15. prefect/_internal/schemas/bases.py +44 -177
  16. prefect/_internal/schemas/fields.py +1 -43
  17. prefect/_internal/schemas/validators.py +60 -158
  18. prefect/artifacts.py +161 -14
  19. prefect/automations.py +39 -4
  20. prefect/blocks/abstract.py +1 -1
  21. prefect/blocks/core.py +268 -148
  22. prefect/blocks/fields.py +2 -57
  23. prefect/blocks/kubernetes.py +8 -12
  24. prefect/blocks/notifications.py +40 -20
  25. prefect/blocks/system.py +22 -11
  26. prefect/blocks/webhook.py +2 -9
  27. prefect/client/base.py +4 -4
  28. prefect/client/cloud.py +8 -13
  29. prefect/client/orchestration.py +347 -341
  30. prefect/client/schemas/actions.py +92 -86
  31. prefect/client/schemas/filters.py +20 -40
  32. prefect/client/schemas/objects.py +147 -145
  33. prefect/client/schemas/responses.py +16 -24
  34. prefect/client/schemas/schedules.py +47 -35
  35. prefect/client/subscriptions.py +2 -2
  36. prefect/client/utilities.py +5 -2
  37. prefect/concurrency/asyncio.py +3 -1
  38. prefect/concurrency/events.py +1 -1
  39. prefect/concurrency/services.py +6 -3
  40. prefect/context.py +195 -27
  41. prefect/deployments/__init__.py +5 -6
  42. prefect/deployments/base.py +7 -5
  43. prefect/deployments/flow_runs.py +185 -0
  44. prefect/deployments/runner.py +50 -45
  45. prefect/deployments/schedules.py +28 -23
  46. prefect/deployments/steps/__init__.py +0 -1
  47. prefect/deployments/steps/core.py +1 -0
  48. prefect/deployments/steps/pull.py +7 -21
  49. prefect/engine.py +12 -2422
  50. prefect/events/actions.py +17 -23
  51. prefect/events/cli/automations.py +19 -6
  52. prefect/events/clients.py +14 -37
  53. prefect/events/filters.py +14 -18
  54. prefect/events/related.py +2 -2
  55. prefect/events/schemas/__init__.py +0 -5
  56. prefect/events/schemas/automations.py +55 -46
  57. prefect/events/schemas/deployment_triggers.py +7 -197
  58. prefect/events/schemas/events.py +34 -65
  59. prefect/events/schemas/labelling.py +10 -14
  60. prefect/events/utilities.py +2 -3
  61. prefect/events/worker.py +2 -3
  62. prefect/filesystems.py +6 -517
  63. prefect/{new_flow_engine.py → flow_engine.py} +313 -72
  64. prefect/flow_runs.py +377 -5
  65. prefect/flows.py +248 -165
  66. prefect/futures.py +186 -345
  67. prefect/infrastructure/__init__.py +0 -27
  68. prefect/infrastructure/provisioners/__init__.py +5 -3
  69. prefect/infrastructure/provisioners/cloud_run.py +11 -6
  70. prefect/infrastructure/provisioners/container_instance.py +11 -7
  71. prefect/infrastructure/provisioners/ecs.py +6 -4
  72. prefect/infrastructure/provisioners/modal.py +8 -5
  73. prefect/input/actions.py +2 -4
  74. prefect/input/run_input.py +5 -7
  75. prefect/logging/formatters.py +0 -2
  76. prefect/logging/handlers.py +3 -11
  77. prefect/logging/loggers.py +2 -2
  78. prefect/manifests.py +2 -1
  79. prefect/records/__init__.py +1 -0
  80. prefect/records/result_store.py +42 -0
  81. prefect/records/store.py +9 -0
  82. prefect/results.py +43 -39
  83. prefect/runner/runner.py +9 -9
  84. prefect/runner/server.py +6 -10
  85. prefect/runner/storage.py +3 -8
  86. prefect/runner/submit.py +2 -2
  87. prefect/runner/utils.py +2 -2
  88. prefect/serializers.py +24 -35
  89. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  90. prefect/settings.py +70 -133
  91. prefect/states.py +17 -47
  92. prefect/task_engine.py +697 -58
  93. prefect/task_runners.py +269 -301
  94. prefect/task_server.py +53 -34
  95. prefect/tasks.py +327 -337
  96. prefect/transactions.py +220 -0
  97. prefect/types/__init__.py +61 -82
  98. prefect/utilities/asyncutils.py +195 -136
  99. prefect/utilities/callables.py +121 -41
  100. prefect/utilities/collections.py +23 -38
  101. prefect/utilities/dispatch.py +11 -3
  102. prefect/utilities/dockerutils.py +4 -0
  103. prefect/utilities/engine.py +140 -20
  104. prefect/utilities/importtools.py +26 -27
  105. prefect/utilities/pydantic.py +128 -38
  106. prefect/utilities/schema_tools/hydration.py +5 -1
  107. prefect/utilities/templating.py +12 -2
  108. prefect/variables.py +78 -61
  109. prefect/workers/__init__.py +0 -1
  110. prefect/workers/base.py +15 -17
  111. prefect/workers/process.py +3 -8
  112. prefect/workers/server.py +2 -2
  113. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/METADATA +22 -21
  114. prefect_client-3.0.0rc1.dist-info/RECORD +176 -0
  115. prefect/_internal/pydantic/_base_model.py +0 -51
  116. prefect/_internal/pydantic/_compat.py +0 -82
  117. prefect/_internal/pydantic/_flags.py +0 -20
  118. prefect/_internal/pydantic/_types.py +0 -8
  119. prefect/_internal/pydantic/utilities/__init__.py +0 -0
  120. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  121. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  122. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  123. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  124. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  125. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  126. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  127. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  128. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  129. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  130. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  131. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  132. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  133. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  134. prefect/_vendor/__init__.py +0 -0
  135. prefect/_vendor/fastapi/__init__.py +0 -25
  136. prefect/_vendor/fastapi/applications.py +0 -946
  137. prefect/_vendor/fastapi/background.py +0 -3
  138. prefect/_vendor/fastapi/concurrency.py +0 -44
  139. prefect/_vendor/fastapi/datastructures.py +0 -58
  140. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  141. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  142. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  143. prefect/_vendor/fastapi/encoders.py +0 -177
  144. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  145. prefect/_vendor/fastapi/exceptions.py +0 -46
  146. prefect/_vendor/fastapi/logger.py +0 -3
  147. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  148. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  149. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  150. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  151. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  152. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  153. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  154. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  155. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  156. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  157. prefect/_vendor/fastapi/openapi/models.py +0 -480
  158. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  159. prefect/_vendor/fastapi/param_functions.py +0 -340
  160. prefect/_vendor/fastapi/params.py +0 -453
  161. prefect/_vendor/fastapi/requests.py +0 -4
  162. prefect/_vendor/fastapi/responses.py +0 -40
  163. prefect/_vendor/fastapi/routing.py +0 -1331
  164. prefect/_vendor/fastapi/security/__init__.py +0 -15
  165. prefect/_vendor/fastapi/security/api_key.py +0 -98
  166. prefect/_vendor/fastapi/security/base.py +0 -6
  167. prefect/_vendor/fastapi/security/http.py +0 -172
  168. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  169. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  170. prefect/_vendor/fastapi/security/utils.py +0 -10
  171. prefect/_vendor/fastapi/staticfiles.py +0 -1
  172. prefect/_vendor/fastapi/templating.py +0 -3
  173. prefect/_vendor/fastapi/testclient.py +0 -1
  174. prefect/_vendor/fastapi/types.py +0 -3
  175. prefect/_vendor/fastapi/utils.py +0 -235
  176. prefect/_vendor/fastapi/websockets.py +0 -7
  177. prefect/_vendor/starlette/__init__.py +0 -1
  178. prefect/_vendor/starlette/_compat.py +0 -28
  179. prefect/_vendor/starlette/_exception_handler.py +0 -80
  180. prefect/_vendor/starlette/_utils.py +0 -88
  181. prefect/_vendor/starlette/applications.py +0 -261
  182. prefect/_vendor/starlette/authentication.py +0 -159
  183. prefect/_vendor/starlette/background.py +0 -43
  184. prefect/_vendor/starlette/concurrency.py +0 -59
  185. prefect/_vendor/starlette/config.py +0 -151
  186. prefect/_vendor/starlette/convertors.py +0 -87
  187. prefect/_vendor/starlette/datastructures.py +0 -707
  188. prefect/_vendor/starlette/endpoints.py +0 -130
  189. prefect/_vendor/starlette/exceptions.py +0 -60
  190. prefect/_vendor/starlette/formparsers.py +0 -276
  191. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  192. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  193. prefect/_vendor/starlette/middleware/base.py +0 -220
  194. prefect/_vendor/starlette/middleware/cors.py +0 -176
  195. prefect/_vendor/starlette/middleware/errors.py +0 -265
  196. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  197. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  198. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  199. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  200. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  201. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  202. prefect/_vendor/starlette/requests.py +0 -328
  203. prefect/_vendor/starlette/responses.py +0 -347
  204. prefect/_vendor/starlette/routing.py +0 -933
  205. prefect/_vendor/starlette/schemas.py +0 -154
  206. prefect/_vendor/starlette/staticfiles.py +0 -248
  207. prefect/_vendor/starlette/status.py +0 -199
  208. prefect/_vendor/starlette/templating.py +0 -231
  209. prefect/_vendor/starlette/testclient.py +0 -804
  210. prefect/_vendor/starlette/types.py +0 -30
  211. prefect/_vendor/starlette/websockets.py +0 -193
  212. prefect/agent.py +0 -698
  213. prefect/deployments/deployments.py +0 -1042
  214. prefect/deprecated/__init__.py +0 -0
  215. prefect/deprecated/data_documents.py +0 -350
  216. prefect/deprecated/packaging/__init__.py +0 -12
  217. prefect/deprecated/packaging/base.py +0 -96
  218. prefect/deprecated/packaging/docker.py +0 -146
  219. prefect/deprecated/packaging/file.py +0 -92
  220. prefect/deprecated/packaging/orion.py +0 -80
  221. prefect/deprecated/packaging/serializers.py +0 -171
  222. prefect/events/instrument.py +0 -135
  223. prefect/infrastructure/base.py +0 -323
  224. prefect/infrastructure/container.py +0 -818
  225. prefect/infrastructure/kubernetes.py +0 -920
  226. prefect/infrastructure/process.py +0 -289
  227. prefect/new_task_engine.py +0 -423
  228. prefect/pydantic/__init__.py +0 -76
  229. prefect/pydantic/main.py +0 -39
  230. prefect/software/__init__.py +0 -2
  231. prefect/software/base.py +0 -50
  232. prefect/software/conda.py +0 -199
  233. prefect/software/pip.py +0 -122
  234. prefect/software/python.py +0 -52
  235. prefect/workers/block.py +0 -218
  236. prefect_client-2.19.3.dist-info/RECORD +0 -292
  237. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/LICENSE +0 -0
  238. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/WHEEL +0 -0
  239. {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 typing import TYPE_CHECKING, Any, Dict
1
+ from prefect.types import SecretDict
2
2
 
3
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
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"]
@@ -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
- @validator("config", pre=True)
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(cls: Type[Self], path: Path = None, context_name: str = None) -> Self:
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
 
@@ -2,19 +2,12 @@ import logging
2
2
  from abc import ABC
3
3
  from typing import Dict, List, Optional
4
4
 
5
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
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.blocks.fields import SecretDict
17
- from prefect.events.instrument import instrument_instance_method_call
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
- from apprise.plugins.pagerduty import NotifyPagerDuty
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
- from apprise.plugins.twilio import NotifyTwilio
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[str] = Field(
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
- from apprise.plugins.opsgenie import NotifyOpsgenie
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
- from apprise.plugins.mattermost import NotifyMattermost
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
- from apprise.plugins.discord import NotifyDiscord
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
- from apprise.plugins.sendgrid import NotifySendGrid
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 prefect._internal.pydantic import HAS_PYDANTIC_V2
3
+ from pydantic import Field, SecretStr
4
+ from pydantic_extra_types.pendulum_dt import DateTime
4
5
 
5
- if HAS_PYDANTIC_V2:
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: DateTimeTZ = Field(
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.blocks.fields import SecretDict
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 prefect._vendor.starlette import status
29
- from prefect._vendor.starlette.testclient import TestClient
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.parse_obj(token_response.json())
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.parse_obj(token_response.json())
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 prefect._internal.pydantic import HAS_PYDANTIC_V2
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.parse_obj_as(
91
- List[Workspace], await self.get("/me/workspaces")
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 exc
127
+ raise
133
128
 
134
129
  if res.status_code == status.HTTP_204_NO_CONTENT:
135
130
  return