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.
Files changed (288) hide show
  1. prefect/__init__.py +74 -110
  2. prefect/_internal/compatibility/deprecated.py +6 -115
  3. prefect/_internal/compatibility/experimental.py +4 -79
  4. prefect/_internal/compatibility/migration.py +166 -0
  5. prefect/_internal/concurrency/__init__.py +2 -2
  6. prefect/_internal/concurrency/api.py +1 -35
  7. prefect/_internal/concurrency/calls.py +0 -6
  8. prefect/_internal/concurrency/cancellation.py +0 -3
  9. prefect/_internal/concurrency/event_loop.py +0 -20
  10. prefect/_internal/concurrency/inspection.py +3 -3
  11. prefect/_internal/concurrency/primitives.py +1 -0
  12. prefect/_internal/concurrency/services.py +23 -0
  13. prefect/_internal/concurrency/threads.py +35 -0
  14. prefect/_internal/concurrency/waiters.py +0 -28
  15. prefect/_internal/integrations.py +7 -0
  16. prefect/_internal/pydantic/__init__.py +0 -45
  17. prefect/_internal/pydantic/annotations/pendulum.py +2 -2
  18. prefect/_internal/pydantic/v1_schema.py +21 -22
  19. prefect/_internal/pydantic/v2_schema.py +0 -2
  20. prefect/_internal/pydantic/v2_validated_func.py +18 -23
  21. prefect/_internal/pytz.py +1 -1
  22. prefect/_internal/retries.py +61 -0
  23. prefect/_internal/schemas/bases.py +45 -177
  24. prefect/_internal/schemas/fields.py +1 -43
  25. prefect/_internal/schemas/validators.py +47 -233
  26. prefect/agent.py +3 -695
  27. prefect/artifacts.py +173 -14
  28. prefect/automations.py +39 -4
  29. prefect/blocks/abstract.py +1 -1
  30. prefect/blocks/core.py +405 -153
  31. prefect/blocks/fields.py +2 -57
  32. prefect/blocks/notifications.py +43 -28
  33. prefect/blocks/redis.py +168 -0
  34. prefect/blocks/system.py +67 -20
  35. prefect/blocks/webhook.py +2 -9
  36. prefect/cache_policies.py +239 -0
  37. prefect/client/__init__.py +4 -0
  38. prefect/client/base.py +33 -27
  39. prefect/client/cloud.py +65 -20
  40. prefect/client/collections.py +1 -1
  41. prefect/client/orchestration.py +650 -442
  42. prefect/client/schemas/actions.py +115 -100
  43. prefect/client/schemas/filters.py +46 -52
  44. prefect/client/schemas/objects.py +228 -178
  45. prefect/client/schemas/responses.py +18 -36
  46. prefect/client/schemas/schedules.py +55 -36
  47. prefect/client/schemas/sorting.py +2 -0
  48. prefect/client/subscriptions.py +8 -7
  49. prefect/client/types/flexible_schedule_list.py +11 -0
  50. prefect/client/utilities.py +9 -6
  51. prefect/concurrency/asyncio.py +60 -11
  52. prefect/concurrency/context.py +24 -0
  53. prefect/concurrency/events.py +2 -2
  54. prefect/concurrency/services.py +46 -16
  55. prefect/concurrency/sync.py +51 -7
  56. prefect/concurrency/v1/asyncio.py +143 -0
  57. prefect/concurrency/v1/context.py +27 -0
  58. prefect/concurrency/v1/events.py +61 -0
  59. prefect/concurrency/v1/services.py +116 -0
  60. prefect/concurrency/v1/sync.py +92 -0
  61. prefect/context.py +246 -149
  62. prefect/deployments/__init__.py +33 -18
  63. prefect/deployments/base.py +10 -15
  64. prefect/deployments/deployments.py +2 -1048
  65. prefect/deployments/flow_runs.py +178 -0
  66. prefect/deployments/runner.py +72 -173
  67. prefect/deployments/schedules.py +31 -25
  68. prefect/deployments/steps/__init__.py +0 -1
  69. prefect/deployments/steps/core.py +7 -0
  70. prefect/deployments/steps/pull.py +15 -21
  71. prefect/deployments/steps/utility.py +2 -1
  72. prefect/docker/__init__.py +20 -0
  73. prefect/docker/docker_image.py +82 -0
  74. prefect/engine.py +15 -2475
  75. prefect/events/actions.py +17 -23
  76. prefect/events/cli/automations.py +20 -7
  77. prefect/events/clients.py +142 -80
  78. prefect/events/filters.py +14 -18
  79. prefect/events/related.py +74 -75
  80. prefect/events/schemas/__init__.py +0 -5
  81. prefect/events/schemas/automations.py +55 -46
  82. prefect/events/schemas/deployment_triggers.py +7 -197
  83. prefect/events/schemas/events.py +46 -65
  84. prefect/events/schemas/labelling.py +10 -14
  85. prefect/events/utilities.py +4 -5
  86. prefect/events/worker.py +23 -8
  87. prefect/exceptions.py +15 -0
  88. prefect/filesystems.py +30 -529
  89. prefect/flow_engine.py +827 -0
  90. prefect/flow_runs.py +379 -7
  91. prefect/flows.py +470 -360
  92. prefect/futures.py +382 -331
  93. prefect/infrastructure/__init__.py +5 -26
  94. prefect/infrastructure/base.py +3 -320
  95. prefect/infrastructure/provisioners/__init__.py +5 -3
  96. prefect/infrastructure/provisioners/cloud_run.py +13 -8
  97. prefect/infrastructure/provisioners/container_instance.py +14 -9
  98. prefect/infrastructure/provisioners/ecs.py +10 -8
  99. prefect/infrastructure/provisioners/modal.py +8 -5
  100. prefect/input/__init__.py +4 -0
  101. prefect/input/actions.py +2 -4
  102. prefect/input/run_input.py +9 -9
  103. prefect/logging/formatters.py +2 -4
  104. prefect/logging/handlers.py +9 -14
  105. prefect/logging/loggers.py +5 -5
  106. prefect/main.py +72 -0
  107. prefect/plugins.py +2 -64
  108. prefect/profiles.toml +16 -2
  109. prefect/records/__init__.py +1 -0
  110. prefect/records/base.py +223 -0
  111. prefect/records/filesystem.py +207 -0
  112. prefect/records/memory.py +178 -0
  113. prefect/records/result_store.py +64 -0
  114. prefect/results.py +577 -504
  115. prefect/runner/runner.py +117 -47
  116. prefect/runner/server.py +32 -34
  117. prefect/runner/storage.py +3 -12
  118. prefect/runner/submit.py +2 -10
  119. prefect/runner/utils.py +2 -2
  120. prefect/runtime/__init__.py +1 -0
  121. prefect/runtime/deployment.py +1 -0
  122. prefect/runtime/flow_run.py +40 -5
  123. prefect/runtime/task_run.py +1 -0
  124. prefect/serializers.py +28 -39
  125. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  126. prefect/settings.py +209 -332
  127. prefect/states.py +160 -63
  128. prefect/task_engine.py +1478 -57
  129. prefect/task_runners.py +383 -287
  130. prefect/task_runs.py +240 -0
  131. prefect/task_worker.py +463 -0
  132. prefect/tasks.py +684 -374
  133. prefect/transactions.py +410 -0
  134. prefect/types/__init__.py +72 -86
  135. prefect/types/entrypoint.py +13 -0
  136. prefect/utilities/annotations.py +4 -3
  137. prefect/utilities/asyncutils.py +227 -148
  138. prefect/utilities/callables.py +137 -45
  139. prefect/utilities/collections.py +134 -86
  140. prefect/utilities/dispatch.py +27 -14
  141. prefect/utilities/dockerutils.py +11 -4
  142. prefect/utilities/engine.py +186 -32
  143. prefect/utilities/filesystem.py +4 -5
  144. prefect/utilities/importtools.py +26 -27
  145. prefect/utilities/pydantic.py +128 -38
  146. prefect/utilities/schema_tools/hydration.py +18 -1
  147. prefect/utilities/schema_tools/validation.py +30 -0
  148. prefect/utilities/services.py +35 -9
  149. prefect/utilities/templating.py +12 -2
  150. prefect/utilities/timeout.py +20 -5
  151. prefect/utilities/urls.py +195 -0
  152. prefect/utilities/visualization.py +1 -0
  153. prefect/variables.py +78 -59
  154. prefect/workers/__init__.py +0 -1
  155. prefect/workers/base.py +237 -244
  156. prefect/workers/block.py +5 -226
  157. prefect/workers/cloud.py +6 -0
  158. prefect/workers/process.py +265 -12
  159. prefect/workers/server.py +29 -11
  160. {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/METADATA +28 -24
  161. prefect_client-3.0.0.dist-info/RECORD +201 -0
  162. {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/WHEEL +1 -1
  163. prefect/_internal/pydantic/_base_model.py +0 -51
  164. prefect/_internal/pydantic/_compat.py +0 -82
  165. prefect/_internal/pydantic/_flags.py +0 -20
  166. prefect/_internal/pydantic/_types.py +0 -8
  167. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  168. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  169. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  170. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  171. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  172. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  173. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  174. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  175. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  176. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  177. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  178. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  179. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  180. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  181. prefect/_vendor/fastapi/__init__.py +0 -25
  182. prefect/_vendor/fastapi/applications.py +0 -946
  183. prefect/_vendor/fastapi/background.py +0 -3
  184. prefect/_vendor/fastapi/concurrency.py +0 -44
  185. prefect/_vendor/fastapi/datastructures.py +0 -58
  186. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  187. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  188. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  189. prefect/_vendor/fastapi/encoders.py +0 -177
  190. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  191. prefect/_vendor/fastapi/exceptions.py +0 -46
  192. prefect/_vendor/fastapi/logger.py +0 -3
  193. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  194. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  195. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  196. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  197. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  198. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  199. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  200. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  201. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  202. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  203. prefect/_vendor/fastapi/openapi/models.py +0 -480
  204. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  205. prefect/_vendor/fastapi/param_functions.py +0 -340
  206. prefect/_vendor/fastapi/params.py +0 -453
  207. prefect/_vendor/fastapi/py.typed +0 -0
  208. prefect/_vendor/fastapi/requests.py +0 -4
  209. prefect/_vendor/fastapi/responses.py +0 -40
  210. prefect/_vendor/fastapi/routing.py +0 -1331
  211. prefect/_vendor/fastapi/security/__init__.py +0 -15
  212. prefect/_vendor/fastapi/security/api_key.py +0 -98
  213. prefect/_vendor/fastapi/security/base.py +0 -6
  214. prefect/_vendor/fastapi/security/http.py +0 -172
  215. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  216. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  217. prefect/_vendor/fastapi/security/utils.py +0 -10
  218. prefect/_vendor/fastapi/staticfiles.py +0 -1
  219. prefect/_vendor/fastapi/templating.py +0 -3
  220. prefect/_vendor/fastapi/testclient.py +0 -1
  221. prefect/_vendor/fastapi/types.py +0 -3
  222. prefect/_vendor/fastapi/utils.py +0 -235
  223. prefect/_vendor/fastapi/websockets.py +0 -7
  224. prefect/_vendor/starlette/__init__.py +0 -1
  225. prefect/_vendor/starlette/_compat.py +0 -28
  226. prefect/_vendor/starlette/_exception_handler.py +0 -80
  227. prefect/_vendor/starlette/_utils.py +0 -88
  228. prefect/_vendor/starlette/applications.py +0 -261
  229. prefect/_vendor/starlette/authentication.py +0 -159
  230. prefect/_vendor/starlette/background.py +0 -43
  231. prefect/_vendor/starlette/concurrency.py +0 -59
  232. prefect/_vendor/starlette/config.py +0 -151
  233. prefect/_vendor/starlette/convertors.py +0 -87
  234. prefect/_vendor/starlette/datastructures.py +0 -707
  235. prefect/_vendor/starlette/endpoints.py +0 -130
  236. prefect/_vendor/starlette/exceptions.py +0 -60
  237. prefect/_vendor/starlette/formparsers.py +0 -276
  238. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  239. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  240. prefect/_vendor/starlette/middleware/base.py +0 -220
  241. prefect/_vendor/starlette/middleware/cors.py +0 -176
  242. prefect/_vendor/starlette/middleware/errors.py +0 -265
  243. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  244. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  245. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  246. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  247. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  248. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  249. prefect/_vendor/starlette/py.typed +0 -0
  250. prefect/_vendor/starlette/requests.py +0 -328
  251. prefect/_vendor/starlette/responses.py +0 -347
  252. prefect/_vendor/starlette/routing.py +0 -933
  253. prefect/_vendor/starlette/schemas.py +0 -154
  254. prefect/_vendor/starlette/staticfiles.py +0 -248
  255. prefect/_vendor/starlette/status.py +0 -199
  256. prefect/_vendor/starlette/templating.py +0 -231
  257. prefect/_vendor/starlette/testclient.py +0 -804
  258. prefect/_vendor/starlette/types.py +0 -30
  259. prefect/_vendor/starlette/websockets.py +0 -193
  260. prefect/blocks/kubernetes.py +0 -119
  261. prefect/deprecated/__init__.py +0 -0
  262. prefect/deprecated/data_documents.py +0 -350
  263. prefect/deprecated/packaging/__init__.py +0 -12
  264. prefect/deprecated/packaging/base.py +0 -96
  265. prefect/deprecated/packaging/docker.py +0 -146
  266. prefect/deprecated/packaging/file.py +0 -92
  267. prefect/deprecated/packaging/orion.py +0 -80
  268. prefect/deprecated/packaging/serializers.py +0 -171
  269. prefect/events/instrument.py +0 -135
  270. prefect/infrastructure/container.py +0 -824
  271. prefect/infrastructure/kubernetes.py +0 -920
  272. prefect/infrastructure/process.py +0 -289
  273. prefect/manifests.py +0 -20
  274. prefect/new_flow_engine.py +0 -449
  275. prefect/new_task_engine.py +0 -423
  276. prefect/pydantic/__init__.py +0 -76
  277. prefect/pydantic/main.py +0 -39
  278. prefect/software/__init__.py +0 -2
  279. prefect/software/base.py +0 -50
  280. prefect/software/conda.py +0 -199
  281. prefect/software/pip.py +0 -122
  282. prefect/software/python.py +0 -52
  283. prefect/task_server.py +0 -322
  284. prefect_client-2.20.4.dist-info/RECORD +0 -294
  285. /prefect/{_internal/pydantic/utilities → client/types}/__init__.py +0 -0
  286. /prefect/{_vendor → concurrency/v1}/__init__.py +0 -0
  287. {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
  288. {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/top_level.txt +0 -0
prefect/__init__.py CHANGED
@@ -5,8 +5,7 @@
5
5
  from . import _version
6
6
  import importlib
7
7
  import pathlib
8
- import warnings
9
- import sys
8
+ from typing import TYPE_CHECKING, Any
10
9
 
11
10
  __version_info__ = _version.get_versions()
12
11
  __version__ = __version_info__["version"]
@@ -25,113 +24,53 @@ __ui_static_path__ = __module_path__ / "server" / "ui"
25
24
 
26
25
  del _version, pathlib
27
26
 
28
-
29
- # Import user-facing API
30
- from prefect.deployments import deploy
31
- from prefect.states import State
32
- from prefect.logging import get_run_logger
33
- from prefect.flows import flow, Flow, serve
34
- from prefect.tasks import task, Task
35
- from prefect.context import tags
36
- from prefect.manifests import Manifest
37
- from prefect.utilities.annotations import unmapped, allow_failure
38
- from prefect.results import BaseResult
39
- from prefect.engine import pause_flow_run, resume_flow_run, suspend_flow_run
40
- from prefect.client.orchestration import get_client, PrefectClient
41
- from prefect.client.cloud import get_cloud_client, CloudClient
42
- import prefect.variables
43
- import prefect.runtime
44
-
45
- # Import modules that register types
46
- import prefect.serializers
47
- import prefect.deprecated.data_documents
48
- import prefect.deprecated.packaging
49
- import prefect.blocks.kubernetes
50
- import prefect.blocks.notifications
51
- import prefect.blocks.system
52
- import prefect.infrastructure.process
53
- import prefect.infrastructure.kubernetes
54
- import prefect.infrastructure.container
55
-
56
- # Initialize the process-wide profile and registry at import time
57
- import prefect.context
58
-
59
- prefect.context.initialize_object_registry()
60
-
61
- # Perform any forward-ref updates needed for Pydantic models
62
- import prefect.client.schemas
63
-
64
- prefect.context.FlowRunContext.update_forward_refs(Flow=Flow)
65
- prefect.context.TaskRunContext.update_forward_refs(Task=Task)
66
- prefect.client.schemas.State.update_forward_refs(
67
- BaseResult=BaseResult, DataDocument=prefect.deprecated.data_documents.DataDocument
68
- )
69
- prefect.client.schemas.StateCreate.update_forward_refs(
70
- BaseResult=BaseResult, DataDocument=prefect.deprecated.data_documents.DataDocument
71
- )
72
-
73
-
74
- prefect.plugins.load_extra_entrypoints()
75
-
76
- # Configure logging
77
- import prefect.logging.configuration
78
-
79
- prefect.logging.configuration.setup_logging()
80
- prefect.logging.get_logger("profiles").debug(
81
- f"Using profile {prefect.context.get_settings_context().profile.name!r}"
82
- )
83
-
84
- # Ensure moved names are accessible at old locations
85
- import prefect.client
86
-
87
- prefect.client.get_client = get_client
88
- prefect.client.PrefectClient = PrefectClient
89
-
90
-
91
- from prefect._internal.compatibility.deprecated import (
92
- inject_renamed_module_alias_finder,
93
- register_renamed_module,
94
- )
95
-
96
- register_renamed_module(
97
- "prefect.packaging", "prefect.deprecated.packaging", start_date="Mar 2024"
98
- )
99
- inject_renamed_module_alias_finder()
100
-
101
-
102
- # Attempt to warn users who are importing Prefect 1.x attributes that they may
103
- # have accidentally installed Prefect 2.x
104
-
105
- PREFECT_1_ATTRIBUTES = [
106
- "prefect.Client",
107
- "prefect.Parameter",
108
- "prefect.api",
109
- "prefect.apply_map",
110
- "prefect.case",
111
- "prefect.config",
112
- "prefect.context",
113
- "prefect.flatten",
114
- "prefect.mapped",
115
- "prefect.models",
116
- "prefect.resource_manager",
117
- ]
118
-
119
-
120
- class Prefect1ImportInterceptor(importlib.abc.Loader):
121
- def find_spec(self, fullname, path, target=None):
122
- if fullname in PREFECT_1_ATTRIBUTES:
123
- warnings.warn(
124
- f"Attempted import of {fullname!r}, which is part of Prefect 1.x, while"
125
- f" Prefect {__version__} is installed. If you're upgrading you'll need"
126
- " to update your code, see the Prefect 2.x migration guide:"
127
- " `https://orion-docs.prefect.io/migration_guide/`. Otherwise ensure"
128
- " that your code is pinned to the expected version."
129
- )
130
-
131
-
132
- if not hasattr(sys, "frozen"):
133
- sys.meta_path.insert(0, Prefect1ImportInterceptor())
134
-
27
+ if TYPE_CHECKING:
28
+ from .main import (
29
+ allow_failure,
30
+ flow,
31
+ Flow,
32
+ get_client,
33
+ get_run_logger,
34
+ State,
35
+ tags,
36
+ task,
37
+ Task,
38
+ Transaction,
39
+ unmapped,
40
+ serve,
41
+ deploy,
42
+ pause_flow_run,
43
+ resume_flow_run,
44
+ suspend_flow_run,
45
+ )
46
+
47
+ _slots: dict[str, Any] = {
48
+ "__version_info__": __version_info__,
49
+ "__version__": __version__,
50
+ "__module_path__": __module_path__,
51
+ "__development_base_path__": __development_base_path__,
52
+ "__ui_static_subpath__": __ui_static_subpath__,
53
+ "__ui_static_path__": __ui_static_path__,
54
+ }
55
+
56
+ _public_api: dict[str, tuple[str, str]] = {
57
+ "allow_failure": (__spec__.parent, ".main"),
58
+ "flow": (__spec__.parent, ".main"),
59
+ "Flow": (__spec__.parent, ".main"),
60
+ "get_client": (__spec__.parent, ".main"),
61
+ "get_run_logger": (__spec__.parent, ".main"),
62
+ "State": (__spec__.parent, ".main"),
63
+ "tags": (__spec__.parent, ".main"),
64
+ "task": (__spec__.parent, ".main"),
65
+ "Task": (__spec__.parent, ".main"),
66
+ "Transaction": (__spec__.parent, ".main"),
67
+ "unmapped": (__spec__.parent, ".main"),
68
+ "serve": (__spec__.parent, ".main"),
69
+ "deploy": (__spec__.parent, ".main"),
70
+ "pause_flow_run": (__spec__.parent, ".main"),
71
+ "resume_flow_run": (__spec__.parent, ".main"),
72
+ "suspend_flow_run": (__spec__.parent, ".main"),
73
+ }
135
74
 
136
75
  # Declare API for type-checkers
137
76
  __all__ = [
@@ -140,15 +79,40 @@ __all__ = [
140
79
  "Flow",
141
80
  "get_client",
142
81
  "get_run_logger",
143
- "Manifest",
144
82
  "State",
145
83
  "tags",
146
84
  "task",
147
85
  "Task",
86
+ "Transaction",
148
87
  "unmapped",
149
88
  "serve",
150
89
  "deploy",
151
90
  "pause_flow_run",
152
91
  "resume_flow_run",
153
92
  "suspend_flow_run",
93
+ "__version_info__",
94
+ "__version__",
95
+ "__module_path__",
96
+ "__development_base_path__",
97
+ "__ui_static_subpath__",
98
+ "__ui_static_path__",
154
99
  ]
100
+
101
+
102
+ def __getattr__(attr_name: str) -> object:
103
+ if attr_name in _slots:
104
+ return _slots[attr_name]
105
+
106
+ dynamic_attr = _public_api.get(attr_name)
107
+ if dynamic_attr is None:
108
+ return importlib.import_module(f".{attr_name}", package=__name__)
109
+
110
+ package, module_name = dynamic_attr
111
+
112
+ from importlib import import_module
113
+
114
+ if module_name == "__module__":
115
+ return import_module(f".{attr_name}", package=package)
116
+ else:
117
+ module = import_module(module_name, package=package)
118
+ return getattr(module, attr_name)
@@ -9,21 +9,14 @@ Deprecated items require a start or end date. If a start date is given, the end
9
9
  will be calculated 6 months later. Start and end dates are always in the format MMM YYYY
10
10
  e.g. Jan 2023.
11
11
  """
12
+
12
13
  import functools
13
14
  import sys
14
15
  import warnings
15
- from typing import Any, Callable, Dict, List, Optional, Type, TypeVar, Union
16
+ from typing import Any, Callable, List, Optional, Type, TypeVar
16
17
 
17
18
  import pendulum
18
-
19
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
20
-
21
- if HAS_PYDANTIC_V2:
22
- from pydantic.v1 import BaseModel, Field, root_validator
23
- from pydantic.v1.schema import default_ref_template
24
- else:
25
- from pydantic import BaseModel, Field, root_validator
26
- from pydantic.schema import default_ref_template
19
+ from pydantic import BaseModel
27
20
 
28
21
  from prefect.utilities.callables import get_call_parameters
29
22
  from prefect.utilities.importtools import (
@@ -237,9 +230,10 @@ def deprecated_field(
237
230
 
238
231
  cls_init(__pydantic_self__, **data)
239
232
 
240
- field = __pydantic_self__.__fields__.get(name)
233
+ field = __pydantic_self__.model_fields.get(name)
241
234
  if field is not None:
242
- field.field_info.extra["deprecated"] = True
235
+ field.json_schema_extra = field.json_schema_extra or {}
236
+ field.json_schema_extra["deprecated"] = True
243
237
 
244
238
  # Patch the model's init method
245
239
  model_cls.__init__ = __init__
@@ -278,106 +272,3 @@ def register_renamed_module(old_name: str, new_name: str, start_date: str):
278
272
  DEPRECATED_MODULE_ALIASES.append(
279
273
  AliasedModuleDefinition(old_name, new_name, callback)
280
274
  )
281
-
282
-
283
- class DeprecatedInfraOverridesField(BaseModel):
284
- """
285
- A model mixin that handles the deprecated `infra_overrides` field.
286
-
287
- The `infra_overrides` field has been renamed to `job_variables`. This mixin maintains
288
- backwards compatibility with users of the `infra_overrides` field while presenting
289
- `job_variables` as the user-facing field.
290
-
291
- When we remove support for `infra_overrides`, we can remove this class as a parent of
292
- all schemas that use it, leaving them with only the `job_variables` field.
293
- """
294
-
295
- infra_overrides: Optional[Dict[str, Any]] = Field(
296
- default_factory=dict,
297
- description="Deprecated field. Use `job_variables` instead.",
298
- )
299
-
300
- @root_validator(pre=True)
301
- def _job_variables_from_infra_overrides(
302
- cls, values: Dict[str, Any]
303
- ) -> Dict[str, Any]:
304
- """
305
- Validate that only one of `infra_overrides` or `job_variables` is used
306
- and keep them in sync during init.
307
- """
308
- job_variables = values.get("job_variables")
309
- infra_overrides = values.get("infra_overrides")
310
-
311
- if job_variables is not None and infra_overrides is not None:
312
- if job_variables != infra_overrides:
313
- raise ValueError(
314
- "The `infra_overrides` field has been renamed to `job_variables`."
315
- "Use one of these fields, but not both."
316
- )
317
- return values
318
- elif job_variables is not None and infra_overrides is None:
319
- values["infra_overrides"] = job_variables
320
- elif job_variables is None and infra_overrides is not None:
321
- values["job_variables"] = infra_overrides
322
- return values
323
-
324
- def __setattr__(self, key: str, value: Any) -> None:
325
- """
326
- Override the default __setattr__ to ensure that setting `infra_overrides` or
327
- `job_variables` will update both fields.
328
- """
329
- if key == "infra_overrides" or key == "job_variables":
330
- updates = {"infra_overrides": value, "job_variables": value}
331
- self.__dict__.update(updates)
332
- return
333
- super().__setattr__(key, value)
334
-
335
- def dict(self, **kwargs) -> Dict[str, Any]:
336
- """
337
- Override the default dict method to ensure only `infra_overrides` is serialized.
338
- This preserves backwards compatibility for newer clients talking to older servers.
339
- """
340
- exclude: Union[set, Dict[str, Any]] = kwargs.pop("exclude", set())
341
- exclude_type = type(exclude)
342
-
343
- if exclude_type is set:
344
- exclude.add("job_variables")
345
- elif exclude_type is dict:
346
- exclude["job_variables"] = True
347
- else:
348
- exclude = {"job_variables"}
349
- kwargs["exclude"] = exclude
350
-
351
- return super().dict(**kwargs)
352
-
353
- @classmethod
354
- def schema(
355
- cls, by_alias: bool = True, ref_template: str = default_ref_template
356
- ) -> Dict[str, Any]:
357
- """
358
- Don't use the mixin docstring as the description if this class is missing a
359
- docstring.
360
- """
361
- schema = super().schema(by_alias=by_alias, ref_template=ref_template)
362
-
363
- if not cls.__doc__:
364
- schema.pop("description", None)
365
-
366
- return schema
367
-
368
-
369
- def handle_deprecated_infra_overrides_parameter(
370
- job_variables: Dict[str, Any], infra_overrides: Dict[str, Any]
371
- ) -> Optional[Dict[str, Any]]:
372
- if infra_overrides is not None and job_variables is not None:
373
- raise RuntimeError(
374
- "The `infra_overrides` argument has been renamed to `job_variables`."
375
- "Use one or the other, but not both."
376
- )
377
- elif infra_overrides is not None and job_variables is None:
378
- jv = infra_overrides
379
- elif job_variables is not None and infra_overrides is None:
380
- jv = job_variables
381
- else:
382
- jv = None
383
- return jv
@@ -13,21 +13,11 @@ Some experimental features require opt-in to enable any usage. These require the
13
13
 
14
14
  import functools
15
15
  import warnings
16
- from typing import Any, Callable, Optional, Set, Type, TypeVar
16
+ from typing import Any, Callable, Optional, Set, TypeVar
17
17
 
18
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
18
+ import pydantic
19
19
 
20
- if HAS_PYDANTIC_V2:
21
- import pydantic.v1 as pydantic
22
- else:
23
- import pydantic
24
-
25
- from prefect.settings import (
26
- PREFECT_EXPERIMENTAL_WARN,
27
- SETTING_VARIABLES,
28
- Setting,
29
- automation_settings_enabled,
30
- )
20
+ from prefect.settings import PREFECT_EXPERIMENTAL_WARN, SETTING_VARIABLES, Setting
31
21
  from prefect.utilities.callables import get_call_parameters
32
22
 
33
23
  T = TypeVar("T", bound=Callable[..., Any])
@@ -194,77 +184,12 @@ def experimental_parameter(
194
184
  return decorator
195
185
 
196
186
 
197
- def experimental_field(
198
- name: str,
199
- *,
200
- group: str,
201
- help: str = "",
202
- stacklevel: int = 2,
203
- opt_in: bool = False,
204
- when: Optional[Callable[[Any], bool]] = None,
205
- ):
206
- """
207
- Mark a field in a Pydantic model as experimental.
208
-
209
- Raises warning only if the field is specified during init.
210
-
211
- Example:
212
-
213
- ```python
214
-
215
- @experimental_parameter("y", group="example", when=lambda y: y is not None)
216
- def foo(x, y = None):
217
- return x + 1 + (y or 0)
218
- ```
219
- """
220
-
221
- when = when or (lambda _: True)
222
-
223
- @experimental(
224
- group=group,
225
- feature=f"The field {name!r}",
226
- help=help,
227
- opt_in=opt_in,
228
- stacklevel=stacklevel + 2,
229
- )
230
- def experimental_check():
231
- """Utility function for performing a warning check for the specified group"""
232
-
233
- # Replaces the model's __init__ method with one that performs an additional warning
234
- # check
235
- def decorator(model_cls: Type[M]) -> Type[M]:
236
- cls_init = model_cls.__init__
237
-
238
- @functools.wraps(model_cls.__init__)
239
- def __init__(__pydantic_self__, **data: Any) -> None:
240
- # Call the original init
241
- cls_init(__pydantic_self__, **data)
242
- # Perform warning check
243
- if name in data.keys() and when(data[name]):
244
- experimental_check()
245
- field = __pydantic_self__.__fields__.get(name)
246
- if field is not None:
247
- field.field_info.extra["experimental"] = True
248
- field.field_info.extra["experimental-group"] = group
249
-
250
- # Patch the model's init method
251
- model_cls.__init__ = __init__
252
-
253
- return model_cls
254
-
255
- return decorator
256
-
257
-
258
187
  def enabled_experiments() -> Set[str]:
259
188
  """
260
189
  Return the set of all enabled experiments.
261
190
  """
262
- enabled_experimental_settings = {
191
+ return {
263
192
  name[len("PREFECT_EXPERIMENTAL_ENABLE_") :].lower()
264
193
  for name, setting in SETTING_VARIABLES.items()
265
194
  if name.startswith("PREFECT_EXPERIMENTAL_ENABLE_") and setting.value()
266
195
  }
267
- if automation_settings_enabled():
268
- enabled_experimental_settings.add("automations")
269
-
270
- return enabled_experimental_settings
@@ -0,0 +1,166 @@
1
+ """
2
+ This module provides a function to handle imports for moved or removed objects in Prefect 3.0 upgrade.
3
+
4
+ The `getattr_migration` function is used to handle imports for moved or removed objects in Prefect 3.0 upgrade.
5
+ It is used in the `__getattr__` attribute of modules that have moved or removed objects.
6
+
7
+ Usage:
8
+
9
+ Moved objects:
10
+ 1. Add the old and new path to the `MOVED_IN_V3` dictionary, e.g. `MOVED_IN_V3 = {"old_path": "new_path"}`
11
+ 2. In the module where the object was moved from, add the following lines:
12
+ ```python
13
+ # at top
14
+ from prefect._internal.compatibility.migration import getattr_migration
15
+
16
+ # at bottom
17
+ __getattr__ = getattr_migration(__name__)
18
+ ```
19
+
20
+ Example at src/prefect/engine.py
21
+
22
+ Removed objects:
23
+ 1. Add the old path and error message to the `REMOVED_IN_V3` dictionary, e.g. `REMOVED_IN_V3 = {"old_path": "error_message"}`
24
+ 2. In the module where the object was removed, add the following lines:
25
+ ```python
26
+ # at top
27
+ from prefect._internal.compatibility.migration import getattr_migration
28
+
29
+ # at bottom
30
+ __getattr__ = getattr_migration(__name__)
31
+
32
+ ```
33
+ If the entire old module was removed, add a stub for the module with the following lines:
34
+ ```python
35
+ # at top
36
+ from prefect._internal.compatibility.migration import getattr_migration
37
+
38
+ # at bottom
39
+ __getattr__ = getattr_migration(__name__)
40
+ ```
41
+
42
+ Example at src/prefect/infrastructure/base.py
43
+ """
44
+
45
+ import sys
46
+ from typing import Any, Callable, Dict
47
+
48
+ from pydantic_core import PydanticCustomError
49
+
50
+ from prefect.exceptions import PrefectImportError
51
+
52
+ MOVED_IN_V3 = {
53
+ "prefect.deployments.deployments:load_flow_from_flow_run": "prefect.flows:load_flow_from_flow_run",
54
+ "prefect.deployments:load_flow_from_flow_run": "prefect.flows:load_flow_from_flow_run",
55
+ "prefect.variables:get": "prefect.variables:Variable.get",
56
+ "prefect.engine:pause_flow_run": "prefect.flow_runs:pause_flow_run",
57
+ "prefect.engine:resume_flow_run": "prefect.flow_runs:resume_flow_run",
58
+ "prefect.engine:suspend_flow_run": "prefect.flow_runs:suspend_flow_run",
59
+ "prefect.engine:_in_process_pause": "prefect.flow_runs:_in_process_pause",
60
+ "prefect.client:get_client": "prefect.client.orchestration:get_client",
61
+ }
62
+
63
+ upgrade_guide_msg = "Refer to the upgrade guide for more information: https://docs.prefect.io/latest/guides/upgrade-guide-agents-to-workers/."
64
+
65
+ REMOVED_IN_V3 = {
66
+ "prefect.client.schemas.objects:MinimalDeploymentSchedule": "Use `prefect.client.schemas.actions.DeploymentScheduleCreate` instead.",
67
+ "prefect.context:PrefectObjectRegistry": upgrade_guide_msg,
68
+ "prefect.deployments.deployments:Deployment": "Use `flow.serve()`, `flow.deploy()`, or `prefect deploy` instead.",
69
+ "prefect.deployments:Deployment": "Use `flow.serve()`, `flow.deploy()`, or `prefect deploy` instead.",
70
+ "prefect.filesystems:GCS": "Use `prefect_gcp.GcsBucket` instead.",
71
+ "prefect.filesystems:Azure": "Use `prefect_azure.AzureBlobStorageContainer` instead.",
72
+ "prefect.filesystems:S3": "Use `prefect_aws.S3Bucket` instead.",
73
+ "prefect.filesystems:GitHub": "Use `prefect_github.GitHubRepository` instead.",
74
+ "prefect.engine:_out_of_process_pause": "Use `prefect.flow_runs.pause_flow_run` instead.",
75
+ "prefect.agent:PrefectAgent": "Use workers instead. " + upgrade_guide_msg,
76
+ "prefect.infrastructure:KubernetesJob": "Use workers instead. " + upgrade_guide_msg,
77
+ "prefect.infrastructure.base:Infrastructure": "Use the `BaseWorker` class to create custom infrastructure integrations instead. "
78
+ + upgrade_guide_msg,
79
+ "prefect.workers.block:BlockWorkerJobConfiguration": upgrade_guide_msg,
80
+ "prefect.workers.cloud:BlockWorker": upgrade_guide_msg,
81
+ }
82
+
83
+ # IMPORTANT FOR USAGE: When adding new modules to MOVED_IN_V3 or REMOVED_IN_V3, include the following lines at the bottom of that module:
84
+ # from prefect._internal.compatibility.migration import getattr_migration
85
+ # __getattr__ = getattr_migration(__name__)
86
+ # See src/prefect/filesystems.py for an example
87
+
88
+
89
+ def import_string_class_method(new_location: str) -> Callable:
90
+ """
91
+ Handle moved class methods.
92
+
93
+ `import_string` does not account for moved class methods. This function handles cases where a method has been
94
+ moved to a class. For example, if `new_location` is 'prefect.variables:Variable.get', `import_string(new_location)`
95
+ will raise an error because it does not handle class methods. This function will import the class and get the
96
+ method from the class.
97
+
98
+ Args:
99
+ new_location (str): The new location of the method.
100
+
101
+ Returns:
102
+ method: The resolved method from the class.
103
+
104
+ Raises:
105
+ PrefectImportError: If the method is not found in the class.
106
+ """
107
+ from pydantic._internal._validators import import_string
108
+
109
+ class_name, method_name = new_location.rsplit(".", 1)
110
+
111
+ cls = import_string(class_name)
112
+ method = getattr(cls, method_name, None)
113
+
114
+ if method is not None and callable(method):
115
+ return method
116
+
117
+ raise PrefectImportError(f"Unable to import {new_location!r}")
118
+
119
+
120
+ def getattr_migration(module_name: str) -> Callable[[str], Any]:
121
+ """
122
+ Handle imports for moved or removed objects in Prefect 3.0 upgrade
123
+
124
+ Args:
125
+ module_name (str): The name of the module to handle imports for.
126
+ """
127
+
128
+ def wrapper(name: str) -> object:
129
+ """
130
+ Raise a PrefectImportError if the object is not found, moved, or removed.
131
+ """
132
+
133
+ if name == "__path__":
134
+ raise AttributeError(f"{module_name!r} object has no attribute {name!r}")
135
+ import warnings
136
+
137
+ from pydantic._internal._validators import import_string
138
+
139
+ import_path = f"{module_name}:{name}"
140
+
141
+ # Check if the attribute name corresponds to a moved or removed class or module
142
+ if import_path in MOVED_IN_V3.keys():
143
+ new_location = MOVED_IN_V3[import_path]
144
+ warnings.warn(
145
+ f"{import_path!r} has been moved to {new_location!r}. Importing from {new_location!r} instead. This warning will raise an error in a future release.",
146
+ DeprecationWarning,
147
+ stacklevel=2,
148
+ )
149
+ try:
150
+ return import_string(new_location)
151
+ except PydanticCustomError:
152
+ return import_string_class_method(new_location)
153
+
154
+ if import_path in REMOVED_IN_V3.keys():
155
+ error_message = REMOVED_IN_V3[import_path]
156
+ raise PrefectImportError(
157
+ f"`{import_path}` has been removed. {error_message}"
158
+ )
159
+
160
+ globals: Dict[str, Any] = sys.modules[module_name].__dict__
161
+ if name in globals:
162
+ return globals[name]
163
+
164
+ raise AttributeError(f"module {module_name!r} has no attribute {name!r}")
165
+
166
+ return wrapper
@@ -5,7 +5,7 @@ both asynchronous and synchronous calls.
5
5
  Much of the complexity managed here arises from ensuring that a thread of execution is
6
6
  not blocked.
7
7
 
8
- The main data structure is a `Call` which is created from a function call capturing
8
+ The main data structure is a `Call` which is created from a function call capturing
9
9
  local context variables. The call is then submitted to run somewhere via a `Portal`.
10
10
  The primary portal used is the `WorkerThread`, which executes work on a thread running
11
11
  concurrently to the one that created the call. A singleton `EventLoopThread` portal
@@ -13,7 +13,7 @@ is also used to schedule work on a dedicated event loop.
13
13
 
14
14
  The result of the call can be retrieved asynchronously using `Call.result()`. Behind
15
15
  the scenes, a `Future` is used to report the result of the call. Retrieving the result
16
- of a call is a blocking operation.
16
+ of a call is a blocking operation.
17
17
 
18
18
  Sometimes, it is important not to block the current thread while retrieving the result
19
19
  of a call. For this purpose, there is the `Waiter`. Waiters attach to a call and provide