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
@@ -6,11 +6,8 @@ format.
|
|
6
6
|
This will be subject to consolidation and refactoring over the next few months.
|
7
7
|
"""
|
8
8
|
|
9
|
-
import datetime
|
10
9
|
import json
|
11
|
-
import logging
|
12
10
|
import re
|
13
|
-
import sys
|
14
11
|
import urllib.parse
|
15
12
|
import warnings
|
16
13
|
from copy import copy
|
@@ -20,48 +17,23 @@ from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional, Tuple, Uni
|
|
20
17
|
import jsonschema
|
21
18
|
import pendulum
|
22
19
|
import yaml
|
20
|
+
from pydantic_extra_types.pendulum_dt import DateTime
|
23
21
|
|
24
|
-
from prefect.
|
25
|
-
from prefect.
|
26
|
-
from prefect._internal.schemas.fields import DateTimeTZ
|
27
|
-
from prefect.exceptions import InvalidNameError, InvalidRepositoryURLError
|
28
|
-
from prefect.utilities.annotations import NotSet
|
22
|
+
from prefect.exceptions import InvalidRepositoryURLError
|
23
|
+
from prefect.utilities.collections import isiterable
|
29
24
|
from prefect.utilities.dockerutils import get_prefect_image_name
|
30
25
|
from prefect.utilities.filesystem import relative_path_to_current_platform
|
31
26
|
from prefect.utilities.importtools import from_qualified_name
|
32
27
|
from prefect.utilities.names import generate_slug
|
33
28
|
from prefect.utilities.pydantic import JsonPatch
|
34
29
|
|
35
|
-
BANNED_CHARACTERS = ["/", "%", "&", ">", "<"]
|
36
30
|
LOWERCASE_LETTERS_NUMBERS_AND_DASHES_ONLY_REGEX = "^[a-z0-9-]*$"
|
37
31
|
LOWERCASE_LETTERS_NUMBERS_AND_UNDERSCORES_REGEX = "^[a-z0-9_]*$"
|
38
32
|
|
39
33
|
if TYPE_CHECKING:
|
40
34
|
from prefect.blocks.core import Block
|
41
|
-
from prefect.events.schemas import DeploymentTrigger
|
42
35
|
from prefect.utilities.callables import ParameterSchema
|
43
36
|
|
44
|
-
if HAS_PYDANTIC_V2:
|
45
|
-
if USE_PYDANTIC_V2:
|
46
|
-
# TODO: we need to account for rewriting the validator to not use ModelField
|
47
|
-
pass
|
48
|
-
if not USE_PYDANTIC_V2:
|
49
|
-
from pydantic.v1.fields import ModelField
|
50
|
-
|
51
|
-
|
52
|
-
def raise_on_name_with_banned_characters(name: str) -> str:
|
53
|
-
"""
|
54
|
-
Raise an InvalidNameError if the given name contains any invalid
|
55
|
-
characters.
|
56
|
-
"""
|
57
|
-
if name is not None:
|
58
|
-
if any(c in name for c in BANNED_CHARACTERS):
|
59
|
-
raise InvalidNameError(
|
60
|
-
f"Name {name!r} contains an invalid character. "
|
61
|
-
f"Must not contain any of: {BANNED_CHARACTERS}."
|
62
|
-
)
|
63
|
-
return name
|
64
|
-
|
65
37
|
|
66
38
|
def raise_on_name_alphanumeric_dashes_only(
|
67
39
|
value: Optional[str], field_name: str = "value"
|
@@ -236,92 +208,23 @@ def return_none_schedule(v: Optional[Union[str, dict]]) -> Optional[Union[str, d
|
|
236
208
|
return v
|
237
209
|
|
238
210
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
"""
|
244
|
-
Validate and log deprecation warnings for deprecated schedule fields.
|
245
|
-
"""
|
246
|
-
if values.get("schedule") and not values.get("schedules"):
|
247
|
-
logger.warning(
|
248
|
-
"The field 'schedule' in 'Deployment' has been deprecated. It will not be "
|
249
|
-
"available after Sep 2024. Define schedules in the `schedules` list instead."
|
250
|
-
)
|
251
|
-
elif values.get("is_schedule_active") and not values.get("schedules"):
|
252
|
-
logger.warning(
|
253
|
-
"The field 'is_schedule_active' in 'Deployment' has been deprecated. It will "
|
254
|
-
"not be available after Sep 2024. Use the `active` flag within a schedule in "
|
255
|
-
"the `schedules` list instead and the `pause` flag in 'Deployment' to pause "
|
256
|
-
"all schedules."
|
257
|
-
)
|
258
|
-
return values
|
259
|
-
|
260
|
-
|
261
|
-
def reconcile_schedules(cls, values: dict) -> dict:
|
262
|
-
"""
|
263
|
-
Reconcile the `schedule` and `schedules` fields in a deployment.
|
264
|
-
"""
|
211
|
+
def convert_to_strings(value: Union[Any, List[Any]]) -> Union[str, List[str]]:
|
212
|
+
if isiterable(value):
|
213
|
+
return [str(item) for item in value]
|
214
|
+
return str(value)
|
265
215
|
|
266
|
-
from prefect.deployments.schedules import (
|
267
|
-
create_minimal_deployment_schedule,
|
268
|
-
normalize_to_minimal_deployment_schedules,
|
269
|
-
)
|
270
216
|
|
271
|
-
|
272
|
-
schedules = values.get("schedules", NotSet)
|
273
|
-
|
274
|
-
if schedules is not NotSet:
|
275
|
-
values["schedules"] = normalize_to_minimal_deployment_schedules(schedules)
|
276
|
-
elif schedule is not NotSet:
|
277
|
-
values["schedule"] = None
|
278
|
-
|
279
|
-
if schedule is None:
|
280
|
-
values["schedules"] = []
|
281
|
-
else:
|
282
|
-
values["schedules"] = [
|
283
|
-
create_minimal_deployment_schedule(
|
284
|
-
schedule=schedule, active=values.get("is_schedule_active")
|
285
|
-
)
|
286
|
-
]
|
287
|
-
|
288
|
-
for schedule in values.get("schedules", []):
|
289
|
-
cls._validate_schedule(schedule.schedule)
|
290
|
-
|
291
|
-
return values
|
217
|
+
### SCHEDULE SCHEMA VALIDATORS ###
|
292
218
|
|
293
219
|
|
294
|
-
# TODO: consolidate with above if possible
|
295
220
|
def reconcile_schedules_runner(values: dict) -> dict:
|
296
|
-
"""
|
297
|
-
Similar to above, we reconcile the `schedule` and `schedules` fields in a deployment.
|
298
|
-
"""
|
299
221
|
from prefect.deployments.schedules import (
|
300
|
-
|
301
|
-
normalize_to_minimal_deployment_schedules,
|
222
|
+
normalize_to_deployment_schedule_create,
|
302
223
|
)
|
303
224
|
|
304
|
-
schedule = values.get("schedule")
|
305
225
|
schedules = values.get("schedules")
|
306
|
-
|
307
|
-
|
308
|
-
values["schedules"] = [create_minimal_deployment_schedule(schedule)]
|
309
|
-
elif schedules is not None and len(schedules) > 0:
|
310
|
-
values["schedules"] = normalize_to_minimal_deployment_schedules(schedules)
|
311
|
-
|
312
|
-
return values
|
313
|
-
|
314
|
-
|
315
|
-
def set_deployment_schedules(values: dict) -> dict:
|
316
|
-
from prefect.server.schemas.actions import DeploymentScheduleCreate
|
317
|
-
|
318
|
-
if not values.get("schedules") and values.get("schedule"):
|
319
|
-
values["schedules"] = [
|
320
|
-
DeploymentScheduleCreate(
|
321
|
-
schedule=values["schedule"],
|
322
|
-
active=values["is_schedule_active"],
|
323
|
-
)
|
324
|
-
]
|
226
|
+
if schedules is not None and len(schedules) > 0:
|
227
|
+
values["schedules"] = normalize_to_deployment_schedule_create(schedules)
|
325
228
|
|
326
229
|
return values
|
327
230
|
|
@@ -367,28 +270,18 @@ def remove_old_deployment_fields(values: dict) -> dict:
|
|
367
270
|
|
368
271
|
def reconcile_paused_deployment(values):
|
369
272
|
paused = values.get("paused")
|
370
|
-
|
371
|
-
|
372
|
-
if paused is not None:
|
373
|
-
values["paused"] = paused
|
374
|
-
values["is_schedule_active"] = not paused
|
375
|
-
elif is_schedule_active is not None:
|
376
|
-
values["paused"] = not is_schedule_active
|
377
|
-
values["is_schedule_active"] = is_schedule_active
|
378
|
-
else:
|
273
|
+
|
274
|
+
if paused is None:
|
379
275
|
values["paused"] = False
|
380
|
-
values["is_schedule_active"] = True
|
381
276
|
|
382
277
|
return values
|
383
278
|
|
384
279
|
|
385
|
-
def default_anchor_date(v:
|
386
|
-
if v is None:
|
387
|
-
return pendulum.now("UTC")
|
280
|
+
def default_anchor_date(v: DateTime) -> DateTime:
|
388
281
|
return pendulum.instance(v)
|
389
282
|
|
390
283
|
|
391
|
-
def get_valid_timezones(v: str) -> Tuple[str, ...]:
|
284
|
+
def get_valid_timezones(v: Optional[str]) -> Tuple[str, ...]:
|
392
285
|
# pendulum.tz.timezones is a callable in 3.0 and above
|
393
286
|
# https://github.com/PrefectHQ/prefect/issues/11619
|
394
287
|
if callable(pendulum.tz.timezones):
|
@@ -397,27 +290,6 @@ def get_valid_timezones(v: str) -> Tuple[str, ...]:
|
|
397
290
|
return pendulum.tz.timezones
|
398
291
|
|
399
292
|
|
400
|
-
def validate_rrule_timezone(v: str) -> str:
|
401
|
-
"""
|
402
|
-
Validate that the provided timezone is a valid IANA timezone.
|
403
|
-
|
404
|
-
Unfortunately this list is slightly different from the list of valid
|
405
|
-
timezones in pendulum that we use for cron and interval timezone validation.
|
406
|
-
"""
|
407
|
-
from prefect._internal.pytz import HAS_PYTZ
|
408
|
-
|
409
|
-
if HAS_PYTZ:
|
410
|
-
import pytz
|
411
|
-
else:
|
412
|
-
from prefect._internal import pytz
|
413
|
-
|
414
|
-
if v and v not in pytz.all_timezones_set:
|
415
|
-
raise ValueError(f'Invalid timezone: "{v}"')
|
416
|
-
elif v is None:
|
417
|
-
return "UTC"
|
418
|
-
return v
|
419
|
-
|
420
|
-
|
421
293
|
def validate_timezone(v: str, timezones: Tuple[str, ...]) -> str:
|
422
294
|
if v and v not in timezones:
|
423
295
|
raise ValueError(
|
@@ -427,7 +299,8 @@ def validate_timezone(v: str, timezones: Tuple[str, ...]) -> str:
|
|
427
299
|
return v
|
428
300
|
|
429
301
|
|
430
|
-
def default_timezone(v: str, values: Optional[dict] =
|
302
|
+
def default_timezone(v: Optional[str], values: Optional[dict] = None) -> str:
|
303
|
+
values = values or {}
|
431
304
|
timezones = get_valid_timezones(v)
|
432
305
|
|
433
306
|
if v is not None:
|
@@ -435,7 +308,7 @@ def default_timezone(v: str, values: Optional[dict] = {}) -> str:
|
|
435
308
|
|
436
309
|
# anchor schedules
|
437
310
|
elif v is None and values and values.get("anchor_date"):
|
438
|
-
tz = values["anchor_date"].tz
|
311
|
+
tz = getattr(values["anchor_date"].tz, "name", None) or "UTC"
|
439
312
|
if tz in timezones:
|
440
313
|
return tz
|
441
314
|
# sometimes anchor dates have "timezones" that are UTC offsets
|
@@ -485,34 +358,6 @@ def validate_rrule_string(v: str) -> str:
|
|
485
358
|
return v
|
486
359
|
|
487
360
|
|
488
|
-
### AUTOMATION SCHEMA VALIDATORS ###
|
489
|
-
|
490
|
-
|
491
|
-
def validate_trigger_within(
|
492
|
-
value: datetime.timedelta, field: "ModelField"
|
493
|
-
) -> datetime.timedelta:
|
494
|
-
"""
|
495
|
-
Validate that the `within` field is greater than the minimum value.
|
496
|
-
"""
|
497
|
-
minimum = field.field_info.extra["minimum"]
|
498
|
-
if value.total_seconds() < minimum:
|
499
|
-
raise ValueError("The minimum `within` is 0 seconds")
|
500
|
-
return value
|
501
|
-
|
502
|
-
|
503
|
-
def validate_automation_names(
|
504
|
-
field_value: List["DeploymentTrigger"], values: dict
|
505
|
-
) -> List["DeploymentTrigger"]:
|
506
|
-
"""
|
507
|
-
Ensure that each trigger has a name for its automation if none is provided.
|
508
|
-
"""
|
509
|
-
for i, trigger in enumerate(field_value, start=1):
|
510
|
-
if trigger.name is None:
|
511
|
-
trigger.name = f"{values['name']}__automation_{i}"
|
512
|
-
|
513
|
-
return field_value
|
514
|
-
|
515
|
-
|
516
361
|
### INFRASTRUCTURE SCHEMA VALIDATORS ###
|
517
362
|
|
518
363
|
|
@@ -589,7 +434,6 @@ def set_default_image(values: dict) -> dict:
|
|
589
434
|
"""
|
590
435
|
Set the default image for a Kubernetes job if not provided.
|
591
436
|
"""
|
592
|
-
from prefect.utilities.dockerutils import get_prefect_image_name
|
593
437
|
|
594
438
|
job = values.get("job")
|
595
439
|
image = values.get("image")
|
@@ -616,23 +460,6 @@ def get_or_create_state_name(v: str, values: dict) -> str:
|
|
616
460
|
return v
|
617
461
|
|
618
462
|
|
619
|
-
def set_default_scheduled_time(cls, values: dict) -> dict:
|
620
|
-
"""
|
621
|
-
TODO: This should throw an error instead of setting a default but is out of
|
622
|
-
scope for https://github.com/PrefectHQ/orion/pull/174/ and can be rolled
|
623
|
-
into work refactoring state initialization
|
624
|
-
"""
|
625
|
-
from prefect.server.schemas.states import StateType
|
626
|
-
|
627
|
-
if values.get("type") == StateType.SCHEDULED:
|
628
|
-
state_details = values.setdefault(
|
629
|
-
"state_details", cls.__fields__["state_details"].get_default()
|
630
|
-
)
|
631
|
-
if not state_details.scheduled_time:
|
632
|
-
state_details.scheduled_time = pendulum.now("utc")
|
633
|
-
return values
|
634
|
-
|
635
|
-
|
636
463
|
def get_or_create_run_name(name):
|
637
464
|
return name or generate_slug(2)
|
638
465
|
|
@@ -882,20 +709,6 @@ def check_volume_format(volumes: List[str]) -> List[str]:
|
|
882
709
|
return volumes
|
883
710
|
|
884
711
|
|
885
|
-
def assign_default_base_image(values: Mapping[str, Any]) -> Mapping[str, Any]:
|
886
|
-
from prefect.software.conda import CondaEnvironment
|
887
|
-
|
888
|
-
if not values.get("base_image") and not values.get("dockerfile"):
|
889
|
-
values["base_image"] = get_prefect_image_name(
|
890
|
-
flavor=(
|
891
|
-
"conda"
|
892
|
-
if isinstance(values.get("python_environment"), CondaEnvironment)
|
893
|
-
else None
|
894
|
-
)
|
895
|
-
)
|
896
|
-
return values
|
897
|
-
|
898
|
-
|
899
712
|
def base_image_xor_dockerfile(values: Mapping[str, Any]):
|
900
713
|
if values.get("base_image") and values.get("dockerfile"):
|
901
714
|
raise ValueError(
|
@@ -904,14 +717,6 @@ def base_image_xor_dockerfile(values: Mapping[str, Any]):
|
|
904
717
|
return values
|
905
718
|
|
906
719
|
|
907
|
-
def set_default_python_environment(values: Mapping[str, Any]) -> Mapping[str, Any]:
|
908
|
-
from prefect.software.python import PythonEnvironment
|
909
|
-
|
910
|
-
if values.get("base_image") and not values.get("python_environment"):
|
911
|
-
values["python_environment"] = PythonEnvironment.from_environment()
|
912
|
-
return values
|
913
|
-
|
914
|
-
|
915
720
|
### SETTINGS SCHEMA VALIDATORS ###
|
916
721
|
|
917
722
|
|
@@ -929,7 +734,7 @@ def validate_settings(value: dict) -> dict:
|
|
929
734
|
elif isinstance(setting, Setting):
|
930
735
|
validated[setting] = val
|
931
736
|
else:
|
932
|
-
|
737
|
+
warnings.warn(f"Setting {setting!r} is not recognized and will be ignored.")
|
933
738
|
|
934
739
|
return validated
|
935
740
|
|
@@ -976,12 +781,6 @@ def set_run_policy_deprecated_fields(values: dict) -> dict:
|
|
976
781
|
### PYTHON ENVIRONMENT SCHEMA VALIDATORS ###
|
977
782
|
|
978
783
|
|
979
|
-
def infer_python_version(value: Optional[str]) -> Optional[str]:
|
980
|
-
if value is None:
|
981
|
-
return f"{sys.version_info.major}.{sys.version_info.minor}"
|
982
|
-
return value
|
983
|
-
|
984
|
-
|
985
784
|
def return_v_or_none(v: Optional[str]) -> Optional[str]:
|
986
785
|
"""Make sure that empty strings are treated as None"""
|
987
786
|
if not v:
|
@@ -989,19 +788,6 @@ def return_v_or_none(v: Optional[str]) -> Optional[str]:
|
|
989
788
|
return v
|
990
789
|
|
991
790
|
|
992
|
-
### INFRASTRUCTURE BLOCK SCHEMA VALIDATORS ###
|
993
|
-
|
994
|
-
|
995
|
-
def validate_block_is_infrastructure(v: "Block") -> "Block":
|
996
|
-
from prefect.infrastructure.base import Infrastructure
|
997
|
-
|
998
|
-
print("v: ", v)
|
999
|
-
if not isinstance(v, Infrastructure):
|
1000
|
-
raise TypeError("Provided block is not a valid infrastructure block.")
|
1001
|
-
|
1002
|
-
return v
|
1003
|
-
|
1004
|
-
|
1005
791
|
### BLOCK SCHEMA VALIDATORS ###
|
1006
792
|
|
1007
793
|
|
@@ -1032,3 +818,31 @@ def validate_command(v: str) -> Path:
|
|
1032
818
|
if v:
|
1033
819
|
return relative_path_to_current_platform(v)
|
1034
820
|
return v
|
821
|
+
|
822
|
+
|
823
|
+
### UNCATEGORIZED VALIDATORS ###
|
824
|
+
|
825
|
+
# the above categories seem to be getting a bit unwieldy, so this is a temporary
|
826
|
+
# catch-all for validators until we organize these into files
|
827
|
+
|
828
|
+
|
829
|
+
def validate_block_document_name(value):
|
830
|
+
if value is not None:
|
831
|
+
raise_on_name_alphanumeric_dashes_only(value, field_name="Block document name")
|
832
|
+
return value
|
833
|
+
|
834
|
+
|
835
|
+
def validate_artifact_key(value):
|
836
|
+
raise_on_name_alphanumeric_dashes_only(value, field_name="Artifact key")
|
837
|
+
return value
|
838
|
+
|
839
|
+
|
840
|
+
def validate_variable_name(value):
|
841
|
+
if value is not None:
|
842
|
+
raise_on_name_alphanumeric_underscores_only(value, field_name="Variable name")
|
843
|
+
return value
|
844
|
+
|
845
|
+
|
846
|
+
def validate_block_type_slug(value):
|
847
|
+
raise_on_name_alphanumeric_dashes_only(value, field_name="Block type slug")
|
848
|
+
return value
|