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
prefect/__init__.py
CHANGED
@@ -5,8 +5,7 @@
|
|
5
5
|
from . import _version
|
6
6
|
import importlib
|
7
7
|
import pathlib
|
8
|
-
import
|
9
|
-
import sys
|
8
|
+
from typing import TYPE_CHECKING, Any
|
10
9
|
|
11
10
|
__version_info__ = _version.get_versions()
|
12
11
|
__version__ = __version_info__["version"]
|
@@ -25,113 +24,53 @@ __ui_static_path__ = __module_path__ / "server" / "ui"
|
|
25
24
|
|
26
25
|
del _version, pathlib
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
)
|
69
|
-
|
70
|
-
|
71
|
-
)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
# Configure logging
|
77
|
-
import prefect.logging.configuration
|
78
|
-
|
79
|
-
prefect.logging.configuration.setup_logging()
|
80
|
-
prefect.logging.get_logger("profiles").debug(
|
81
|
-
f"Using profile {prefect.context.get_settings_context().profile.name!r}"
|
82
|
-
)
|
83
|
-
|
84
|
-
# Ensure moved names are accessible at old locations
|
85
|
-
import prefect.client
|
86
|
-
|
87
|
-
prefect.client.get_client = get_client
|
88
|
-
prefect.client.PrefectClient = PrefectClient
|
89
|
-
|
90
|
-
|
91
|
-
from prefect._internal.compatibility.deprecated import (
|
92
|
-
inject_renamed_module_alias_finder,
|
93
|
-
register_renamed_module,
|
94
|
-
)
|
95
|
-
|
96
|
-
register_renamed_module(
|
97
|
-
"prefect.packaging", "prefect.deprecated.packaging", start_date="Mar 2024"
|
98
|
-
)
|
99
|
-
inject_renamed_module_alias_finder()
|
100
|
-
|
101
|
-
|
102
|
-
# Attempt to warn users who are importing Prefect 1.x attributes that they may
|
103
|
-
# have accidentally installed Prefect 2.x
|
104
|
-
|
105
|
-
PREFECT_1_ATTRIBUTES = [
|
106
|
-
"prefect.Client",
|
107
|
-
"prefect.Parameter",
|
108
|
-
"prefect.api",
|
109
|
-
"prefect.apply_map",
|
110
|
-
"prefect.case",
|
111
|
-
"prefect.config",
|
112
|
-
"prefect.context",
|
113
|
-
"prefect.flatten",
|
114
|
-
"prefect.mapped",
|
115
|
-
"prefect.models",
|
116
|
-
"prefect.resource_manager",
|
117
|
-
]
|
118
|
-
|
119
|
-
|
120
|
-
class Prefect1ImportInterceptor(importlib.abc.Loader):
|
121
|
-
def find_spec(self, fullname, path, target=None):
|
122
|
-
if fullname in PREFECT_1_ATTRIBUTES:
|
123
|
-
warnings.warn(
|
124
|
-
f"Attempted import of {fullname!r}, which is part of Prefect 1.x, while"
|
125
|
-
f" Prefect {__version__} is installed. If you're upgrading you'll need"
|
126
|
-
" to update your code, see the Prefect 2.x migration guide:"
|
127
|
-
" `https://orion-docs.prefect.io/migration_guide/`. Otherwise ensure"
|
128
|
-
" that your code is pinned to the expected version."
|
129
|
-
)
|
130
|
-
|
131
|
-
|
132
|
-
if not hasattr(sys, "frozen"):
|
133
|
-
sys.meta_path.insert(0, Prefect1ImportInterceptor())
|
134
|
-
|
27
|
+
if TYPE_CHECKING:
|
28
|
+
from .main import (
|
29
|
+
allow_failure,
|
30
|
+
flow,
|
31
|
+
Flow,
|
32
|
+
get_client,
|
33
|
+
get_run_logger,
|
34
|
+
State,
|
35
|
+
tags,
|
36
|
+
task,
|
37
|
+
Task,
|
38
|
+
Transaction,
|
39
|
+
unmapped,
|
40
|
+
serve,
|
41
|
+
deploy,
|
42
|
+
pause_flow_run,
|
43
|
+
resume_flow_run,
|
44
|
+
suspend_flow_run,
|
45
|
+
)
|
46
|
+
|
47
|
+
_slots: dict[str, Any] = {
|
48
|
+
"__version_info__": __version_info__,
|
49
|
+
"__version__": __version__,
|
50
|
+
"__module_path__": __module_path__,
|
51
|
+
"__development_base_path__": __development_base_path__,
|
52
|
+
"__ui_static_subpath__": __ui_static_subpath__,
|
53
|
+
"__ui_static_path__": __ui_static_path__,
|
54
|
+
}
|
55
|
+
|
56
|
+
_public_api: dict[str, tuple[str, str]] = {
|
57
|
+
"allow_failure": (__spec__.parent, ".main"),
|
58
|
+
"flow": (__spec__.parent, ".main"),
|
59
|
+
"Flow": (__spec__.parent, ".main"),
|
60
|
+
"get_client": (__spec__.parent, ".main"),
|
61
|
+
"get_run_logger": (__spec__.parent, ".main"),
|
62
|
+
"State": (__spec__.parent, ".main"),
|
63
|
+
"tags": (__spec__.parent, ".main"),
|
64
|
+
"task": (__spec__.parent, ".main"),
|
65
|
+
"Task": (__spec__.parent, ".main"),
|
66
|
+
"Transaction": (__spec__.parent, ".main"),
|
67
|
+
"unmapped": (__spec__.parent, ".main"),
|
68
|
+
"serve": (__spec__.parent, ".main"),
|
69
|
+
"deploy": (__spec__.parent, ".main"),
|
70
|
+
"pause_flow_run": (__spec__.parent, ".main"),
|
71
|
+
"resume_flow_run": (__spec__.parent, ".main"),
|
72
|
+
"suspend_flow_run": (__spec__.parent, ".main"),
|
73
|
+
}
|
135
74
|
|
136
75
|
# Declare API for type-checkers
|
137
76
|
__all__ = [
|
@@ -140,15 +79,40 @@ __all__ = [
|
|
140
79
|
"Flow",
|
141
80
|
"get_client",
|
142
81
|
"get_run_logger",
|
143
|
-
"Manifest",
|
144
82
|
"State",
|
145
83
|
"tags",
|
146
84
|
"task",
|
147
85
|
"Task",
|
86
|
+
"Transaction",
|
148
87
|
"unmapped",
|
149
88
|
"serve",
|
150
89
|
"deploy",
|
151
90
|
"pause_flow_run",
|
152
91
|
"resume_flow_run",
|
153
92
|
"suspend_flow_run",
|
93
|
+
"__version_info__",
|
94
|
+
"__version__",
|
95
|
+
"__module_path__",
|
96
|
+
"__development_base_path__",
|
97
|
+
"__ui_static_subpath__",
|
98
|
+
"__ui_static_path__",
|
154
99
|
]
|
100
|
+
|
101
|
+
|
102
|
+
def __getattr__(attr_name: str) -> object:
|
103
|
+
if attr_name in _slots:
|
104
|
+
return _slots[attr_name]
|
105
|
+
|
106
|
+
dynamic_attr = _public_api.get(attr_name)
|
107
|
+
if dynamic_attr is None:
|
108
|
+
return importlib.import_module(f".{attr_name}", package=__name__)
|
109
|
+
|
110
|
+
package, module_name = dynamic_attr
|
111
|
+
|
112
|
+
from importlib import import_module
|
113
|
+
|
114
|
+
if module_name == "__module__":
|
115
|
+
return import_module(f".{attr_name}", package=package)
|
116
|
+
else:
|
117
|
+
module = import_module(module_name, package=package)
|
118
|
+
return getattr(module, attr_name)
|
@@ -9,21 +9,14 @@ Deprecated items require a start or end date. If a start date is given, the end
|
|
9
9
|
will be calculated 6 months later. Start and end dates are always in the format MMM YYYY
|
10
10
|
e.g. Jan 2023.
|
11
11
|
"""
|
12
|
+
|
12
13
|
import functools
|
13
14
|
import sys
|
14
15
|
import warnings
|
15
|
-
from typing import Any, Callable,
|
16
|
+
from typing import Any, Callable, List, Optional, Type, TypeVar
|
16
17
|
|
17
18
|
import pendulum
|
18
|
-
|
19
|
-
from prefect._internal.pydantic import HAS_PYDANTIC_V2
|
20
|
-
|
21
|
-
if HAS_PYDANTIC_V2:
|
22
|
-
from pydantic.v1 import BaseModel, Field, root_validator
|
23
|
-
from pydantic.v1.schema import default_ref_template
|
24
|
-
else:
|
25
|
-
from pydantic import BaseModel, Field, root_validator
|
26
|
-
from pydantic.schema import default_ref_template
|
19
|
+
from pydantic import BaseModel
|
27
20
|
|
28
21
|
from prefect.utilities.callables import get_call_parameters
|
29
22
|
from prefect.utilities.importtools import (
|
@@ -237,9 +230,10 @@ def deprecated_field(
|
|
237
230
|
|
238
231
|
cls_init(__pydantic_self__, **data)
|
239
232
|
|
240
|
-
field = __pydantic_self__.
|
233
|
+
field = __pydantic_self__.model_fields.get(name)
|
241
234
|
if field is not None:
|
242
|
-
field.
|
235
|
+
field.json_schema_extra = field.json_schema_extra or {}
|
236
|
+
field.json_schema_extra["deprecated"] = True
|
243
237
|
|
244
238
|
# Patch the model's init method
|
245
239
|
model_cls.__init__ = __init__
|
@@ -278,106 +272,3 @@ def register_renamed_module(old_name: str, new_name: str, start_date: str):
|
|
278
272
|
DEPRECATED_MODULE_ALIASES.append(
|
279
273
|
AliasedModuleDefinition(old_name, new_name, callback)
|
280
274
|
)
|
281
|
-
|
282
|
-
|
283
|
-
class DeprecatedInfraOverridesField(BaseModel):
|
284
|
-
"""
|
285
|
-
A model mixin that handles the deprecated `infra_overrides` field.
|
286
|
-
|
287
|
-
The `infra_overrides` field has been renamed to `job_variables`. This mixin maintains
|
288
|
-
backwards compatibility with users of the `infra_overrides` field while presenting
|
289
|
-
`job_variables` as the user-facing field.
|
290
|
-
|
291
|
-
When we remove support for `infra_overrides`, we can remove this class as a parent of
|
292
|
-
all schemas that use it, leaving them with only the `job_variables` field.
|
293
|
-
"""
|
294
|
-
|
295
|
-
infra_overrides: Optional[Dict[str, Any]] = Field(
|
296
|
-
default_factory=dict,
|
297
|
-
description="Deprecated field. Use `job_variables` instead.",
|
298
|
-
)
|
299
|
-
|
300
|
-
@root_validator(pre=True)
|
301
|
-
def _job_variables_from_infra_overrides(
|
302
|
-
cls, values: Dict[str, Any]
|
303
|
-
) -> Dict[str, Any]:
|
304
|
-
"""
|
305
|
-
Validate that only one of `infra_overrides` or `job_variables` is used
|
306
|
-
and keep them in sync during init.
|
307
|
-
"""
|
308
|
-
job_variables = values.get("job_variables")
|
309
|
-
infra_overrides = values.get("infra_overrides")
|
310
|
-
|
311
|
-
if job_variables is not None and infra_overrides is not None:
|
312
|
-
if job_variables != infra_overrides:
|
313
|
-
raise ValueError(
|
314
|
-
"The `infra_overrides` field has been renamed to `job_variables`."
|
315
|
-
"Use one of these fields, but not both."
|
316
|
-
)
|
317
|
-
return values
|
318
|
-
elif job_variables is not None and infra_overrides is None:
|
319
|
-
values["infra_overrides"] = job_variables
|
320
|
-
elif job_variables is None and infra_overrides is not None:
|
321
|
-
values["job_variables"] = infra_overrides
|
322
|
-
return values
|
323
|
-
|
324
|
-
def __setattr__(self, key: str, value: Any) -> None:
|
325
|
-
"""
|
326
|
-
Override the default __setattr__ to ensure that setting `infra_overrides` or
|
327
|
-
`job_variables` will update both fields.
|
328
|
-
"""
|
329
|
-
if key == "infra_overrides" or key == "job_variables":
|
330
|
-
updates = {"infra_overrides": value, "job_variables": value}
|
331
|
-
self.__dict__.update(updates)
|
332
|
-
return
|
333
|
-
super().__setattr__(key, value)
|
334
|
-
|
335
|
-
def dict(self, **kwargs) -> Dict[str, Any]:
|
336
|
-
"""
|
337
|
-
Override the default dict method to ensure only `infra_overrides` is serialized.
|
338
|
-
This preserves backwards compatibility for newer clients talking to older servers.
|
339
|
-
"""
|
340
|
-
exclude: Union[set, Dict[str, Any]] = kwargs.pop("exclude", set())
|
341
|
-
exclude_type = type(exclude)
|
342
|
-
|
343
|
-
if exclude_type is set:
|
344
|
-
exclude.add("job_variables")
|
345
|
-
elif exclude_type is dict:
|
346
|
-
exclude["job_variables"] = True
|
347
|
-
else:
|
348
|
-
exclude = {"job_variables"}
|
349
|
-
kwargs["exclude"] = exclude
|
350
|
-
|
351
|
-
return super().dict(**kwargs)
|
352
|
-
|
353
|
-
@classmethod
|
354
|
-
def schema(
|
355
|
-
cls, by_alias: bool = True, ref_template: str = default_ref_template
|
356
|
-
) -> Dict[str, Any]:
|
357
|
-
"""
|
358
|
-
Don't use the mixin docstring as the description if this class is missing a
|
359
|
-
docstring.
|
360
|
-
"""
|
361
|
-
schema = super().schema(by_alias=by_alias, ref_template=ref_template)
|
362
|
-
|
363
|
-
if not cls.__doc__:
|
364
|
-
schema.pop("description", None)
|
365
|
-
|
366
|
-
return schema
|
367
|
-
|
368
|
-
|
369
|
-
def handle_deprecated_infra_overrides_parameter(
|
370
|
-
job_variables: Dict[str, Any], infra_overrides: Dict[str, Any]
|
371
|
-
) -> Optional[Dict[str, Any]]:
|
372
|
-
if infra_overrides is not None and job_variables is not None:
|
373
|
-
raise RuntimeError(
|
374
|
-
"The `infra_overrides` argument has been renamed to `job_variables`."
|
375
|
-
"Use one or the other, but not both."
|
376
|
-
)
|
377
|
-
elif infra_overrides is not None and job_variables is None:
|
378
|
-
jv = infra_overrides
|
379
|
-
elif job_variables is not None and infra_overrides is None:
|
380
|
-
jv = job_variables
|
381
|
-
else:
|
382
|
-
jv = None
|
383
|
-
return jv
|
@@ -13,21 +13,11 @@ Some experimental features require opt-in to enable any usage. These require the
|
|
13
13
|
|
14
14
|
import functools
|
15
15
|
import warnings
|
16
|
-
from typing import Any, Callable, Optional, Set,
|
16
|
+
from typing import Any, Callable, Optional, Set, TypeVar
|
17
17
|
|
18
|
-
|
18
|
+
import pydantic
|
19
19
|
|
20
|
-
|
21
|
-
import pydantic.v1 as pydantic
|
22
|
-
else:
|
23
|
-
import pydantic
|
24
|
-
|
25
|
-
from prefect.settings import (
|
26
|
-
PREFECT_EXPERIMENTAL_WARN,
|
27
|
-
SETTING_VARIABLES,
|
28
|
-
Setting,
|
29
|
-
automation_settings_enabled,
|
30
|
-
)
|
20
|
+
from prefect.settings import PREFECT_EXPERIMENTAL_WARN, SETTING_VARIABLES, Setting
|
31
21
|
from prefect.utilities.callables import get_call_parameters
|
32
22
|
|
33
23
|
T = TypeVar("T", bound=Callable[..., Any])
|
@@ -194,77 +184,12 @@ def experimental_parameter(
|
|
194
184
|
return decorator
|
195
185
|
|
196
186
|
|
197
|
-
def experimental_field(
|
198
|
-
name: str,
|
199
|
-
*,
|
200
|
-
group: str,
|
201
|
-
help: str = "",
|
202
|
-
stacklevel: int = 2,
|
203
|
-
opt_in: bool = False,
|
204
|
-
when: Optional[Callable[[Any], bool]] = None,
|
205
|
-
):
|
206
|
-
"""
|
207
|
-
Mark a field in a Pydantic model as experimental.
|
208
|
-
|
209
|
-
Raises warning only if the field is specified during init.
|
210
|
-
|
211
|
-
Example:
|
212
|
-
|
213
|
-
```python
|
214
|
-
|
215
|
-
@experimental_parameter("y", group="example", when=lambda y: y is not None)
|
216
|
-
def foo(x, y = None):
|
217
|
-
return x + 1 + (y or 0)
|
218
|
-
```
|
219
|
-
"""
|
220
|
-
|
221
|
-
when = when or (lambda _: True)
|
222
|
-
|
223
|
-
@experimental(
|
224
|
-
group=group,
|
225
|
-
feature=f"The field {name!r}",
|
226
|
-
help=help,
|
227
|
-
opt_in=opt_in,
|
228
|
-
stacklevel=stacklevel + 2,
|
229
|
-
)
|
230
|
-
def experimental_check():
|
231
|
-
"""Utility function for performing a warning check for the specified group"""
|
232
|
-
|
233
|
-
# Replaces the model's __init__ method with one that performs an additional warning
|
234
|
-
# check
|
235
|
-
def decorator(model_cls: Type[M]) -> Type[M]:
|
236
|
-
cls_init = model_cls.__init__
|
237
|
-
|
238
|
-
@functools.wraps(model_cls.__init__)
|
239
|
-
def __init__(__pydantic_self__, **data: Any) -> None:
|
240
|
-
# Call the original init
|
241
|
-
cls_init(__pydantic_self__, **data)
|
242
|
-
# Perform warning check
|
243
|
-
if name in data.keys() and when(data[name]):
|
244
|
-
experimental_check()
|
245
|
-
field = __pydantic_self__.__fields__.get(name)
|
246
|
-
if field is not None:
|
247
|
-
field.field_info.extra["experimental"] = True
|
248
|
-
field.field_info.extra["experimental-group"] = group
|
249
|
-
|
250
|
-
# Patch the model's init method
|
251
|
-
model_cls.__init__ = __init__
|
252
|
-
|
253
|
-
return model_cls
|
254
|
-
|
255
|
-
return decorator
|
256
|
-
|
257
|
-
|
258
187
|
def enabled_experiments() -> Set[str]:
|
259
188
|
"""
|
260
189
|
Return the set of all enabled experiments.
|
261
190
|
"""
|
262
|
-
|
191
|
+
return {
|
263
192
|
name[len("PREFECT_EXPERIMENTAL_ENABLE_") :].lower()
|
264
193
|
for name, setting in SETTING_VARIABLES.items()
|
265
194
|
if name.startswith("PREFECT_EXPERIMENTAL_ENABLE_") and setting.value()
|
266
195
|
}
|
267
|
-
if automation_settings_enabled():
|
268
|
-
enabled_experimental_settings.add("automations")
|
269
|
-
|
270
|
-
return enabled_experimental_settings
|
@@ -0,0 +1,166 @@
|
|
1
|
+
"""
|
2
|
+
This module provides a function to handle imports for moved or removed objects in Prefect 3.0 upgrade.
|
3
|
+
|
4
|
+
The `getattr_migration` function is used to handle imports for moved or removed objects in Prefect 3.0 upgrade.
|
5
|
+
It is used in the `__getattr__` attribute of modules that have moved or removed objects.
|
6
|
+
|
7
|
+
Usage:
|
8
|
+
|
9
|
+
Moved objects:
|
10
|
+
1. Add the old and new path to the `MOVED_IN_V3` dictionary, e.g. `MOVED_IN_V3 = {"old_path": "new_path"}`
|
11
|
+
2. In the module where the object was moved from, add the following lines:
|
12
|
+
```python
|
13
|
+
# at top
|
14
|
+
from prefect._internal.compatibility.migration import getattr_migration
|
15
|
+
|
16
|
+
# at bottom
|
17
|
+
__getattr__ = getattr_migration(__name__)
|
18
|
+
```
|
19
|
+
|
20
|
+
Example at src/prefect/engine.py
|
21
|
+
|
22
|
+
Removed objects:
|
23
|
+
1. Add the old path and error message to the `REMOVED_IN_V3` dictionary, e.g. `REMOVED_IN_V3 = {"old_path": "error_message"}`
|
24
|
+
2. In the module where the object was removed, add the following lines:
|
25
|
+
```python
|
26
|
+
# at top
|
27
|
+
from prefect._internal.compatibility.migration import getattr_migration
|
28
|
+
|
29
|
+
# at bottom
|
30
|
+
__getattr__ = getattr_migration(__name__)
|
31
|
+
|
32
|
+
```
|
33
|
+
If the entire old module was removed, add a stub for the module with the following lines:
|
34
|
+
```python
|
35
|
+
# at top
|
36
|
+
from prefect._internal.compatibility.migration import getattr_migration
|
37
|
+
|
38
|
+
# at bottom
|
39
|
+
__getattr__ = getattr_migration(__name__)
|
40
|
+
```
|
41
|
+
|
42
|
+
Example at src/prefect/infrastructure/base.py
|
43
|
+
"""
|
44
|
+
|
45
|
+
import sys
|
46
|
+
from typing import Any, Callable, Dict
|
47
|
+
|
48
|
+
from pydantic_core import PydanticCustomError
|
49
|
+
|
50
|
+
from prefect.exceptions import PrefectImportError
|
51
|
+
|
52
|
+
MOVED_IN_V3 = {
|
53
|
+
"prefect.deployments.deployments:load_flow_from_flow_run": "prefect.flows:load_flow_from_flow_run",
|
54
|
+
"prefect.deployments:load_flow_from_flow_run": "prefect.flows:load_flow_from_flow_run",
|
55
|
+
"prefect.variables:get": "prefect.variables:Variable.get",
|
56
|
+
"prefect.engine:pause_flow_run": "prefect.flow_runs:pause_flow_run",
|
57
|
+
"prefect.engine:resume_flow_run": "prefect.flow_runs:resume_flow_run",
|
58
|
+
"prefect.engine:suspend_flow_run": "prefect.flow_runs:suspend_flow_run",
|
59
|
+
"prefect.engine:_in_process_pause": "prefect.flow_runs:_in_process_pause",
|
60
|
+
"prefect.client:get_client": "prefect.client.orchestration:get_client",
|
61
|
+
}
|
62
|
+
|
63
|
+
upgrade_guide_msg = "Refer to the upgrade guide for more information: https://docs.prefect.io/latest/guides/upgrade-guide-agents-to-workers/."
|
64
|
+
|
65
|
+
REMOVED_IN_V3 = {
|
66
|
+
"prefect.client.schemas.objects:MinimalDeploymentSchedule": "Use `prefect.client.schemas.actions.DeploymentScheduleCreate` instead.",
|
67
|
+
"prefect.context:PrefectObjectRegistry": upgrade_guide_msg,
|
68
|
+
"prefect.deployments.deployments:Deployment": "Use `flow.serve()`, `flow.deploy()`, or `prefect deploy` instead.",
|
69
|
+
"prefect.deployments:Deployment": "Use `flow.serve()`, `flow.deploy()`, or `prefect deploy` instead.",
|
70
|
+
"prefect.filesystems:GCS": "Use `prefect_gcp.GcsBucket` instead.",
|
71
|
+
"prefect.filesystems:Azure": "Use `prefect_azure.AzureBlobStorageContainer` instead.",
|
72
|
+
"prefect.filesystems:S3": "Use `prefect_aws.S3Bucket` instead.",
|
73
|
+
"prefect.filesystems:GitHub": "Use `prefect_github.GitHubRepository` instead.",
|
74
|
+
"prefect.engine:_out_of_process_pause": "Use `prefect.flow_runs.pause_flow_run` instead.",
|
75
|
+
"prefect.agent:PrefectAgent": "Use workers instead. " + upgrade_guide_msg,
|
76
|
+
"prefect.infrastructure:KubernetesJob": "Use workers instead. " + upgrade_guide_msg,
|
77
|
+
"prefect.infrastructure.base:Infrastructure": "Use the `BaseWorker` class to create custom infrastructure integrations instead. "
|
78
|
+
+ upgrade_guide_msg,
|
79
|
+
"prefect.workers.block:BlockWorkerJobConfiguration": upgrade_guide_msg,
|
80
|
+
"prefect.workers.cloud:BlockWorker": upgrade_guide_msg,
|
81
|
+
}
|
82
|
+
|
83
|
+
# IMPORTANT FOR USAGE: When adding new modules to MOVED_IN_V3 or REMOVED_IN_V3, include the following lines at the bottom of that module:
|
84
|
+
# from prefect._internal.compatibility.migration import getattr_migration
|
85
|
+
# __getattr__ = getattr_migration(__name__)
|
86
|
+
# See src/prefect/filesystems.py for an example
|
87
|
+
|
88
|
+
|
89
|
+
def import_string_class_method(new_location: str) -> Callable:
|
90
|
+
"""
|
91
|
+
Handle moved class methods.
|
92
|
+
|
93
|
+
`import_string` does not account for moved class methods. This function handles cases where a method has been
|
94
|
+
moved to a class. For example, if `new_location` is 'prefect.variables:Variable.get', `import_string(new_location)`
|
95
|
+
will raise an error because it does not handle class methods. This function will import the class and get the
|
96
|
+
method from the class.
|
97
|
+
|
98
|
+
Args:
|
99
|
+
new_location (str): The new location of the method.
|
100
|
+
|
101
|
+
Returns:
|
102
|
+
method: The resolved method from the class.
|
103
|
+
|
104
|
+
Raises:
|
105
|
+
PrefectImportError: If the method is not found in the class.
|
106
|
+
"""
|
107
|
+
from pydantic._internal._validators import import_string
|
108
|
+
|
109
|
+
class_name, method_name = new_location.rsplit(".", 1)
|
110
|
+
|
111
|
+
cls = import_string(class_name)
|
112
|
+
method = getattr(cls, method_name, None)
|
113
|
+
|
114
|
+
if method is not None and callable(method):
|
115
|
+
return method
|
116
|
+
|
117
|
+
raise PrefectImportError(f"Unable to import {new_location!r}")
|
118
|
+
|
119
|
+
|
120
|
+
def getattr_migration(module_name: str) -> Callable[[str], Any]:
|
121
|
+
"""
|
122
|
+
Handle imports for moved or removed objects in Prefect 3.0 upgrade
|
123
|
+
|
124
|
+
Args:
|
125
|
+
module_name (str): The name of the module to handle imports for.
|
126
|
+
"""
|
127
|
+
|
128
|
+
def wrapper(name: str) -> object:
|
129
|
+
"""
|
130
|
+
Raise a PrefectImportError if the object is not found, moved, or removed.
|
131
|
+
"""
|
132
|
+
|
133
|
+
if name == "__path__":
|
134
|
+
raise AttributeError(f"{module_name!r} object has no attribute {name!r}")
|
135
|
+
import warnings
|
136
|
+
|
137
|
+
from pydantic._internal._validators import import_string
|
138
|
+
|
139
|
+
import_path = f"{module_name}:{name}"
|
140
|
+
|
141
|
+
# Check if the attribute name corresponds to a moved or removed class or module
|
142
|
+
if import_path in MOVED_IN_V3.keys():
|
143
|
+
new_location = MOVED_IN_V3[import_path]
|
144
|
+
warnings.warn(
|
145
|
+
f"{import_path!r} has been moved to {new_location!r}. Importing from {new_location!r} instead. This warning will raise an error in a future release.",
|
146
|
+
DeprecationWarning,
|
147
|
+
stacklevel=2,
|
148
|
+
)
|
149
|
+
try:
|
150
|
+
return import_string(new_location)
|
151
|
+
except PydanticCustomError:
|
152
|
+
return import_string_class_method(new_location)
|
153
|
+
|
154
|
+
if import_path in REMOVED_IN_V3.keys():
|
155
|
+
error_message = REMOVED_IN_V3[import_path]
|
156
|
+
raise PrefectImportError(
|
157
|
+
f"`{import_path}` has been removed. {error_message}"
|
158
|
+
)
|
159
|
+
|
160
|
+
globals: Dict[str, Any] = sys.modules[module_name].__dict__
|
161
|
+
if name in globals:
|
162
|
+
return globals[name]
|
163
|
+
|
164
|
+
raise AttributeError(f"module {module_name!r} has no attribute {name!r}")
|
165
|
+
|
166
|
+
return wrapper
|
@@ -5,7 +5,7 @@ both asynchronous and synchronous calls.
|
|
5
5
|
Much of the complexity managed here arises from ensuring that a thread of execution is
|
6
6
|
not blocked.
|
7
7
|
|
8
|
-
The main data structure is a `Call` which is created from a function call capturing
|
8
|
+
The main data structure is a `Call` which is created from a function call capturing
|
9
9
|
local context variables. The call is then submitted to run somewhere via a `Portal`.
|
10
10
|
The primary portal used is the `WorkerThread`, which executes work on a thread running
|
11
11
|
concurrently to the one that created the call. A singleton `EventLoopThread` portal
|
@@ -13,7 +13,7 @@ is also used to schedule work on a dedicated event loop.
|
|
13
13
|
|
14
14
|
The result of the call can be retrieved asynchronously using `Call.result()`. Behind
|
15
15
|
the scenes, a `Future` is used to report the result of the call. Retrieving the result
|
16
|
-
of a call is a blocking operation.
|
16
|
+
of a call is a blocking operation.
|
17
17
|
|
18
18
|
Sometimes, it is important not to block the current thread while retrieving the result
|
19
19
|
of a call. For this purpose, there is the `Waiter`. Waiters attach to a call and provide
|