prefect-client 2.19.4__py3-none-any.whl → 3.0.0rc2__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 (242) 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/redis.py +168 -0
  26. prefect/blocks/system.py +22 -11
  27. prefect/blocks/webhook.py +2 -9
  28. prefect/client/base.py +4 -4
  29. prefect/client/cloud.py +8 -13
  30. prefect/client/orchestration.py +362 -340
  31. prefect/client/schemas/actions.py +92 -86
  32. prefect/client/schemas/filters.py +20 -40
  33. prefect/client/schemas/objects.py +158 -152
  34. prefect/client/schemas/responses.py +16 -24
  35. prefect/client/schemas/schedules.py +47 -35
  36. prefect/client/subscriptions.py +2 -2
  37. prefect/client/utilities.py +5 -2
  38. prefect/concurrency/asyncio.py +4 -2
  39. prefect/concurrency/events.py +1 -1
  40. prefect/concurrency/services.py +7 -4
  41. prefect/context.py +195 -27
  42. prefect/deployments/__init__.py +5 -6
  43. prefect/deployments/base.py +7 -5
  44. prefect/deployments/flow_runs.py +185 -0
  45. prefect/deployments/runner.py +50 -45
  46. prefect/deployments/schedules.py +28 -23
  47. prefect/deployments/steps/__init__.py +0 -1
  48. prefect/deployments/steps/core.py +1 -0
  49. prefect/deployments/steps/pull.py +7 -21
  50. prefect/engine.py +12 -2422
  51. prefect/events/actions.py +17 -23
  52. prefect/events/cli/automations.py +19 -6
  53. prefect/events/clients.py +14 -37
  54. prefect/events/filters.py +14 -18
  55. prefect/events/related.py +2 -2
  56. prefect/events/schemas/__init__.py +0 -5
  57. prefect/events/schemas/automations.py +55 -46
  58. prefect/events/schemas/deployment_triggers.py +7 -197
  59. prefect/events/schemas/events.py +36 -65
  60. prefect/events/schemas/labelling.py +10 -14
  61. prefect/events/utilities.py +2 -3
  62. prefect/events/worker.py +2 -3
  63. prefect/filesystems.py +6 -517
  64. prefect/{new_flow_engine.py → flow_engine.py} +315 -74
  65. prefect/flow_runs.py +379 -7
  66. prefect/flows.py +248 -165
  67. prefect/futures.py +187 -345
  68. prefect/infrastructure/__init__.py +0 -27
  69. prefect/infrastructure/provisioners/__init__.py +5 -3
  70. prefect/infrastructure/provisioners/cloud_run.py +11 -6
  71. prefect/infrastructure/provisioners/container_instance.py +11 -7
  72. prefect/infrastructure/provisioners/ecs.py +6 -4
  73. prefect/infrastructure/provisioners/modal.py +8 -5
  74. prefect/input/actions.py +2 -4
  75. prefect/input/run_input.py +9 -9
  76. prefect/logging/formatters.py +0 -2
  77. prefect/logging/handlers.py +3 -11
  78. prefect/logging/loggers.py +2 -2
  79. prefect/manifests.py +2 -1
  80. prefect/records/__init__.py +1 -0
  81. prefect/records/cache_policies.py +179 -0
  82. prefect/records/result_store.py +42 -0
  83. prefect/records/store.py +9 -0
  84. prefect/results.py +43 -39
  85. prefect/runner/runner.py +9 -9
  86. prefect/runner/server.py +6 -10
  87. prefect/runner/storage.py +3 -8
  88. prefect/runner/submit.py +2 -2
  89. prefect/runner/utils.py +2 -2
  90. prefect/serializers.py +24 -35
  91. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  92. prefect/settings.py +76 -136
  93. prefect/states.py +22 -50
  94. prefect/task_engine.py +666 -56
  95. prefect/task_runners.py +272 -300
  96. prefect/task_runs.py +203 -0
  97. prefect/{task_server.py → task_worker.py} +89 -60
  98. prefect/tasks.py +358 -341
  99. prefect/transactions.py +224 -0
  100. prefect/types/__init__.py +61 -82
  101. prefect/utilities/asyncutils.py +195 -136
  102. prefect/utilities/callables.py +121 -41
  103. prefect/utilities/collections.py +23 -38
  104. prefect/utilities/dispatch.py +11 -3
  105. prefect/utilities/dockerutils.py +4 -0
  106. prefect/utilities/engine.py +140 -20
  107. prefect/utilities/importtools.py +26 -27
  108. prefect/utilities/pydantic.py +128 -38
  109. prefect/utilities/schema_tools/hydration.py +5 -1
  110. prefect/utilities/templating.py +12 -2
  111. prefect/variables.py +84 -62
  112. prefect/workers/__init__.py +0 -1
  113. prefect/workers/base.py +26 -18
  114. prefect/workers/process.py +3 -8
  115. prefect/workers/server.py +2 -2
  116. {prefect_client-2.19.4.dist-info → prefect_client-3.0.0rc2.dist-info}/METADATA +23 -21
  117. prefect_client-3.0.0rc2.dist-info/RECORD +179 -0
  118. prefect/_internal/pydantic/_base_model.py +0 -51
  119. prefect/_internal/pydantic/_compat.py +0 -82
  120. prefect/_internal/pydantic/_flags.py +0 -20
  121. prefect/_internal/pydantic/_types.py +0 -8
  122. prefect/_internal/pydantic/utilities/__init__.py +0 -0
  123. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  124. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  125. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  126. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  127. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  128. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  129. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  130. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  131. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  132. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  133. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  134. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  135. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  136. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  137. prefect/_vendor/__init__.py +0 -0
  138. prefect/_vendor/fastapi/__init__.py +0 -25
  139. prefect/_vendor/fastapi/applications.py +0 -946
  140. prefect/_vendor/fastapi/background.py +0 -3
  141. prefect/_vendor/fastapi/concurrency.py +0 -44
  142. prefect/_vendor/fastapi/datastructures.py +0 -58
  143. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  144. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  145. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  146. prefect/_vendor/fastapi/encoders.py +0 -177
  147. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  148. prefect/_vendor/fastapi/exceptions.py +0 -46
  149. prefect/_vendor/fastapi/logger.py +0 -3
  150. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  151. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  152. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  153. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  154. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  155. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  156. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  157. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  158. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  159. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  160. prefect/_vendor/fastapi/openapi/models.py +0 -480
  161. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  162. prefect/_vendor/fastapi/param_functions.py +0 -340
  163. prefect/_vendor/fastapi/params.py +0 -453
  164. prefect/_vendor/fastapi/requests.py +0 -4
  165. prefect/_vendor/fastapi/responses.py +0 -40
  166. prefect/_vendor/fastapi/routing.py +0 -1331
  167. prefect/_vendor/fastapi/security/__init__.py +0 -15
  168. prefect/_vendor/fastapi/security/api_key.py +0 -98
  169. prefect/_vendor/fastapi/security/base.py +0 -6
  170. prefect/_vendor/fastapi/security/http.py +0 -172
  171. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  172. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  173. prefect/_vendor/fastapi/security/utils.py +0 -10
  174. prefect/_vendor/fastapi/staticfiles.py +0 -1
  175. prefect/_vendor/fastapi/templating.py +0 -3
  176. prefect/_vendor/fastapi/testclient.py +0 -1
  177. prefect/_vendor/fastapi/types.py +0 -3
  178. prefect/_vendor/fastapi/utils.py +0 -235
  179. prefect/_vendor/fastapi/websockets.py +0 -7
  180. prefect/_vendor/starlette/__init__.py +0 -1
  181. prefect/_vendor/starlette/_compat.py +0 -28
  182. prefect/_vendor/starlette/_exception_handler.py +0 -80
  183. prefect/_vendor/starlette/_utils.py +0 -88
  184. prefect/_vendor/starlette/applications.py +0 -261
  185. prefect/_vendor/starlette/authentication.py +0 -159
  186. prefect/_vendor/starlette/background.py +0 -43
  187. prefect/_vendor/starlette/concurrency.py +0 -59
  188. prefect/_vendor/starlette/config.py +0 -151
  189. prefect/_vendor/starlette/convertors.py +0 -87
  190. prefect/_vendor/starlette/datastructures.py +0 -707
  191. prefect/_vendor/starlette/endpoints.py +0 -130
  192. prefect/_vendor/starlette/exceptions.py +0 -60
  193. prefect/_vendor/starlette/formparsers.py +0 -276
  194. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  195. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  196. prefect/_vendor/starlette/middleware/base.py +0 -220
  197. prefect/_vendor/starlette/middleware/cors.py +0 -176
  198. prefect/_vendor/starlette/middleware/errors.py +0 -265
  199. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  200. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  201. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  202. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  203. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  204. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  205. prefect/_vendor/starlette/requests.py +0 -328
  206. prefect/_vendor/starlette/responses.py +0 -347
  207. prefect/_vendor/starlette/routing.py +0 -933
  208. prefect/_vendor/starlette/schemas.py +0 -154
  209. prefect/_vendor/starlette/staticfiles.py +0 -248
  210. prefect/_vendor/starlette/status.py +0 -199
  211. prefect/_vendor/starlette/templating.py +0 -231
  212. prefect/_vendor/starlette/testclient.py +0 -804
  213. prefect/_vendor/starlette/types.py +0 -30
  214. prefect/_vendor/starlette/websockets.py +0 -193
  215. prefect/agent.py +0 -698
  216. prefect/deployments/deployments.py +0 -1042
  217. prefect/deprecated/__init__.py +0 -0
  218. prefect/deprecated/data_documents.py +0 -350
  219. prefect/deprecated/packaging/__init__.py +0 -12
  220. prefect/deprecated/packaging/base.py +0 -96
  221. prefect/deprecated/packaging/docker.py +0 -146
  222. prefect/deprecated/packaging/file.py +0 -92
  223. prefect/deprecated/packaging/orion.py +0 -80
  224. prefect/deprecated/packaging/serializers.py +0 -171
  225. prefect/events/instrument.py +0 -135
  226. prefect/infrastructure/base.py +0 -323
  227. prefect/infrastructure/container.py +0 -818
  228. prefect/infrastructure/kubernetes.py +0 -920
  229. prefect/infrastructure/process.py +0 -289
  230. prefect/new_task_engine.py +0 -423
  231. prefect/pydantic/__init__.py +0 -76
  232. prefect/pydantic/main.py +0 -39
  233. prefect/software/__init__.py +0 -2
  234. prefect/software/base.py +0 -50
  235. prefect/software/conda.py +0 -199
  236. prefect/software/pip.py +0 -122
  237. prefect/software/python.py +0 -52
  238. prefect/workers/block.py +0 -218
  239. prefect_client-2.19.4.dist-info/RECORD +0 -292
  240. {prefect_client-2.19.4.dist-info → prefect_client-3.0.0rc2.dist-info}/LICENSE +0 -0
  241. {prefect_client-2.19.4.dist-info → prefect_client-3.0.0rc2.dist-info}/WHEEL +0 -0
  242. {prefect_client-2.19.4.dist-info → prefect_client-3.0.0rc2.dist-info}/top_level.txt +0 -0
@@ -1,30 +0,0 @@
1
- import typing
2
-
3
- if typing.TYPE_CHECKING:
4
- from prefect._vendor.starlette.requests import Request
5
- from prefect._vendor.starlette.responses import Response
6
- from prefect._vendor.starlette.websockets import WebSocket
7
-
8
- AppType = typing.TypeVar("AppType")
9
-
10
- Scope = typing.MutableMapping[str, typing.Any]
11
- Message = typing.MutableMapping[str, typing.Any]
12
-
13
- Receive = typing.Callable[[], typing.Awaitable[Message]]
14
- Send = typing.Callable[[Message], typing.Awaitable[None]]
15
-
16
- ASGIApp = typing.Callable[[Scope, Receive, Send], typing.Awaitable[None]]
17
-
18
- StatelessLifespan = typing.Callable[[AppType], typing.AsyncContextManager[None]]
19
- StatefulLifespan = typing.Callable[
20
- [AppType], typing.AsyncContextManager[typing.Mapping[str, typing.Any]]
21
- ]
22
- Lifespan = typing.Union[StatelessLifespan[AppType], StatefulLifespan[AppType]]
23
-
24
- HTTPExceptionHandler = typing.Callable[
25
- ["Request", Exception], typing.Union["Response", typing.Awaitable["Response"]]
26
- ]
27
- WebSocketExceptionHandler = typing.Callable[
28
- ["WebSocket", Exception], typing.Awaitable[None]
29
- ]
30
- ExceptionHandler = typing.Union[HTTPExceptionHandler, WebSocketExceptionHandler]
@@ -1,193 +0,0 @@
1
- import enum
2
- import json
3
- import typing
4
-
5
- from prefect._vendor.starlette.requests import HTTPConnection
6
- from prefect._vendor.starlette.types import Message, Receive, Scope, Send
7
-
8
-
9
- class WebSocketState(enum.Enum):
10
- CONNECTING = 0
11
- CONNECTED = 1
12
- DISCONNECTED = 2
13
-
14
-
15
- class WebSocketDisconnect(Exception):
16
- def __init__(self, code: int = 1000, reason: typing.Optional[str] = None) -> None:
17
- self.code = code
18
- self.reason = reason or ""
19
-
20
-
21
- class WebSocket(HTTPConnection):
22
- def __init__(self, scope: Scope, receive: Receive, send: Send) -> None:
23
- super().__init__(scope)
24
- assert scope["type"] == "websocket"
25
- self._receive = receive
26
- self._send = send
27
- self.client_state = WebSocketState.CONNECTING
28
- self.application_state = WebSocketState.CONNECTING
29
-
30
- async def receive(self) -> Message:
31
- """
32
- Receive ASGI websocket messages, ensuring valid state transitions.
33
- """
34
- if self.client_state == WebSocketState.CONNECTING:
35
- message = await self._receive()
36
- message_type = message["type"]
37
- if message_type != "websocket.connect":
38
- raise RuntimeError(
39
- 'Expected ASGI message "websocket.connect", '
40
- f"but got {message_type!r}"
41
- )
42
- self.client_state = WebSocketState.CONNECTED
43
- return message
44
- elif self.client_state == WebSocketState.CONNECTED:
45
- message = await self._receive()
46
- message_type = message["type"]
47
- if message_type not in {"websocket.receive", "websocket.disconnect"}:
48
- raise RuntimeError(
49
- 'Expected ASGI message "websocket.receive" or '
50
- f'"websocket.disconnect", but got {message_type!r}'
51
- )
52
- if message_type == "websocket.disconnect":
53
- self.client_state = WebSocketState.DISCONNECTED
54
- return message
55
- else:
56
- raise RuntimeError(
57
- 'Cannot call "receive" once a disconnect message has been received.'
58
- )
59
-
60
- async def send(self, message: Message) -> None:
61
- """
62
- Send ASGI websocket messages, ensuring valid state transitions.
63
- """
64
- if self.application_state == WebSocketState.CONNECTING:
65
- message_type = message["type"]
66
- if message_type not in {"websocket.accept", "websocket.close"}:
67
- raise RuntimeError(
68
- 'Expected ASGI message "websocket.accept" or '
69
- f'"websocket.close", but got {message_type!r}'
70
- )
71
- if message_type == "websocket.close":
72
- self.application_state = WebSocketState.DISCONNECTED
73
- else:
74
- self.application_state = WebSocketState.CONNECTED
75
- await self._send(message)
76
- elif self.application_state == WebSocketState.CONNECTED:
77
- message_type = message["type"]
78
- if message_type not in {"websocket.send", "websocket.close"}:
79
- raise RuntimeError(
80
- 'Expected ASGI message "websocket.send" or "websocket.close", '
81
- f"but got {message_type!r}"
82
- )
83
- if message_type == "websocket.close":
84
- self.application_state = WebSocketState.DISCONNECTED
85
- await self._send(message)
86
- else:
87
- raise RuntimeError('Cannot call "send" once a close message has been sent.')
88
-
89
- async def accept(
90
- self,
91
- subprotocol: typing.Optional[str] = None,
92
- headers: typing.Optional[typing.Iterable[typing.Tuple[bytes, bytes]]] = None,
93
- ) -> None:
94
- headers = headers or []
95
-
96
- if self.client_state == WebSocketState.CONNECTING:
97
- # If we haven't yet seen the 'connect' message, then wait for it first.
98
- await self.receive()
99
- await self.send(
100
- {"type": "websocket.accept", "subprotocol": subprotocol, "headers": headers}
101
- )
102
-
103
- def _raise_on_disconnect(self, message: Message) -> None:
104
- if message["type"] == "websocket.disconnect":
105
- raise WebSocketDisconnect(message["code"], message.get("reason"))
106
-
107
- async def receive_text(self) -> str:
108
- if self.application_state != WebSocketState.CONNECTED:
109
- raise RuntimeError(
110
- 'WebSocket is not connected. Need to call "accept" first.'
111
- )
112
- message = await self.receive()
113
- self._raise_on_disconnect(message)
114
- return typing.cast(str, message["text"])
115
-
116
- async def receive_bytes(self) -> bytes:
117
- if self.application_state != WebSocketState.CONNECTED:
118
- raise RuntimeError(
119
- 'WebSocket is not connected. Need to call "accept" first.'
120
- )
121
- message = await self.receive()
122
- self._raise_on_disconnect(message)
123
- return typing.cast(bytes, message["bytes"])
124
-
125
- async def receive_json(self, mode: str = "text") -> typing.Any:
126
- if mode not in {"text", "binary"}:
127
- raise RuntimeError('The "mode" argument should be "text" or "binary".')
128
- if self.application_state != WebSocketState.CONNECTED:
129
- raise RuntimeError(
130
- 'WebSocket is not connected. Need to call "accept" first.'
131
- )
132
- message = await self.receive()
133
- self._raise_on_disconnect(message)
134
-
135
- if mode == "text":
136
- text = message["text"]
137
- else:
138
- text = message["bytes"].decode("utf-8")
139
- return json.loads(text)
140
-
141
- async def iter_text(self) -> typing.AsyncIterator[str]:
142
- try:
143
- while True:
144
- yield await self.receive_text()
145
- except WebSocketDisconnect:
146
- pass
147
-
148
- async def iter_bytes(self) -> typing.AsyncIterator[bytes]:
149
- try:
150
- while True:
151
- yield await self.receive_bytes()
152
- except WebSocketDisconnect:
153
- pass
154
-
155
- async def iter_json(self) -> typing.AsyncIterator[typing.Any]:
156
- try:
157
- while True:
158
- yield await self.receive_json()
159
- except WebSocketDisconnect:
160
- pass
161
-
162
- async def send_text(self, data: str) -> None:
163
- await self.send({"type": "websocket.send", "text": data})
164
-
165
- async def send_bytes(self, data: bytes) -> None:
166
- await self.send({"type": "websocket.send", "bytes": data})
167
-
168
- async def send_json(self, data: typing.Any, mode: str = "text") -> None:
169
- if mode not in {"text", "binary"}:
170
- raise RuntimeError('The "mode" argument should be "text" or "binary".')
171
- text = json.dumps(data, separators=(",", ":"), ensure_ascii=False)
172
- if mode == "text":
173
- await self.send({"type": "websocket.send", "text": text})
174
- else:
175
- await self.send({"type": "websocket.send", "bytes": text.encode("utf-8")})
176
-
177
- async def close(
178
- self, code: int = 1000, reason: typing.Optional[str] = None
179
- ) -> None:
180
- await self.send(
181
- {"type": "websocket.close", "code": code, "reason": reason or ""}
182
- )
183
-
184
-
185
- class WebSocketClose:
186
- def __init__(self, code: int = 1000, reason: typing.Optional[str] = None) -> None:
187
- self.code = code
188
- self.reason = reason or ""
189
-
190
- async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
191
- await send(
192
- {"type": "websocket.close", "code": self.code, "reason": self.reason}
193
- )