prefect-client 2.19.3__py3-none-any.whl → 3.0.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/__init__.py +8 -56
- prefect/_internal/compatibility/deprecated.py +6 -115
- prefect/_internal/compatibility/experimental.py +4 -79
- prefect/_internal/concurrency/api.py +0 -34
- 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/threads.py +35 -0
- prefect/_internal/concurrency/waiters.py +0 -28
- prefect/_internal/pydantic/__init__.py +0 -45
- 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/schemas/bases.py +44 -177
- prefect/_internal/schemas/fields.py +1 -43
- prefect/_internal/schemas/validators.py +60 -158
- prefect/artifacts.py +161 -14
- prefect/automations.py +39 -4
- prefect/blocks/abstract.py +1 -1
- prefect/blocks/core.py +268 -148
- prefect/blocks/fields.py +2 -57
- prefect/blocks/kubernetes.py +8 -12
- prefect/blocks/notifications.py +40 -20
- prefect/blocks/system.py +22 -11
- prefect/blocks/webhook.py +2 -9
- prefect/client/base.py +4 -4
- prefect/client/cloud.py +8 -13
- prefect/client/orchestration.py +347 -341
- prefect/client/schemas/actions.py +92 -86
- prefect/client/schemas/filters.py +20 -40
- prefect/client/schemas/objects.py +147 -145
- prefect/client/schemas/responses.py +16 -24
- prefect/client/schemas/schedules.py +47 -35
- prefect/client/subscriptions.py +2 -2
- prefect/client/utilities.py +5 -2
- prefect/concurrency/asyncio.py +3 -1
- prefect/concurrency/events.py +1 -1
- prefect/concurrency/services.py +6 -3
- prefect/context.py +195 -27
- prefect/deployments/__init__.py +5 -6
- prefect/deployments/base.py +7 -5
- prefect/deployments/flow_runs.py +185 -0
- prefect/deployments/runner.py +50 -45
- prefect/deployments/schedules.py +28 -23
- prefect/deployments/steps/__init__.py +0 -1
- prefect/deployments/steps/core.py +1 -0
- prefect/deployments/steps/pull.py +7 -21
- prefect/engine.py +12 -2422
- prefect/events/actions.py +17 -23
- prefect/events/cli/automations.py +19 -6
- prefect/events/clients.py +14 -37
- prefect/events/filters.py +14 -18
- prefect/events/related.py +2 -2
- 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 +34 -65
- prefect/events/schemas/labelling.py +10 -14
- prefect/events/utilities.py +2 -3
- prefect/events/worker.py +2 -3
- prefect/filesystems.py +6 -517
- prefect/{new_flow_engine.py → flow_engine.py} +313 -72
- prefect/flow_runs.py +377 -5
- prefect/flows.py +248 -165
- prefect/futures.py +186 -345
- prefect/infrastructure/__init__.py +0 -27
- prefect/infrastructure/provisioners/__init__.py +5 -3
- prefect/infrastructure/provisioners/cloud_run.py +11 -6
- prefect/infrastructure/provisioners/container_instance.py +11 -7
- prefect/infrastructure/provisioners/ecs.py +6 -4
- prefect/infrastructure/provisioners/modal.py +8 -5
- prefect/input/actions.py +2 -4
- prefect/input/run_input.py +5 -7
- prefect/logging/formatters.py +0 -2
- prefect/logging/handlers.py +3 -11
- prefect/logging/loggers.py +2 -2
- prefect/manifests.py +2 -1
- prefect/records/__init__.py +1 -0
- prefect/records/result_store.py +42 -0
- prefect/records/store.py +9 -0
- prefect/results.py +43 -39
- prefect/runner/runner.py +9 -9
- prefect/runner/server.py +6 -10
- prefect/runner/storage.py +3 -8
- prefect/runner/submit.py +2 -2
- prefect/runner/utils.py +2 -2
- prefect/serializers.py +24 -35
- prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
- prefect/settings.py +70 -133
- prefect/states.py +17 -47
- prefect/task_engine.py +697 -58
- prefect/task_runners.py +269 -301
- prefect/task_server.py +53 -34
- prefect/tasks.py +327 -337
- prefect/transactions.py +220 -0
- prefect/types/__init__.py +61 -82
- prefect/utilities/asyncutils.py +195 -136
- prefect/utilities/callables.py +121 -41
- prefect/utilities/collections.py +23 -38
- prefect/utilities/dispatch.py +11 -3
- prefect/utilities/dockerutils.py +4 -0
- prefect/utilities/engine.py +140 -20
- prefect/utilities/importtools.py +26 -27
- prefect/utilities/pydantic.py +128 -38
- prefect/utilities/schema_tools/hydration.py +5 -1
- prefect/utilities/templating.py +12 -2
- prefect/variables.py +78 -61
- prefect/workers/__init__.py +0 -1
- prefect/workers/base.py +15 -17
- prefect/workers/process.py +3 -8
- prefect/workers/server.py +2 -2
- {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/METADATA +22 -21
- prefect_client-3.0.0rc1.dist-info/RECORD +176 -0
- 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/__init__.py +0 -0
- 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/__init__.py +0 -0
- 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/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/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/agent.py +0 -698
- prefect/deployments/deployments.py +0 -1042
- 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/base.py +0 -323
- prefect/infrastructure/container.py +0 -818
- prefect/infrastructure/kubernetes.py +0 -920
- prefect/infrastructure/process.py +0 -289
- 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/workers/block.py +0 -218
- prefect_client-2.19.3.dist-info/RECORD +0 -292
- {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/LICENSE +0 -0
- {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/WHEEL +0 -0
- {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/top_level.txt +0 -0
prefect/deployments/runner.py
CHANGED
@@ -38,32 +38,31 @@ from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Union
|
|
38
38
|
from uuid import UUID
|
39
39
|
|
40
40
|
import pendulum
|
41
|
+
from pydantic import (
|
42
|
+
BaseModel,
|
43
|
+
ConfigDict,
|
44
|
+
Field,
|
45
|
+
PrivateAttr,
|
46
|
+
model_validator,
|
47
|
+
)
|
41
48
|
from rich.console import Console
|
42
49
|
from rich.progress import Progress, SpinnerColumn, TextColumn, track
|
43
50
|
from rich.table import Table
|
44
51
|
|
45
|
-
from prefect._internal.pydantic import HAS_PYDANTIC_V2
|
46
|
-
|
47
|
-
if HAS_PYDANTIC_V2:
|
48
|
-
from pydantic.v1 import BaseModel, Field, PrivateAttr, root_validator, validator
|
49
|
-
else:
|
50
|
-
from pydantic import BaseModel, Field, PrivateAttr, root_validator, validator
|
51
|
-
|
52
52
|
from prefect._internal.concurrency.api import create_call, from_async
|
53
53
|
from prefect._internal.schemas.validators import (
|
54
54
|
reconcile_paused_deployment,
|
55
55
|
reconcile_schedules_runner,
|
56
|
-
validate_automation_names,
|
57
56
|
)
|
58
57
|
from prefect.client.orchestration import get_client
|
59
|
-
from prefect.client.schemas.
|
58
|
+
from prefect.client.schemas.actions import DeploymentScheduleCreate
|
60
59
|
from prefect.client.schemas.schedules import (
|
61
60
|
SCHEDULE_TYPES,
|
62
61
|
construct_schedule,
|
63
62
|
)
|
64
63
|
from prefect.deployments.schedules import (
|
65
64
|
FlexibleScheduleList,
|
66
|
-
|
65
|
+
create_deployment_schedule_create,
|
67
66
|
)
|
68
67
|
from prefect.events import DeploymentTriggerTypes, TriggerTypes
|
69
68
|
from prefect.exceptions import (
|
@@ -144,8 +143,7 @@ class RunnerDeployment(BaseModel):
|
|
144
143
|
available settings.
|
145
144
|
"""
|
146
145
|
|
147
|
-
|
148
|
-
arbitrary_types_allowed = True
|
146
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
149
147
|
|
150
148
|
name: str = Field(..., description="The name of the deployment.")
|
151
149
|
flow_name: Optional[str] = Field(
|
@@ -161,7 +159,7 @@ class RunnerDeployment(BaseModel):
|
|
161
159
|
default_factory=list,
|
162
160
|
description="One of more tags to apply to this deployment.",
|
163
161
|
)
|
164
|
-
schedules: Optional[List[
|
162
|
+
schedules: Optional[List[DeploymentScheduleCreate]] = Field(
|
165
163
|
default=None,
|
166
164
|
description="The schedules that should cause this deployment to run.",
|
167
165
|
)
|
@@ -184,7 +182,7 @@ class RunnerDeployment(BaseModel):
|
|
184
182
|
description="The triggers that should cause this deployment to run.",
|
185
183
|
)
|
186
184
|
enforce_parameter_schema: bool = Field(
|
187
|
-
default=
|
185
|
+
default=True,
|
188
186
|
description=(
|
189
187
|
"Whether or not the Prefect API should enforce the parameter schema for"
|
190
188
|
" this deployment."
|
@@ -232,16 +230,22 @@ class RunnerDeployment(BaseModel):
|
|
232
230
|
def entrypoint_type(self) -> EntrypointType:
|
233
231
|
return self._entrypoint_type
|
234
232
|
|
235
|
-
@
|
236
|
-
def validate_automation_names(
|
233
|
+
@model_validator(mode="after")
|
234
|
+
def validate_automation_names(self):
|
237
235
|
"""Ensure that each trigger has a name for its automation if none is provided."""
|
238
|
-
|
236
|
+
trigger: Union[DeploymentTriggerTypes, TriggerTypes]
|
237
|
+
for i, trigger in enumerate(self.triggers, start=1):
|
238
|
+
if trigger.name is None:
|
239
|
+
trigger.name = f"{self.name}__automation_{i}"
|
240
|
+
return self
|
239
241
|
|
240
|
-
@
|
242
|
+
@model_validator(mode="before")
|
243
|
+
@classmethod
|
241
244
|
def reconcile_paused(cls, values):
|
242
245
|
return reconcile_paused_deployment(values)
|
243
246
|
|
244
|
-
@
|
247
|
+
@model_validator(mode="before")
|
248
|
+
@classmethod
|
245
249
|
def reconcile_schedules(cls, values):
|
246
250
|
return reconcile_schedules_runner(values)
|
247
251
|
|
@@ -301,7 +305,9 @@ class RunnerDeployment(BaseModel):
|
|
301
305
|
entrypoint=self.entrypoint,
|
302
306
|
storage_document_id=None,
|
303
307
|
infrastructure_document_id=None,
|
304
|
-
parameter_openapi_schema=self._parameter_openapi_schema.
|
308
|
+
parameter_openapi_schema=self._parameter_openapi_schema.model_dump(
|
309
|
+
exclude_unset=True
|
310
|
+
),
|
305
311
|
enforce_parameter_schema=self.enforce_parameter_schema,
|
306
312
|
)
|
307
313
|
|
@@ -325,26 +331,25 @@ class RunnerDeployment(BaseModel):
|
|
325
331
|
f"Error while applying deployment: {str(exc)}"
|
326
332
|
) from exc
|
327
333
|
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
raise e
|
334
|
+
try:
|
335
|
+
# The triggers defined in the deployment spec are, essentially,
|
336
|
+
# anonymous and attempting truly sync them with cloud is not
|
337
|
+
# feasible. Instead, we remove all automations that are owned
|
338
|
+
# by the deployment, meaning that they were created via this
|
339
|
+
# mechanism below, and then recreate them.
|
340
|
+
await client.delete_resource_owned_automations(
|
341
|
+
f"prefect.deployment.{deployment_id}"
|
342
|
+
)
|
343
|
+
except PrefectHTTPStatusError as e:
|
344
|
+
if e.response.status_code == 404:
|
345
|
+
# This Prefect server does not support automations, so we can safely
|
346
|
+
# ignore this 404 and move on.
|
347
|
+
return deployment_id
|
348
|
+
raise e
|
344
349
|
|
345
|
-
|
346
|
-
|
347
|
-
|
350
|
+
for trigger in self.triggers:
|
351
|
+
trigger.set_deployment_id(deployment_id)
|
352
|
+
await client.create_automation(trigger.as_automation())
|
348
353
|
|
349
354
|
return deployment_id
|
350
355
|
|
@@ -359,7 +364,7 @@ class RunnerDeployment(BaseModel):
|
|
359
364
|
timezone: Optional[str] = None,
|
360
365
|
schedule: Optional[SCHEDULE_TYPES] = None,
|
361
366
|
schedules: Optional[FlexibleScheduleList] = None,
|
362
|
-
) -> Union[List[
|
367
|
+
) -> Union[List[DeploymentScheduleCreate], FlexibleScheduleList]:
|
363
368
|
"""
|
364
369
|
Construct a schedule or schedules from the provided arguments.
|
365
370
|
|
@@ -417,7 +422,7 @@ class RunnerDeployment(BaseModel):
|
|
417
422
|
value = [value]
|
418
423
|
|
419
424
|
return [
|
420
|
-
|
425
|
+
create_deployment_schedule_create(
|
421
426
|
construct_schedule(
|
422
427
|
**{
|
423
428
|
schedule_type: v,
|
@@ -429,7 +434,7 @@ class RunnerDeployment(BaseModel):
|
|
429
434
|
for v in value
|
430
435
|
]
|
431
436
|
else:
|
432
|
-
return [
|
437
|
+
return [create_deployment_schedule_create(schedule)]
|
433
438
|
|
434
439
|
def _set_defaults_from_flow(self, flow: "Flow"):
|
435
440
|
self._parameter_openapi_schema = parameter_schema(flow)
|
@@ -458,7 +463,7 @@ class RunnerDeployment(BaseModel):
|
|
458
463
|
description: Optional[str] = None,
|
459
464
|
tags: Optional[List[str]] = None,
|
460
465
|
version: Optional[str] = None,
|
461
|
-
enforce_parameter_schema: bool =
|
466
|
+
enforce_parameter_schema: bool = True,
|
462
467
|
work_pool_name: Optional[str] = None,
|
463
468
|
work_queue_name: Optional[str] = None,
|
464
469
|
job_variables: Optional[Dict[str, Any]] = None,
|
@@ -594,7 +599,7 @@ class RunnerDeployment(BaseModel):
|
|
594
599
|
description: Optional[str] = None,
|
595
600
|
tags: Optional[List[str]] = None,
|
596
601
|
version: Optional[str] = None,
|
597
|
-
enforce_parameter_schema: bool =
|
602
|
+
enforce_parameter_schema: bool = True,
|
598
603
|
work_pool_name: Optional[str] = None,
|
599
604
|
work_queue_name: Optional[str] = None,
|
600
605
|
job_variables: Optional[Dict[str, Any]] = None,
|
@@ -692,7 +697,7 @@ class RunnerDeployment(BaseModel):
|
|
692
697
|
description: Optional[str] = None,
|
693
698
|
tags: Optional[List[str]] = None,
|
694
699
|
version: Optional[str] = None,
|
695
|
-
enforce_parameter_schema: bool =
|
700
|
+
enforce_parameter_schema: bool = True,
|
696
701
|
work_pool_name: Optional[str] = None,
|
697
702
|
work_queue_name: Optional[str] = None,
|
698
703
|
job_variables: Optional[Dict[str, Any]] = None,
|
prefect/deployments/schedules.py
CHANGED
@@ -1,42 +1,43 @@
|
|
1
|
-
from typing import List, Optional, Sequence, Union, get_args
|
1
|
+
from typing import TYPE_CHECKING, Any, List, Optional, Sequence, Union, get_args
|
2
2
|
|
3
|
-
from prefect.client.schemas.
|
4
|
-
from prefect.client.schemas.schedules import SCHEDULE_TYPES
|
3
|
+
from prefect.client.schemas.actions import DeploymentScheduleCreate
|
5
4
|
|
6
|
-
|
7
|
-
from prefect.
|
5
|
+
if TYPE_CHECKING:
|
6
|
+
from prefect.client.schemas.schedules import SCHEDULE_TYPES
|
8
7
|
|
9
|
-
|
10
|
-
except ImportError:
|
11
|
-
# `prefect-client` does not have access to the server schemas.
|
12
|
-
SERVER_SCHEDULE_TYPES = ()
|
8
|
+
FlexibleScheduleList = Sequence[Union[DeploymentScheduleCreate, dict, "SCHEDULE_TYPES"]]
|
13
9
|
|
14
|
-
FlexibleScheduleList = Sequence[Union[MinimalDeploymentSchedule, dict, SCHEDULE_TYPES]]
|
15
10
|
|
16
|
-
|
17
|
-
|
18
|
-
schedule: SCHEDULE_TYPES,
|
11
|
+
def create_deployment_schedule_create(
|
12
|
+
schedule: "SCHEDULE_TYPES",
|
19
13
|
active: Optional[bool] = True,
|
20
|
-
|
21
|
-
|
14
|
+
max_active_runs: Optional[int] = None,
|
15
|
+
catchup: bool = False,
|
16
|
+
) -> DeploymentScheduleCreate:
|
17
|
+
"""Create a DeploymentScheduleCreate object from common schedule parameters."""
|
18
|
+
return DeploymentScheduleCreate(
|
22
19
|
schedule=schedule,
|
23
20
|
active=active if active is not None else True,
|
21
|
+
max_active_runs=max_active_runs,
|
22
|
+
catchup=catchup,
|
24
23
|
)
|
25
24
|
|
26
25
|
|
27
|
-
def
|
28
|
-
schedules: Optional[FlexibleScheduleList],
|
29
|
-
) -> List[
|
26
|
+
def normalize_to_deployment_schedule_create(
|
27
|
+
schedules: Optional["FlexibleScheduleList"],
|
28
|
+
) -> List[DeploymentScheduleCreate]:
|
29
|
+
from prefect.client.schemas.schedules import SCHEDULE_TYPES
|
30
|
+
|
30
31
|
normalized = []
|
31
32
|
if schedules is not None:
|
32
33
|
for obj in schedules:
|
33
34
|
if isinstance(obj, get_args(SCHEDULE_TYPES)):
|
34
|
-
normalized.append(
|
35
|
+
normalized.append(create_deployment_schedule_create(obj))
|
35
36
|
elif isinstance(obj, dict):
|
36
|
-
normalized.append(
|
37
|
-
elif isinstance(obj,
|
37
|
+
normalized.append(create_deployment_schedule_create(**obj))
|
38
|
+
elif isinstance(obj, DeploymentScheduleCreate):
|
38
39
|
normalized.append(obj)
|
39
|
-
elif
|
40
|
+
elif _is_server_schema(obj):
|
40
41
|
raise ValueError(
|
41
42
|
"Server schema schedules are not supported. Please use "
|
42
43
|
"the schedule objects from `prefect.client.schemas.schedules`"
|
@@ -44,7 +45,11 @@ def normalize_to_minimal_deployment_schedules(
|
|
44
45
|
else:
|
45
46
|
raise ValueError(
|
46
47
|
"Invalid schedule provided. Must be a schedule object, a dict,"
|
47
|
-
"
|
48
|
+
"or a `DeploymentScheduleCreate` object"
|
48
49
|
)
|
49
50
|
|
50
51
|
return normalized
|
52
|
+
|
53
|
+
|
54
|
+
def _is_server_schema(obj: Any):
|
55
|
+
return obj.__class__.__module__.startswith("prefect.server.schemas")
|
@@ -3,16 +3,17 @@ Core set of steps for specifying a Prefect project pull step.
|
|
3
3
|
"""
|
4
4
|
import os
|
5
5
|
from pathlib import Path
|
6
|
-
from typing import Any, Optional
|
6
|
+
from typing import TYPE_CHECKING, Any, Optional
|
7
7
|
|
8
|
-
from prefect._internal.compatibility.deprecated import deprecated_callable
|
9
|
-
from prefect.blocks.core import Block
|
10
8
|
from prefect.logging.loggers import get_logger
|
11
9
|
from prefect.runner.storage import BlockStorageAdapter, GitRepository, RemoteStorage
|
12
10
|
from prefect.utilities.asyncutils import sync_compatible
|
13
11
|
|
14
12
|
deployment_logger = get_logger("deployment")
|
15
13
|
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from prefect.blocks.core import Block
|
16
|
+
|
16
17
|
|
17
18
|
def set_working_directory(directory: str) -> dict:
|
18
19
|
"""
|
@@ -35,7 +36,7 @@ async def git_clone(
|
|
35
36
|
branch: Optional[str] = None,
|
36
37
|
include_submodules: bool = False,
|
37
38
|
access_token: Optional[str] = None,
|
38
|
-
credentials: Optional[Block] = None,
|
39
|
+
credentials: Optional["Block"] = None,
|
39
40
|
) -> dict:
|
40
41
|
"""
|
41
42
|
Clones a git repository into the current working directory.
|
@@ -177,6 +178,8 @@ async def pull_with_block(block_document_name: str, block_type_slug: str):
|
|
177
178
|
block_document_name: The name of the block document to use
|
178
179
|
block_type_slug: The slug of the type of block to use
|
179
180
|
"""
|
181
|
+
from prefect.blocks.core import Block
|
182
|
+
|
180
183
|
full_slug = f"{block_type_slug}/{block_document_name}"
|
181
184
|
try:
|
182
185
|
block = await Block.load(full_slug)
|
@@ -199,20 +202,3 @@ async def pull_with_block(block_document_name: str, block_type_slug: str):
|
|
199
202
|
"Pulled code using block '%s' into '%s'", full_slug, directory
|
200
203
|
)
|
201
204
|
return {"directory": directory}
|
202
|
-
|
203
|
-
|
204
|
-
@deprecated_callable(start_date="Jun 2023", help="Use 'git clone' instead.")
|
205
|
-
@sync_compatible
|
206
|
-
async def git_clone_project(
|
207
|
-
repository: str,
|
208
|
-
branch: Optional[str] = None,
|
209
|
-
include_submodules: bool = False,
|
210
|
-
access_token: Optional[str] = None,
|
211
|
-
) -> dict:
|
212
|
-
"""Deprecated. Use `git_clone` instead."""
|
213
|
-
return await git_clone(
|
214
|
-
repository=repository,
|
215
|
-
branch=branch,
|
216
|
-
include_submodules=include_submodules,
|
217
|
-
access_token=access_token,
|
218
|
-
)
|