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.
- prefect/__init__.py +74 -110
- prefect/_internal/compatibility/deprecated.py +6 -115
- prefect/_internal/compatibility/experimental.py +4 -79
- prefect/_internal/compatibility/migration.py +166 -0
- prefect/_internal/concurrency/__init__.py +2 -2
- prefect/_internal/concurrency/api.py +1 -35
- prefect/_internal/concurrency/calls.py +0 -6
- prefect/_internal/concurrency/cancellation.py +0 -3
- prefect/_internal/concurrency/event_loop.py +0 -20
- prefect/_internal/concurrency/inspection.py +3 -3
- prefect/_internal/concurrency/primitives.py +1 -0
- prefect/_internal/concurrency/services.py +23 -0
- prefect/_internal/concurrency/threads.py +35 -0
- prefect/_internal/concurrency/waiters.py +0 -28
- prefect/_internal/integrations.py +7 -0
- prefect/_internal/pydantic/__init__.py +0 -45
- prefect/_internal/pydantic/annotations/pendulum.py +2 -2
- prefect/_internal/pydantic/v1_schema.py +21 -22
- prefect/_internal/pydantic/v2_schema.py +0 -2
- prefect/_internal/pydantic/v2_validated_func.py +18 -23
- prefect/_internal/pytz.py +1 -1
- prefect/_internal/retries.py +61 -0
- prefect/_internal/schemas/bases.py +45 -177
- prefect/_internal/schemas/fields.py +1 -43
- prefect/_internal/schemas/validators.py +47 -233
- prefect/agent.py +3 -695
- prefect/artifacts.py +173 -14
- prefect/automations.py +39 -4
- prefect/blocks/abstract.py +1 -1
- prefect/blocks/core.py +405 -153
- prefect/blocks/fields.py +2 -57
- prefect/blocks/notifications.py +43 -28
- prefect/blocks/redis.py +168 -0
- prefect/blocks/system.py +67 -20
- prefect/blocks/webhook.py +2 -9
- prefect/cache_policies.py +239 -0
- prefect/client/__init__.py +4 -0
- prefect/client/base.py +33 -27
- prefect/client/cloud.py +65 -20
- prefect/client/collections.py +1 -1
- prefect/client/orchestration.py +650 -442
- prefect/client/schemas/actions.py +115 -100
- prefect/client/schemas/filters.py +46 -52
- prefect/client/schemas/objects.py +228 -178
- prefect/client/schemas/responses.py +18 -36
- prefect/client/schemas/schedules.py +55 -36
- prefect/client/schemas/sorting.py +2 -0
- prefect/client/subscriptions.py +8 -7
- prefect/client/types/flexible_schedule_list.py +11 -0
- prefect/client/utilities.py +9 -6
- prefect/concurrency/asyncio.py +60 -11
- prefect/concurrency/context.py +24 -0
- prefect/concurrency/events.py +2 -2
- prefect/concurrency/services.py +46 -16
- prefect/concurrency/sync.py +51 -7
- prefect/concurrency/v1/asyncio.py +143 -0
- prefect/concurrency/v1/context.py +27 -0
- prefect/concurrency/v1/events.py +61 -0
- prefect/concurrency/v1/services.py +116 -0
- prefect/concurrency/v1/sync.py +92 -0
- prefect/context.py +246 -149
- prefect/deployments/__init__.py +33 -18
- prefect/deployments/base.py +10 -15
- prefect/deployments/deployments.py +2 -1048
- prefect/deployments/flow_runs.py +178 -0
- prefect/deployments/runner.py +72 -173
- prefect/deployments/schedules.py +31 -25
- prefect/deployments/steps/__init__.py +0 -1
- prefect/deployments/steps/core.py +7 -0
- prefect/deployments/steps/pull.py +15 -21
- prefect/deployments/steps/utility.py +2 -1
- prefect/docker/__init__.py +20 -0
- prefect/docker/docker_image.py +82 -0
- prefect/engine.py +15 -2475
- prefect/events/actions.py +17 -23
- prefect/events/cli/automations.py +20 -7
- prefect/events/clients.py +142 -80
- prefect/events/filters.py +14 -18
- prefect/events/related.py +74 -75
- prefect/events/schemas/__init__.py +0 -5
- prefect/events/schemas/automations.py +55 -46
- prefect/events/schemas/deployment_triggers.py +7 -197
- prefect/events/schemas/events.py +46 -65
- prefect/events/schemas/labelling.py +10 -14
- prefect/events/utilities.py +4 -5
- prefect/events/worker.py +23 -8
- prefect/exceptions.py +15 -0
- prefect/filesystems.py +30 -529
- prefect/flow_engine.py +827 -0
- prefect/flow_runs.py +379 -7
- prefect/flows.py +470 -360
- prefect/futures.py +382 -331
- prefect/infrastructure/__init__.py +5 -26
- prefect/infrastructure/base.py +3 -320
- prefect/infrastructure/provisioners/__init__.py +5 -3
- prefect/infrastructure/provisioners/cloud_run.py +13 -8
- prefect/infrastructure/provisioners/container_instance.py +14 -9
- prefect/infrastructure/provisioners/ecs.py +10 -8
- prefect/infrastructure/provisioners/modal.py +8 -5
- prefect/input/__init__.py +4 -0
- prefect/input/actions.py +2 -4
- prefect/input/run_input.py +9 -9
- prefect/logging/formatters.py +2 -4
- prefect/logging/handlers.py +9 -14
- prefect/logging/loggers.py +5 -5
- prefect/main.py +72 -0
- prefect/plugins.py +2 -64
- prefect/profiles.toml +16 -2
- prefect/records/__init__.py +1 -0
- prefect/records/base.py +223 -0
- prefect/records/filesystem.py +207 -0
- prefect/records/memory.py +178 -0
- prefect/records/result_store.py +64 -0
- prefect/results.py +577 -504
- prefect/runner/runner.py +117 -47
- prefect/runner/server.py +32 -34
- prefect/runner/storage.py +3 -12
- prefect/runner/submit.py +2 -10
- prefect/runner/utils.py +2 -2
- prefect/runtime/__init__.py +1 -0
- prefect/runtime/deployment.py +1 -0
- prefect/runtime/flow_run.py +40 -5
- prefect/runtime/task_run.py +1 -0
- prefect/serializers.py +28 -39
- prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
- prefect/settings.py +209 -332
- prefect/states.py +160 -63
- prefect/task_engine.py +1478 -57
- prefect/task_runners.py +383 -287
- prefect/task_runs.py +240 -0
- prefect/task_worker.py +463 -0
- prefect/tasks.py +684 -374
- prefect/transactions.py +410 -0
- prefect/types/__init__.py +72 -86
- prefect/types/entrypoint.py +13 -0
- prefect/utilities/annotations.py +4 -3
- prefect/utilities/asyncutils.py +227 -148
- prefect/utilities/callables.py +137 -45
- prefect/utilities/collections.py +134 -86
- prefect/utilities/dispatch.py +27 -14
- prefect/utilities/dockerutils.py +11 -4
- prefect/utilities/engine.py +186 -32
- prefect/utilities/filesystem.py +4 -5
- prefect/utilities/importtools.py +26 -27
- prefect/utilities/pydantic.py +128 -38
- prefect/utilities/schema_tools/hydration.py +18 -1
- prefect/utilities/schema_tools/validation.py +30 -0
- prefect/utilities/services.py +35 -9
- prefect/utilities/templating.py +12 -2
- prefect/utilities/timeout.py +20 -5
- prefect/utilities/urls.py +195 -0
- prefect/utilities/visualization.py +1 -0
- prefect/variables.py +78 -59
- prefect/workers/__init__.py +0 -1
- prefect/workers/base.py +237 -244
- prefect/workers/block.py +5 -226
- prefect/workers/cloud.py +6 -0
- prefect/workers/process.py +265 -12
- prefect/workers/server.py +29 -11
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/METADATA +28 -24
- prefect_client-3.0.0.dist-info/RECORD +201 -0
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/WHEEL +1 -1
- prefect/_internal/pydantic/_base_model.py +0 -51
- prefect/_internal/pydantic/_compat.py +0 -82
- prefect/_internal/pydantic/_flags.py +0 -20
- prefect/_internal/pydantic/_types.py +0 -8
- prefect/_internal/pydantic/utilities/config_dict.py +0 -72
- prefect/_internal/pydantic/utilities/field_validator.py +0 -150
- prefect/_internal/pydantic/utilities/model_construct.py +0 -56
- prefect/_internal/pydantic/utilities/model_copy.py +0 -55
- prefect/_internal/pydantic/utilities/model_dump.py +0 -136
- prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
- prefect/_internal/pydantic/utilities/model_fields.py +0 -50
- prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
- prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
- prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
- prefect/_internal/pydantic/utilities/model_validate.py +0 -75
- prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
- prefect/_internal/pydantic/utilities/model_validator.py +0 -87
- prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
- prefect/_vendor/fastapi/__init__.py +0 -25
- prefect/_vendor/fastapi/applications.py +0 -946
- prefect/_vendor/fastapi/background.py +0 -3
- prefect/_vendor/fastapi/concurrency.py +0 -44
- prefect/_vendor/fastapi/datastructures.py +0 -58
- prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
- prefect/_vendor/fastapi/dependencies/models.py +0 -64
- prefect/_vendor/fastapi/dependencies/utils.py +0 -877
- prefect/_vendor/fastapi/encoders.py +0 -177
- prefect/_vendor/fastapi/exception_handlers.py +0 -40
- prefect/_vendor/fastapi/exceptions.py +0 -46
- prefect/_vendor/fastapi/logger.py +0 -3
- prefect/_vendor/fastapi/middleware/__init__.py +0 -1
- prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
- prefect/_vendor/fastapi/middleware/cors.py +0 -3
- prefect/_vendor/fastapi/middleware/gzip.py +0 -3
- prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
- prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
- prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
- prefect/_vendor/fastapi/openapi/__init__.py +0 -0
- prefect/_vendor/fastapi/openapi/constants.py +0 -2
- prefect/_vendor/fastapi/openapi/docs.py +0 -203
- prefect/_vendor/fastapi/openapi/models.py +0 -480
- prefect/_vendor/fastapi/openapi/utils.py +0 -485
- prefect/_vendor/fastapi/param_functions.py +0 -340
- prefect/_vendor/fastapi/params.py +0 -453
- prefect/_vendor/fastapi/py.typed +0 -0
- prefect/_vendor/fastapi/requests.py +0 -4
- prefect/_vendor/fastapi/responses.py +0 -40
- prefect/_vendor/fastapi/routing.py +0 -1331
- prefect/_vendor/fastapi/security/__init__.py +0 -15
- prefect/_vendor/fastapi/security/api_key.py +0 -98
- prefect/_vendor/fastapi/security/base.py +0 -6
- prefect/_vendor/fastapi/security/http.py +0 -172
- prefect/_vendor/fastapi/security/oauth2.py +0 -227
- prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
- prefect/_vendor/fastapi/security/utils.py +0 -10
- prefect/_vendor/fastapi/staticfiles.py +0 -1
- prefect/_vendor/fastapi/templating.py +0 -3
- prefect/_vendor/fastapi/testclient.py +0 -1
- prefect/_vendor/fastapi/types.py +0 -3
- prefect/_vendor/fastapi/utils.py +0 -235
- prefect/_vendor/fastapi/websockets.py +0 -7
- prefect/_vendor/starlette/__init__.py +0 -1
- prefect/_vendor/starlette/_compat.py +0 -28
- prefect/_vendor/starlette/_exception_handler.py +0 -80
- prefect/_vendor/starlette/_utils.py +0 -88
- prefect/_vendor/starlette/applications.py +0 -261
- prefect/_vendor/starlette/authentication.py +0 -159
- prefect/_vendor/starlette/background.py +0 -43
- prefect/_vendor/starlette/concurrency.py +0 -59
- prefect/_vendor/starlette/config.py +0 -151
- prefect/_vendor/starlette/convertors.py +0 -87
- prefect/_vendor/starlette/datastructures.py +0 -707
- prefect/_vendor/starlette/endpoints.py +0 -130
- prefect/_vendor/starlette/exceptions.py +0 -60
- prefect/_vendor/starlette/formparsers.py +0 -276
- prefect/_vendor/starlette/middleware/__init__.py +0 -17
- prefect/_vendor/starlette/middleware/authentication.py +0 -52
- prefect/_vendor/starlette/middleware/base.py +0 -220
- prefect/_vendor/starlette/middleware/cors.py +0 -176
- prefect/_vendor/starlette/middleware/errors.py +0 -265
- prefect/_vendor/starlette/middleware/exceptions.py +0 -74
- prefect/_vendor/starlette/middleware/gzip.py +0 -113
- prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
- prefect/_vendor/starlette/middleware/sessions.py +0 -82
- prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
- prefect/_vendor/starlette/middleware/wsgi.py +0 -147
- prefect/_vendor/starlette/py.typed +0 -0
- prefect/_vendor/starlette/requests.py +0 -328
- prefect/_vendor/starlette/responses.py +0 -347
- prefect/_vendor/starlette/routing.py +0 -933
- prefect/_vendor/starlette/schemas.py +0 -154
- prefect/_vendor/starlette/staticfiles.py +0 -248
- prefect/_vendor/starlette/status.py +0 -199
- prefect/_vendor/starlette/templating.py +0 -231
- prefect/_vendor/starlette/testclient.py +0 -804
- prefect/_vendor/starlette/types.py +0 -30
- prefect/_vendor/starlette/websockets.py +0 -193
- prefect/blocks/kubernetes.py +0 -119
- prefect/deprecated/__init__.py +0 -0
- prefect/deprecated/data_documents.py +0 -350
- prefect/deprecated/packaging/__init__.py +0 -12
- prefect/deprecated/packaging/base.py +0 -96
- prefect/deprecated/packaging/docker.py +0 -146
- prefect/deprecated/packaging/file.py +0 -92
- prefect/deprecated/packaging/orion.py +0 -80
- prefect/deprecated/packaging/serializers.py +0 -171
- prefect/events/instrument.py +0 -135
- prefect/infrastructure/container.py +0 -824
- prefect/infrastructure/kubernetes.py +0 -920
- prefect/infrastructure/process.py +0 -289
- prefect/manifests.py +0 -20
- prefect/new_flow_engine.py +0 -449
- prefect/new_task_engine.py +0 -423
- prefect/pydantic/__init__.py +0 -76
- prefect/pydantic/main.py +0 -39
- prefect/software/__init__.py +0 -2
- prefect/software/base.py +0 -50
- prefect/software/conda.py +0 -199
- prefect/software/pip.py +0 -122
- prefect/software/python.py +0 -52
- prefect/task_server.py +0 -322
- prefect_client-2.20.4.dist-info/RECORD +0 -294
- /prefect/{_internal/pydantic/utilities → client/types}/__init__.py +0 -0
- /prefect/{_vendor → concurrency/v1}/__init__.py +0 -0
- {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
- {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())
|