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
@@ -1,12 +0,0 @@
1
- """
2
- DEPRECATION WARNING:
3
- This module is deprecated as of March 2024 and will not be available after September 2024.
4
- """
5
- from prefect.deprecated.packaging.docker import DockerPackager
6
- from prefect.deprecated.packaging.file import FilePackager
7
- from prefect.deprecated.packaging.orion import OrionPackager
8
-
9
- # isort: split
10
-
11
- # Register any packaging serializers
12
- import prefect.deprecated.packaging.serializers
@@ -1,96 +0,0 @@
1
- """
2
- DEPRECATION WARNING:
3
- This module is deprecated as of March 2024 and will not be available after September 2024.
4
- """
5
-
6
- import abc
7
- from typing import Generic, Type, TypeVar
8
-
9
- from prefect._internal.compatibility.deprecated import deprecated_class
10
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
11
-
12
- if HAS_PYDANTIC_V2:
13
- from pydantic.v1 import BaseModel
14
- else:
15
- from pydantic import BaseModel
16
-
17
- from prefect.flows import Flow
18
- from prefect.utilities.callables import ParameterSchema, parameter_schema
19
- from prefect.utilities.dispatch import lookup_type
20
- from prefect.utilities.pydantic import add_type_dispatch
21
-
22
- D = TypeVar("D")
23
-
24
-
25
- @deprecated_class(start_date="Mar 2024")
26
- @add_type_dispatch
27
- class Serializer(BaseModel, Generic[D], abc.ABC):
28
- """
29
- DEPRECATION WARNING:
30
-
31
- This class is deprecated as of version March 2024 and will not be available after September 2024.
32
-
33
- A serializer that can encode objects of type 'D' into bytes.
34
- """
35
-
36
- type: str
37
-
38
- def dumps(self, obj: D) -> bytes:
39
- """Encode the object into a blob of bytes."""
40
-
41
- def loads(self, blob: bytes) -> D:
42
- """Decode the blob of bytes into an object."""
43
-
44
-
45
- @deprecated_class(start_date="Mar 2024")
46
- @add_type_dispatch
47
- class PackageManifest(BaseModel, abc.ABC):
48
- """
49
- DEPRECATION WARNING:
50
-
51
- This class is deprecated as of version March 2024 and will not be available after September 2024.
52
-
53
- Describes a package.
54
- """
55
-
56
- type: str
57
- flow_name: str
58
- flow_parameter_schema: ParameterSchema
59
-
60
- @abc.abstractmethod
61
- async def unpackage(self) -> Flow:
62
- """
63
- Retrieve a flow from the package.
64
- """
65
-
66
-
67
- @deprecated_class(start_date="Mar 2024")
68
- @add_type_dispatch
69
- class Packager(BaseModel, abc.ABC):
70
- """
71
- DEPRECATION WARNING:
72
-
73
- This class is deprecated as of version March 2024 and will not be available after September 2024.
74
-
75
- Creates a package for a flow.
76
-
77
- A package contains the flow and is typically stored outside of Prefect. To
78
- facilitate interaction with the package, a manifest is returned that describes how
79
- to access and use the package.
80
- """
81
-
82
- type: str
83
-
84
- def base_manifest(self, flow: Flow) -> PackageManifest:
85
- manifest_cls: Type[BaseModel] = lookup_type(PackageManifest, self.type)
86
- return manifest_cls.construct(
87
- type=self.type,
88
- flow_name=flow.name,
89
- flow_parameter_schema=parameter_schema(flow.fn),
90
- )
91
-
92
- @abc.abstractmethod
93
- async def package(self, flow: Flow) -> "PackageManifest":
94
- """
95
- Package a flow and return a manifest describing the created package.
96
- """
@@ -1,146 +0,0 @@
1
- """
2
- DEPRECATION WARNING:
3
- This module is deprecated as of March 2024 and will not be available after September 2024.
4
- """
5
-
6
- import json
7
- import sys
8
- from pathlib import Path
9
- from typing import Any, Mapping, Optional, Union
10
-
11
- from prefect._internal.compatibility.deprecated import deprecated_class
12
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
13
- from prefect._internal.schemas.validators import (
14
- assign_default_base_image,
15
- base_image_xor_dockerfile,
16
- set_default_python_environment,
17
- validate_registry_url,
18
- )
19
-
20
- if HAS_PYDANTIC_V2:
21
- from pydantic.v1 import AnyHttpUrl, root_validator, validator
22
- else:
23
- from pydantic import AnyHttpUrl, root_validator, validator
24
- from typing_extensions import Literal
25
-
26
- from prefect.deprecated.packaging.base import PackageManifest, Packager
27
- from prefect.deprecated.packaging.serializers import SourceSerializer
28
- from prefect.flows import Flow, load_flow_from_script
29
- from prefect.software import CondaEnvironment, PythonEnvironment
30
- from prefect.utilities.asyncutils import run_sync_in_worker_thread
31
- from prefect.utilities.dockerutils import (
32
- ImageBuilder,
33
- build_image,
34
- push_image,
35
- to_run_command,
36
- )
37
- from prefect.utilities.slugify import slugify
38
-
39
-
40
- @deprecated_class(start_date="Mar 2024")
41
- class DockerPackageManifest(PackageManifest):
42
- """
43
- DEPRECATION WARNING:
44
-
45
- This class is deprecated as of version March 2024 and will not be available after September 2024.
46
-
47
- Represents a flow packaged in a Docker image
48
- """
49
-
50
- type: Literal["docker"] = "docker"
51
-
52
- image: str
53
- image_flow_location: str
54
-
55
- async def unpackage(self) -> Flow:
56
- return load_flow_from_script(self.image_flow_location, self.flow_name)
57
-
58
-
59
- @deprecated_class(start_date="Mar 2024")
60
- class DockerPackager(Packager):
61
- """
62
- DEPRECATION WARNING:
63
-
64
- This class is deprecated as of version March 2024 and will not be available after September 2024.
65
-
66
- This packager builds a Docker image containing the flow and the runtime environment
67
- necessary to run the flow. The resulting image is optionally pushed to a container
68
- registry, given by `registry_url`.
69
- """
70
-
71
- type: str = "docker"
72
-
73
- base_image: Optional[str] = None
74
- python_environment: Optional[Union[PythonEnvironment, CondaEnvironment]] = None
75
- dockerfile: Optional[Path] = None
76
- platform: Optional[str] = (None,)
77
- image_flow_location: str = "/flow.py"
78
- registry_url: Optional[AnyHttpUrl] = None
79
-
80
- @root_validator
81
- def set_default_base_image(cls, values):
82
- return assign_default_base_image(values)
83
-
84
- @root_validator
85
- def base_image_and_dockerfile_exclusive(cls, values: Mapping[str, Any]):
86
- return base_image_xor_dockerfile(values)
87
-
88
- @root_validator
89
- def default_python_environment(cls, values: Mapping[str, Any]):
90
- return set_default_python_environment(values)
91
-
92
- @validator("registry_url", pre=True)
93
- def ensure_registry_url_is_prefixed(cls, value):
94
- validate_registry_url(value)
95
-
96
- async def package(self, flow: Flow) -> DockerPackageManifest:
97
- """
98
- Package a flow as a Docker image and, optionally, push it to a registry
99
- """
100
- image_reference = await self._build_image(flow)
101
-
102
- if self.registry_url:
103
- image_name = f"{slugify(flow.name)}"
104
- image_reference = await run_sync_in_worker_thread(
105
- push_image, image_reference, self.registry_url, image_name
106
- )
107
-
108
- return DockerPackageManifest(
109
- **{
110
- **self.base_manifest(flow).dict(),
111
- **{
112
- "image": image_reference,
113
- "image_flow_location": self.image_flow_location,
114
- },
115
- }
116
- )
117
-
118
- async def _build_image(self, flow: Flow) -> str:
119
- if self.dockerfile:
120
- return await self._build_from_dockerfile()
121
- return await self._build_from_base_image(flow)
122
-
123
- async def _build_from_dockerfile(self) -> str:
124
- context = self.dockerfile.resolve().parent
125
- dockerfile = self.dockerfile.relative_to(context)
126
- return await run_sync_in_worker_thread(
127
- build_image,
128
- platform=self.platform,
129
- context=context,
130
- dockerfile=str(dockerfile),
131
- )
132
-
133
- async def _build_from_base_image(self, flow: Flow) -> str:
134
- with ImageBuilder(
135
- base_image=self.base_image, platform=self.platform
136
- ) as builder:
137
- for command in self.python_environment.install_commands():
138
- builder.add_line(to_run_command(command))
139
-
140
- source_info = json.loads(SourceSerializer().dumps(flow))
141
-
142
- builder.write_text(source_info["source"], self.image_flow_location)
143
-
144
- return await run_sync_in_worker_thread(
145
- builder.build, stream_progress_to=sys.stdout
146
- )
@@ -1,92 +0,0 @@
1
- """
2
- DEPRECATION WARNING:
3
- This module is deprecated as of March 2024 and will not be available after September 2024.
4
- """
5
-
6
- from uuid import UUID
7
-
8
- from prefect._internal.compatibility.deprecated import deprecated_class
9
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
10
-
11
- if HAS_PYDANTIC_V2:
12
- from pydantic.v1 import Field
13
- else:
14
- from pydantic import Field
15
-
16
- from typing_extensions import Literal
17
-
18
- from prefect.blocks.core import Block
19
- from prefect.client.orchestration import PrefectClient
20
- from prefect.client.utilities import inject_client
21
- from prefect.deprecated.packaging.base import PackageManifest, Packager, Serializer
22
- from prefect.deprecated.packaging.serializers import SourceSerializer
23
- from prefect.filesystems import LocalFileSystem, ReadableFileSystem, WritableFileSystem
24
- from prefect.flows import Flow
25
- from prefect.settings import PREFECT_HOME
26
- from prefect.utilities.hashing import stable_hash
27
-
28
-
29
- @deprecated_class(start_date="Mar 2024")
30
- class FilePackageManifest(PackageManifest):
31
- """
32
- DEPRECATION WARNING:
33
-
34
- This class is deprecated as of version March 2024 and will not be available after September 2024.
35
- """
36
-
37
- type: str = "file"
38
- serializer: Serializer
39
- key: str
40
- filesystem_id: UUID
41
-
42
- @inject_client
43
- async def unpackage(self, client: PrefectClient) -> Flow:
44
- block_document = await client.read_block_document(self.filesystem_id)
45
- filesystem: ReadableFileSystem = Block._from_block_document(block_document)
46
- content = await filesystem.read_path(self.key)
47
- return self.serializer.loads(content)
48
-
49
-
50
- @deprecated_class(start_date="Mar 2024")
51
- class FilePackager(Packager):
52
- """
53
- DEPRECATION WARNING:
54
-
55
- This class is deprecated as of version March 2024 and will not be available after September 2024.
56
-
57
- This packager stores the flow as a single file.
58
-
59
- By default, the file is the source code of the module the flow is defined in.
60
- Alternative serialization modes are available in `prefect.deprecated.packaging.serializers`.
61
- """
62
-
63
- type: Literal["file"] = "file"
64
- serializer: Serializer = Field(default_factory=SourceSerializer)
65
- filesystem: WritableFileSystem = Field(
66
- default_factory=lambda: LocalFileSystem(
67
- basepath=PREFECT_HOME.value() / "storage"
68
- )
69
- )
70
-
71
- @inject_client
72
- async def package(self, flow: Flow, client: "PrefectClient") -> FilePackageManifest:
73
- content = self.serializer.dumps(flow)
74
- key = stable_hash(content)
75
-
76
- await self.filesystem.write_path(key, content)
77
-
78
- filesystem_id = (
79
- self.filesystem._block_document_id
80
- or await self.filesystem._save(is_anonymous=True)
81
- )
82
-
83
- return FilePackageManifest(
84
- **{
85
- **self.base_manifest(flow).dict(),
86
- **{
87
- "serializer": self.serializer,
88
- "filesystem_id": filesystem_id,
89
- "key": key,
90
- },
91
- }
92
- )
@@ -1,80 +0,0 @@
1
- """
2
- DEPRECATION WARNING:
3
- This module is deprecated as of March 2024 and will not be available after September 2024.
4
- """
5
-
6
- from uuid import UUID
7
-
8
- from prefect._internal.compatibility.deprecated import deprecated_class
9
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
10
-
11
- if HAS_PYDANTIC_V2:
12
- from pydantic.v1 import Field
13
- else:
14
- from pydantic import Field
15
-
16
- from typing_extensions import Literal
17
-
18
- from prefect.blocks.system import JSON
19
- from prefect.client.orchestration import PrefectClient
20
- from prefect.client.utilities import inject_client
21
- from prefect.deprecated.packaging.base import PackageManifest, Packager, Serializer
22
- from prefect.deprecated.packaging.serializers import SourceSerializer
23
- from prefect.flows import Flow
24
-
25
-
26
- @deprecated_class(start_date="Mar 2024")
27
- class OrionPackageManifest(PackageManifest):
28
- """
29
- DEPRECATION WARNING:
30
-
31
- This class is deprecated as of version March 2024 and will not be available after September 2024.
32
- """
33
-
34
- type: str = "orion"
35
- serializer: Serializer
36
- block_document_id: UUID
37
-
38
- @inject_client
39
- async def unpackage(self, client: PrefectClient) -> Flow:
40
- document = await client.read_block_document(self.block_document_id)
41
- block = JSON._from_block_document(document)
42
- serialized_flow: str = block.value["flow"]
43
- # Cast to bytes before deserialization
44
- return self.serializer.loads(serialized_flow.encode())
45
-
46
-
47
- @deprecated_class(start_date="Mar 2024")
48
- class OrionPackager(Packager):
49
- """
50
- DEPRECATION WARNING:
51
-
52
- This class is deprecated as of version March 2024 and will not be available after September 2024.
53
-
54
- This packager stores the flow as an anonymous JSON block in the Prefect database.
55
- The content of the block are encrypted at rest.
56
-
57
- By default, the content is the source code of the module the flow is defined in.
58
- Alternative serialization modes are available in `prefect.deprecated.packaging.serializers`.
59
- """
60
-
61
- type: Literal["orion"] = "orion"
62
- serializer: Serializer = Field(default_factory=SourceSerializer)
63
-
64
- async def package(self, flow: Flow) -> OrionPackageManifest:
65
- """
66
- Package a flow in the Prefect database as an anonymous block.
67
- """
68
- block_document_id = await JSON(
69
- value={"flow": self.serializer.dumps(flow)}
70
- )._save(is_anonymous=True)
71
-
72
- return OrionPackageManifest(
73
- **{
74
- **self.base_manifest(flow).dict(),
75
- **{
76
- "serializer": self.serializer,
77
- "block_document_id": block_document_id,
78
- },
79
- }
80
- )
@@ -1,171 +0,0 @@
1
- """
2
- DEPRECATION WARNING:
3
- This module is deprecated as of March 2024 and will not be available after September 2024.
4
- """
5
-
6
- import base64
7
- import inspect
8
- import json
9
- import os.path
10
- from pathlib import Path
11
- from tempfile import TemporaryDirectory
12
- from typing import Any, List
13
-
14
- from prefect._internal.compatibility.deprecated import deprecated_class
15
- from prefect._internal.pydantic import HAS_PYDANTIC_V2
16
- from prefect._internal.schemas.validators import (
17
- validate_picklelib,
18
- validate_picklelib_and_modules,
19
- validate_picklelib_version,
20
- )
21
-
22
- if HAS_PYDANTIC_V2:
23
- import pydantic.v1 as pydantic
24
- else:
25
- import pydantic
26
-
27
- from typing_extensions import Literal
28
-
29
- from prefect.deprecated.packaging.base import Serializer
30
- from prefect.utilities.importtools import (
31
- from_qualified_name,
32
- load_script_as_module,
33
- to_qualified_name,
34
- )
35
-
36
-
37
- @deprecated_class(start_date="Mar 2024")
38
- class PickleSerializer(Serializer):
39
- """
40
- DEPRECATION WARNING:
41
-
42
- This class is deprecated as of version March 2024 and will not be available after September 2024.
43
-
44
- Serializes objects using the pickle protocol.
45
-
46
- If using cloudpickle, you may specify a list of 'pickle_modules'. These modules will
47
- be serialized by value instead of by reference, which means they do not have to be
48
- installed in the runtime location. This is especially useful for serializing objects
49
- that rely on local packages.
50
-
51
- Wraps pickles in base64 for safe transmission.
52
- """
53
-
54
- type: Literal["pickle"] = "pickle"
55
-
56
- picklelib: str = "cloudpickle"
57
- picklelib_version: str = None
58
-
59
- pickle_modules: List[str] = pydantic.Field(default_factory=list)
60
-
61
- @pydantic.validator("picklelib")
62
- def check_picklelib(cls, value):
63
- return validate_picklelib(value)
64
-
65
- @pydantic.root_validator
66
- def check_picklelib_and_modules(cls, values):
67
- return validate_picklelib_and_modules(values)
68
-
69
- @pydantic.root_validator
70
- def check_picklelib_version(cls, values):
71
- return validate_picklelib_version(values)
72
-
73
- def dumps(self, obj: Any) -> bytes:
74
- pickler = from_qualified_name(self.picklelib)
75
-
76
- for module in self.pickle_modules:
77
- pickler.register_pickle_by_value(from_qualified_name(module))
78
-
79
- blob = pickler.dumps(obj)
80
-
81
- for module in self.pickle_modules:
82
- # Restore the pickler settings
83
- pickler.unregister_pickle_by_value(from_qualified_name(module))
84
-
85
- return base64.encodebytes(blob)
86
-
87
- def loads(self, blob: bytes) -> Any:
88
- pickler = from_qualified_name(self.picklelib)
89
- return pickler.loads(base64.decodebytes(blob))
90
-
91
-
92
- @deprecated_class(start_date="Mar 2024")
93
- class SourceSerializer(Serializer):
94
- """
95
- DEPRECATION WARNING:
96
-
97
- This class is deprecated as of version March 2024 and will not be available after September 2024.
98
-
99
- Serializes objects by retrieving the source code of the module they are defined in.
100
-
101
- Creates a JSON blob with keys:
102
- source: The source code
103
- file_name: The name of the file the source was in
104
- symbol_name: The name of the object to extract from the source code
105
-
106
- Deserialization requires the code to run with `exec`.
107
- """
108
-
109
- type: Literal["source"] = "source"
110
-
111
- def dumps(self, obj: Any) -> bytes:
112
- module = inspect.getmodule(obj)
113
-
114
- if module is None:
115
- raise ValueError(f"Cannot determine source module for object: {obj!r}.")
116
-
117
- if not getattr(module, "__file__", None):
118
- raise ValueError(
119
- f"Found module {module!r} without source code file while serializing "
120
- f"object: {obj!r}."
121
- )
122
-
123
- source = inspect.getsource(module)
124
-
125
- return json.dumps(
126
- {
127
- "source": source,
128
- "file_name": os.path.basename(module.__file__),
129
- "symbol_name": obj.__name__,
130
- }
131
- ).encode()
132
-
133
- def loads(self, blob: bytes) -> Any:
134
- document = json.loads(blob)
135
- if not isinstance(document, dict) or set(document.keys()) != {
136
- "source",
137
- "file_name",
138
- "symbol_name",
139
- }:
140
- raise ValueError(
141
- "Invalid serialized data. "
142
- "Expected dictionary with keys 'source', 'file_name', and "
143
- "'symbol_name'. "
144
- f"Got: {document}"
145
- )
146
-
147
- with TemporaryDirectory() as tmpdir:
148
- temp_script = Path(tmpdir) / document["file_name"]
149
- temp_script.write_text(document["source"])
150
- module = load_script_as_module(str(temp_script))
151
-
152
- return getattr(module, document["symbol_name"])
153
-
154
-
155
- @deprecated_class(start_date="Mar 2024")
156
- class ImportSerializer(Serializer):
157
- """
158
- DEPRECATION WARNING:
159
-
160
- This class is deprecated as of version March 2024 and will not be available after September 2024.
161
-
162
- Serializes objects by storing their importable path.
163
- """
164
-
165
- type: Literal["import"] = "import"
166
-
167
- def dumps(self, obj: Any) -> bytes:
168
- return to_qualified_name(obj).encode()
169
-
170
- def loads(self, blob: bytes) -> Any:
171
- return from_qualified_name(blob.decode())