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
@@ -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
- )