prefect-client 2.19.2__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 +151 -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 +307 -166
  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 +19 -15
  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 +311 -43
  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 +97 -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.2.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.2.dist-info/RECORD +0 -292
  237. {prefect_client-2.19.2.dist-info → prefect_client-3.0.0rc1.dist-info}/LICENSE +0 -0
  238. {prefect_client-2.19.2.dist-info → prefect_client-3.0.0rc1.dist-info}/WHEEL +0 -0
  239. {prefect_client-2.19.2.dist-info → prefect_client-3.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@ import tempfile
5
5
  from copy import deepcopy
6
6
  from pathlib import Path
7
7
  from textwrap import dedent
8
- from typing import Any, Dict, Optional
8
+ from typing import TYPE_CHECKING, Any, Dict, Optional
9
9
  from uuid import UUID
10
10
 
11
11
  from anyio import run_process
@@ -17,7 +17,7 @@ from rich.prompt import Confirm
17
17
  from rich.syntax import Syntax
18
18
 
19
19
  from prefect.cli._prompts import prompt, prompt_select_from_table
20
- from prefect.client.orchestration import PrefectClient, ServerType
20
+ from prefect.client.orchestration import ServerType
21
21
  from prefect.client.schemas.actions import BlockDocumentCreate
22
22
  from prefect.client.utilities import inject_client
23
23
  from prefect.exceptions import ObjectAlreadyExists
@@ -27,6 +27,9 @@ from prefect.settings import (
27
27
  update_current_profile,
28
28
  )
29
29
 
30
+ if TYPE_CHECKING:
31
+ from prefect.client.orchestration import PrefectClient
32
+
30
33
 
31
34
  class CloudRunPushProvisioner:
32
35
  def __init__(self):
@@ -215,7 +218,7 @@ class CloudRunPushProvisioner:
215
218
  ) from e
216
219
 
217
220
  async def _create_gcp_credentials_block(
218
- self, block_document_name: str, key: dict, client: PrefectClient
221
+ self, block_document_name: str, key: dict, client: "PrefectClient"
219
222
  ) -> UUID:
220
223
  credentials_block_type = await client.read_block_type_by_slug("gcp-credentials")
221
224
 
@@ -242,7 +245,9 @@ class CloudRunPushProvisioner:
242
245
  )
243
246
  return block_doc.id
244
247
 
245
- async def _create_provision_table(self, work_pool_name: str, client: PrefectClient):
248
+ async def _create_provision_table(
249
+ self, work_pool_name: str, client: "PrefectClient"
250
+ ):
246
251
  return Panel(
247
252
  dedent(
248
253
  f"""\
@@ -268,7 +273,7 @@ class CloudRunPushProvisioner:
268
273
  )
269
274
 
270
275
  async def _customize_resource_names(
271
- self, work_pool_name: str, client: PrefectClient
276
+ self, work_pool_name: str, client: "PrefectClient"
272
277
  ) -> bool:
273
278
  self._service_account_name = prompt(
274
279
  "Please enter a name for the service account",
@@ -294,7 +299,7 @@ class CloudRunPushProvisioner:
294
299
  self,
295
300
  work_pool_name: str,
296
301
  base_job_template: dict,
297
- client: Optional[PrefectClient] = None,
302
+ client: Optional["PrefectClient"] = None,
298
303
  ) -> Dict[str, Any]:
299
304
  assert client, "Client injection failed"
300
305
  await self._verify_gcloud_ready()
@@ -18,7 +18,7 @@ import subprocess
18
18
  import time
19
19
  from copy import deepcopy
20
20
  from textwrap import dedent
21
- from typing import Any, Dict, Optional
21
+ from typing import TYPE_CHECKING, Any, Dict, Optional
22
22
  from uuid import UUID
23
23
 
24
24
  from anyio import run_process
@@ -29,7 +29,6 @@ from rich.prompt import Confirm
29
29
  from rich.syntax import Syntax
30
30
 
31
31
  from prefect.cli._prompts import prompt, prompt_select_from_table
32
- from prefect.client.orchestration import PrefectClient
33
32
  from prefect.client.schemas.actions import BlockDocumentCreate
34
33
  from prefect.client.utilities import inject_client
35
34
  from prefect.exceptions import ObjectAlreadyExists, ObjectNotFound
@@ -38,6 +37,9 @@ from prefect.settings import (
38
37
  update_current_profile,
39
38
  )
40
39
 
40
+ if TYPE_CHECKING:
41
+ from prefect.client.orchestration import PrefectClient
42
+
41
43
 
42
44
  class AzureCLI:
43
45
  """
@@ -684,7 +686,7 @@ class ContainerInstancePushProvisioner:
684
686
  client_id: str,
685
687
  tenant_id: str,
686
688
  client_secret: str,
687
- client: PrefectClient,
689
+ client: "PrefectClient",
688
690
  ) -> UUID:
689
691
  """
690
692
  Creates a credentials block for Azure Container Instance.
@@ -755,7 +757,7 @@ class ContainerInstancePushProvisioner:
755
757
  raise e
756
758
 
757
759
  async def _aci_credentials_block_exists(
758
- self, block_name: str, client: PrefectClient
760
+ self, block_name: str, client: "PrefectClient"
759
761
  ) -> bool:
760
762
  """
761
763
  Checks if an ACI credentials block with the given name already exists.
@@ -782,7 +784,9 @@ class ContainerInstancePushProvisioner:
782
784
  else:
783
785
  return False
784
786
 
785
- async def _create_provision_table(self, work_pool_name: str, client: PrefectClient):
787
+ async def _create_provision_table(
788
+ self, work_pool_name: str, client: "PrefectClient"
789
+ ):
786
790
  return Panel(
787
791
  dedent(
788
792
  f"""\
@@ -809,7 +813,7 @@ class ContainerInstancePushProvisioner:
809
813
  )
810
814
 
811
815
  async def _customize_resource_names(
812
- self, work_pool_name: str, client: PrefectClient
816
+ self, work_pool_name: str, client: "PrefectClient"
813
817
  ) -> bool:
814
818
  self._resource_group_name = prompt(
815
819
  "Please enter a name for the resource group",
@@ -851,7 +855,7 @@ class ContainerInstancePushProvisioner:
851
855
  self,
852
856
  work_pool_name: str,
853
857
  base_job_template: Dict[str, Any],
854
- client: Optional[PrefectClient] = None,
858
+ client: Optional["PrefectClient"] = None,
855
859
  ) -> Dict[str, Any]:
856
860
  """
857
861
  Orchestrates the provisioning of Azure resources and setup for the push work pool.
@@ -9,7 +9,7 @@ import sys
9
9
  from copy import deepcopy
10
10
  from functools import partial
11
11
  from textwrap import dedent
12
- from typing import Any, Callable, Dict, List, Optional
12
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
13
13
 
14
14
  import anyio
15
15
  from anyio import run_process
@@ -20,7 +20,6 @@ from rich.prompt import Confirm
20
20
  from rich.syntax import Syntax
21
21
 
22
22
  from prefect.cli._prompts import prompt
23
- from prefect.client.orchestration import PrefectClient
24
23
  from prefect.client.schemas.actions import BlockDocumentCreate
25
24
  from prefect.client.utilities import inject_client
26
25
  from prefect.exceptions import ObjectNotFound
@@ -31,6 +30,9 @@ from prefect.settings import (
31
30
  from prefect.utilities.collections import get_from_dict
32
31
  from prefect.utilities.importtools import lazy_import
33
32
 
33
+ if TYPE_CHECKING:
34
+ from prefect.client.orchestration import PrefectClient
35
+
34
36
  boto3 = lazy_import("boto3")
35
37
 
36
38
  current_console = contextvars.ContextVar("console", default=Console())
@@ -250,7 +252,7 @@ class CredentialsBlockResource:
250
252
 
251
253
  @inject_client
252
254
  async def requires_provisioning(
253
- self, client: Optional[PrefectClient] = None
255
+ self, client: Optional["PrefectClient"] = None
254
256
  ) -> bool:
255
257
  if self._requires_provisioning is None:
256
258
  try:
@@ -280,7 +282,7 @@ class CredentialsBlockResource:
280
282
  self,
281
283
  base_job_template: Dict[str, Any],
282
284
  advance: Callable[[], None],
283
- client: Optional[PrefectClient] = None,
285
+ client: Optional["PrefectClient"] = None,
284
286
  ):
285
287
  """
286
288
  Provisions an AWS credentials block.
@@ -2,20 +2,23 @@ import importlib
2
2
  import shlex
3
3
  import sys
4
4
  from copy import deepcopy
5
- from typing import Any, Dict, Optional, Tuple
5
+ from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple
6
6
 
7
7
  from anyio import run_process
8
8
  from rich.console import Console
9
9
  from rich.progress import Progress, SpinnerColumn, TextColumn
10
10
  from rich.prompt import Confirm
11
11
 
12
- from prefect.client.orchestration import PrefectClient
13
12
  from prefect.client.schemas.actions import BlockDocumentCreate
14
13
  from prefect.client.schemas.objects import BlockDocument
15
14
  from prefect.client.utilities import inject_client
16
15
  from prefect.exceptions import ObjectNotFound
17
16
  from prefect.utilities.importtools import lazy_import
18
17
 
18
+ if TYPE_CHECKING:
19
+ from prefect.client.orchestration import PrefectClient
20
+
21
+
19
22
  modal = lazy_import("modal")
20
23
 
21
24
 
@@ -24,7 +27,7 @@ class ModalPushProvisioner:
24
27
  A infrastructure provisioner for Modal push work pools.
25
28
  """
26
29
 
27
- def __init__(self, client: Optional[PrefectClient] = None):
30
+ def __init__(self, client: Optional["PrefectClient"] = None):
28
31
  self._console = Console()
29
32
 
30
33
  @property
@@ -91,7 +94,7 @@ class ModalPushProvisioner:
91
94
  block_document_name: str,
92
95
  modal_token_id: str,
93
96
  modal_token_secret: str,
94
- client: PrefectClient,
97
+ client: "PrefectClient",
95
98
  ) -> BlockDocument:
96
99
  """
97
100
  Creates a ModalCredentials block containing the provided token ID and secret.
@@ -142,7 +145,7 @@ class ModalPushProvisioner:
142
145
  self,
143
146
  work_pool_name: str,
144
147
  base_job_template: Dict[str, Any],
145
- client: Optional[PrefectClient] = None,
148
+ client: Optional["PrefectClient"] = None,
146
149
  ) -> Dict[str, Any]:
147
150
  """
148
151
  Provisions resources necessary for a Modal push work pool.
prefect/input/actions.py CHANGED
@@ -4,7 +4,6 @@ from uuid import UUID
4
4
  import orjson
5
5
  import pydantic
6
6
 
7
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
8
7
  from prefect.client.utilities import client_injector
9
8
  from prefect.context import FlowRunContext
10
9
  from prefect.exceptions import PrefectHTTPStatusError
@@ -14,8 +13,7 @@ if TYPE_CHECKING:
14
13
  from prefect.client.orchestration import PrefectClient
15
14
 
16
15
 
17
- if HAS_PYDANTIC_V2:
18
- from prefect._internal.pydantic.v2_schema import is_v2_model
16
+ from prefect._internal.pydantic.v2_schema import is_v2_model
19
17
 
20
18
 
21
19
  def ensure_flow_run_id(flow_run_id: Optional[UUID] = None) -> UUID:
@@ -41,7 +39,7 @@ async def create_flow_run_input_from_model(
41
39
  if context is not None and context.flow_run is not None:
42
40
  sender = f"prefect.flow-run.{context.flow_run.id}"
43
41
 
44
- if HAS_PYDANTIC_V2 and is_v2_model(model_instance):
42
+ if is_v2_model(model_instance):
45
43
  json_safe = orjson.loads(model_instance.model_dump_json())
46
44
  else:
47
45
  json_safe = orjson.loads(model_instance.json())
@@ -77,8 +77,8 @@ from uuid import UUID, uuid4
77
77
 
78
78
  import anyio
79
79
  import pydantic
80
+ from pydantic import ConfigDict
80
81
 
81
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
82
82
  from prefect.input.actions import (
83
83
  create_flow_run_input,
84
84
  create_flow_run_input_from_model,
@@ -92,8 +92,7 @@ if TYPE_CHECKING:
92
92
  from prefect.client.schemas.objects import FlowRunInput
93
93
  from prefect.states import State
94
94
 
95
- if HAS_PYDANTIC_V2:
96
- from prefect._internal.pydantic.v2_schema import create_v2_schema
95
+ from prefect._internal.pydantic.v2_schema import create_v2_schema, is_v2_model
97
96
 
98
97
  R = TypeVar("R", bound="RunInput")
99
98
  T = TypeVar("T", bound="object")
@@ -138,13 +137,12 @@ def keyset_from_base_key(base_key: str) -> Keyset:
138
137
 
139
138
  class RunInputMetadata(pydantic.BaseModel):
140
139
  key: str
141
- sender: Optional[str]
140
+ sender: Optional[str] = None
142
141
  receiver: UUID
143
142
 
144
143
 
145
144
  class RunInput(pydantic.BaseModel):
146
- class Config:
147
- extra = "forbid"
145
+ model_config = ConfigDict(extra="forbid")
148
146
 
149
147
  _description: Optional[str] = pydantic.PrivateAttr(default=None)
150
148
  _metadata: RunInputMetadata = pydantic.PrivateAttr()
@@ -168,7 +166,7 @@ class RunInput(pydantic.BaseModel):
168
166
  - flow_run_id (UUID, optional): the flow run ID to save the input for
169
167
  """
170
168
 
171
- if HAS_PYDANTIC_V2:
169
+ if is_v2_model(cls):
172
170
  schema = create_v2_schema(cls.__name__, model_base=cls)
173
171
  else:
174
172
  schema = cls.schema(by_alias=True)
@@ -48,7 +48,6 @@ class JsonFormatter(logging.Formatter):
48
48
 
49
49
  self.serializer = JSONSerializer(
50
50
  jsonlib="orjson",
51
- object_encoder="pydantic.json.pydantic_encoder",
52
51
  dumps_kwargs={"option": orjson.OPT_INDENT_2} if fmt == "pretty" else {},
53
52
  )
54
53
 
@@ -98,7 +97,6 @@ class PrefectFormatter(logging.Formatter):
98
97
  init_kwargs["defaults"] = defaults
99
98
  style_kwargs["defaults"] = defaults
100
99
 
101
- # validate added in 3.8
102
100
  init_kwargs["validate"] = validate
103
101
 
104
102
  super().__init__(format, datefmt, style, **init_kwargs)
@@ -119,21 +119,13 @@ class APILogHandler(logging.Handler):
119
119
  return APILogWorker.drain_all(timeout=5)
120
120
 
121
121
  @classmethod
122
- def aflush(cls):
122
+ async def aflush(cls):
123
123
  """
124
124
  Tell the `APILogWorker` to send any currently enqueued logs and block until
125
125
  completion.
126
-
127
- If called in a synchronous context, will only block up to 5s before returning.
128
126
  """
129
127
 
130
- if not get_running_loop():
131
- raise RuntimeError(
132
- "`aflush` cannot be used from a synchronous context; use `flush`"
133
- " instead."
134
- )
135
-
136
- return APILogWorker.drain_all()
128
+ return await APILogWorker.drain_all()
137
129
 
138
130
  def emit(self, record: logging.LogRecord):
139
131
  """
@@ -229,7 +221,7 @@ class APILogHandler(logging.Handler):
229
221
  getattr(record, "created", None) or time.time()
230
222
  ),
231
223
  message=self.format(record),
232
- ).dict(json_compatible=True)
224
+ ).model_dump(mode="json")
233
225
 
234
226
  log_size = log["__payload_size__"] = self._get_payload_size(log)
235
227
  if log_size > PREFECT_LOGGING_TO_API_MAX_LOG_SIZE.value():
@@ -5,7 +5,7 @@ import warnings
5
5
  from builtins import print
6
6
  from contextlib import contextmanager
7
7
  from functools import lru_cache
8
- from logging import LogRecord
8
+ from logging import LoggerAdapter, LogRecord
9
9
  from typing import TYPE_CHECKING, Dict, List, Optional, Union
10
10
 
11
11
  from typing_extensions import Self
@@ -161,7 +161,7 @@ def flow_run_logger(
161
161
  flow_run: Union["FlowRun", "ClientFlowRun"],
162
162
  flow: Optional["Flow"] = None,
163
163
  **kwargs: str,
164
- ):
164
+ ) -> LoggerAdapter:
165
165
  """
166
166
  Create a flow run logger with the run's metadata attached.
167
167
 
prefect/manifests.py CHANGED
@@ -4,7 +4,8 @@ Manifests are portable descriptions of one or more workflows within a given dire
4
4
  They are the foundational building blocks for defining Flow Deployments.
5
5
  """
6
6
 
7
- from prefect.pydantic import BaseModel, Field
7
+ from pydantic import BaseModel, Field
8
+
8
9
  from prefect.utilities.callables import ParameterSchema
9
10
 
10
11
 
@@ -0,0 +1 @@
1
+ from .store import RecordStore
@@ -0,0 +1,42 @@
1
+ from dataclasses import dataclass
2
+ from typing import Any
3
+
4
+ from prefect.exceptions import ObjectNotFound
5
+ from prefect.results import BaseResult, PersistedResult, ResultFactory
6
+ from prefect.utilities.asyncutils import run_coro_as_sync
7
+
8
+ from .store import RecordStore
9
+
10
+
11
+ @dataclass
12
+ class ResultFactoryStore(RecordStore):
13
+ result_factory: ResultFactory
14
+ cache: PersistedResult = None
15
+
16
+ def exists(self, key: str) -> bool:
17
+ try:
18
+ result = self.read(key)
19
+ result.get(_sync=True)
20
+ self.cache = result
21
+ return True
22
+ except (ObjectNotFound, ValueError):
23
+ return False
24
+
25
+ def read(self, key: str) -> BaseResult:
26
+ if self.cache:
27
+ return self.cache
28
+ try:
29
+ result = PersistedResult(
30
+ serializer_type=self.result_factory.serializer.type,
31
+ storage_block_id=self.result_factory.storage_block_id,
32
+ storage_key=key,
33
+ )
34
+ return result
35
+ except Exception:
36
+ # this is a bit of a bandaid for functionality
37
+ raise ValueError("Result could not be read")
38
+
39
+ def write(self, key: str, value: Any) -> BaseResult:
40
+ if isinstance(value, BaseResult):
41
+ return value
42
+ return run_coro_as_sync(self.result_factory.create_result(obj=value, key=key))
@@ -0,0 +1,9 @@
1
+ class RecordStore:
2
+ def read(self, key: str):
3
+ raise NotImplementedError
4
+
5
+ def write(self, key: str, value: dict):
6
+ raise NotImplementedError
7
+
8
+ def exists(self, key: str) -> bool:
9
+ return False