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.
Files changed (239) hide show
  1. prefect/__init__.py +8 -56
  2. prefect/_internal/compatibility/deprecated.py +6 -115
  3. prefect/_internal/compatibility/experimental.py +4 -79
  4. prefect/_internal/concurrency/api.py +0 -34
  5. prefect/_internal/concurrency/calls.py +0 -6
  6. prefect/_internal/concurrency/cancellation.py +0 -3
  7. prefect/_internal/concurrency/event_loop.py +0 -20
  8. prefect/_internal/concurrency/inspection.py +3 -3
  9. prefect/_internal/concurrency/threads.py +35 -0
  10. prefect/_internal/concurrency/waiters.py +0 -28
  11. prefect/_internal/pydantic/__init__.py +0 -45
  12. prefect/_internal/pydantic/v1_schema.py +21 -22
  13. prefect/_internal/pydantic/v2_schema.py +0 -2
  14. prefect/_internal/pydantic/v2_validated_func.py +18 -23
  15. prefect/_internal/schemas/bases.py +44 -177
  16. prefect/_internal/schemas/fields.py +1 -43
  17. prefect/_internal/schemas/validators.py +60 -158
  18. prefect/artifacts.py +161 -14
  19. prefect/automations.py +39 -4
  20. prefect/blocks/abstract.py +1 -1
  21. prefect/blocks/core.py +268 -148
  22. prefect/blocks/fields.py +2 -57
  23. prefect/blocks/kubernetes.py +8 -12
  24. prefect/blocks/notifications.py +40 -20
  25. prefect/blocks/system.py +22 -11
  26. prefect/blocks/webhook.py +2 -9
  27. prefect/client/base.py +4 -4
  28. prefect/client/cloud.py +8 -13
  29. prefect/client/orchestration.py +347 -341
  30. prefect/client/schemas/actions.py +92 -86
  31. prefect/client/schemas/filters.py +20 -40
  32. prefect/client/schemas/objects.py +147 -145
  33. prefect/client/schemas/responses.py +16 -24
  34. prefect/client/schemas/schedules.py +47 -35
  35. prefect/client/subscriptions.py +2 -2
  36. prefect/client/utilities.py +5 -2
  37. prefect/concurrency/asyncio.py +3 -1
  38. prefect/concurrency/events.py +1 -1
  39. prefect/concurrency/services.py +6 -3
  40. prefect/context.py +195 -27
  41. prefect/deployments/__init__.py +5 -6
  42. prefect/deployments/base.py +7 -5
  43. prefect/deployments/flow_runs.py +185 -0
  44. prefect/deployments/runner.py +50 -45
  45. prefect/deployments/schedules.py +28 -23
  46. prefect/deployments/steps/__init__.py +0 -1
  47. prefect/deployments/steps/core.py +1 -0
  48. prefect/deployments/steps/pull.py +7 -21
  49. prefect/engine.py +12 -2422
  50. prefect/events/actions.py +17 -23
  51. prefect/events/cli/automations.py +19 -6
  52. prefect/events/clients.py +14 -37
  53. prefect/events/filters.py +14 -18
  54. prefect/events/related.py +2 -2
  55. prefect/events/schemas/__init__.py +0 -5
  56. prefect/events/schemas/automations.py +55 -46
  57. prefect/events/schemas/deployment_triggers.py +7 -197
  58. prefect/events/schemas/events.py +34 -65
  59. prefect/events/schemas/labelling.py +10 -14
  60. prefect/events/utilities.py +2 -3
  61. prefect/events/worker.py +2 -3
  62. prefect/filesystems.py +6 -517
  63. prefect/{new_flow_engine.py → flow_engine.py} +313 -72
  64. prefect/flow_runs.py +377 -5
  65. prefect/flows.py +248 -165
  66. prefect/futures.py +186 -345
  67. prefect/infrastructure/__init__.py +0 -27
  68. prefect/infrastructure/provisioners/__init__.py +5 -3
  69. prefect/infrastructure/provisioners/cloud_run.py +11 -6
  70. prefect/infrastructure/provisioners/container_instance.py +11 -7
  71. prefect/infrastructure/provisioners/ecs.py +6 -4
  72. prefect/infrastructure/provisioners/modal.py +8 -5
  73. prefect/input/actions.py +2 -4
  74. prefect/input/run_input.py +5 -7
  75. prefect/logging/formatters.py +0 -2
  76. prefect/logging/handlers.py +3 -11
  77. prefect/logging/loggers.py +2 -2
  78. prefect/manifests.py +2 -1
  79. prefect/records/__init__.py +1 -0
  80. prefect/records/result_store.py +42 -0
  81. prefect/records/store.py +9 -0
  82. prefect/results.py +43 -39
  83. prefect/runner/runner.py +9 -9
  84. prefect/runner/server.py +6 -10
  85. prefect/runner/storage.py +3 -8
  86. prefect/runner/submit.py +2 -2
  87. prefect/runner/utils.py +2 -2
  88. prefect/serializers.py +24 -35
  89. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  90. prefect/settings.py +70 -133
  91. prefect/states.py +17 -47
  92. prefect/task_engine.py +697 -58
  93. prefect/task_runners.py +269 -301
  94. prefect/task_server.py +53 -34
  95. prefect/tasks.py +327 -337
  96. prefect/transactions.py +220 -0
  97. prefect/types/__init__.py +61 -82
  98. prefect/utilities/asyncutils.py +195 -136
  99. prefect/utilities/callables.py +121 -41
  100. prefect/utilities/collections.py +23 -38
  101. prefect/utilities/dispatch.py +11 -3
  102. prefect/utilities/dockerutils.py +4 -0
  103. prefect/utilities/engine.py +140 -20
  104. prefect/utilities/importtools.py +26 -27
  105. prefect/utilities/pydantic.py +128 -38
  106. prefect/utilities/schema_tools/hydration.py +5 -1
  107. prefect/utilities/templating.py +12 -2
  108. prefect/variables.py +78 -61
  109. prefect/workers/__init__.py +0 -1
  110. prefect/workers/base.py +15 -17
  111. prefect/workers/process.py +3 -8
  112. prefect/workers/server.py +2 -2
  113. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/METADATA +22 -21
  114. prefect_client-3.0.0rc1.dist-info/RECORD +176 -0
  115. prefect/_internal/pydantic/_base_model.py +0 -51
  116. prefect/_internal/pydantic/_compat.py +0 -82
  117. prefect/_internal/pydantic/_flags.py +0 -20
  118. prefect/_internal/pydantic/_types.py +0 -8
  119. prefect/_internal/pydantic/utilities/__init__.py +0 -0
  120. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  121. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  122. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  123. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  124. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  125. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  126. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  127. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  128. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  129. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  130. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  131. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  132. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  133. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  134. prefect/_vendor/__init__.py +0 -0
  135. prefect/_vendor/fastapi/__init__.py +0 -25
  136. prefect/_vendor/fastapi/applications.py +0 -946
  137. prefect/_vendor/fastapi/background.py +0 -3
  138. prefect/_vendor/fastapi/concurrency.py +0 -44
  139. prefect/_vendor/fastapi/datastructures.py +0 -58
  140. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  141. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  142. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  143. prefect/_vendor/fastapi/encoders.py +0 -177
  144. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  145. prefect/_vendor/fastapi/exceptions.py +0 -46
  146. prefect/_vendor/fastapi/logger.py +0 -3
  147. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  148. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  149. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  150. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  151. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  152. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  153. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  154. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  155. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  156. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  157. prefect/_vendor/fastapi/openapi/models.py +0 -480
  158. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  159. prefect/_vendor/fastapi/param_functions.py +0 -340
  160. prefect/_vendor/fastapi/params.py +0 -453
  161. prefect/_vendor/fastapi/requests.py +0 -4
  162. prefect/_vendor/fastapi/responses.py +0 -40
  163. prefect/_vendor/fastapi/routing.py +0 -1331
  164. prefect/_vendor/fastapi/security/__init__.py +0 -15
  165. prefect/_vendor/fastapi/security/api_key.py +0 -98
  166. prefect/_vendor/fastapi/security/base.py +0 -6
  167. prefect/_vendor/fastapi/security/http.py +0 -172
  168. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  169. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  170. prefect/_vendor/fastapi/security/utils.py +0 -10
  171. prefect/_vendor/fastapi/staticfiles.py +0 -1
  172. prefect/_vendor/fastapi/templating.py +0 -3
  173. prefect/_vendor/fastapi/testclient.py +0 -1
  174. prefect/_vendor/fastapi/types.py +0 -3
  175. prefect/_vendor/fastapi/utils.py +0 -235
  176. prefect/_vendor/fastapi/websockets.py +0 -7
  177. prefect/_vendor/starlette/__init__.py +0 -1
  178. prefect/_vendor/starlette/_compat.py +0 -28
  179. prefect/_vendor/starlette/_exception_handler.py +0 -80
  180. prefect/_vendor/starlette/_utils.py +0 -88
  181. prefect/_vendor/starlette/applications.py +0 -261
  182. prefect/_vendor/starlette/authentication.py +0 -159
  183. prefect/_vendor/starlette/background.py +0 -43
  184. prefect/_vendor/starlette/concurrency.py +0 -59
  185. prefect/_vendor/starlette/config.py +0 -151
  186. prefect/_vendor/starlette/convertors.py +0 -87
  187. prefect/_vendor/starlette/datastructures.py +0 -707
  188. prefect/_vendor/starlette/endpoints.py +0 -130
  189. prefect/_vendor/starlette/exceptions.py +0 -60
  190. prefect/_vendor/starlette/formparsers.py +0 -276
  191. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  192. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  193. prefect/_vendor/starlette/middleware/base.py +0 -220
  194. prefect/_vendor/starlette/middleware/cors.py +0 -176
  195. prefect/_vendor/starlette/middleware/errors.py +0 -265
  196. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  197. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  198. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  199. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  200. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  201. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  202. prefect/_vendor/starlette/requests.py +0 -328
  203. prefect/_vendor/starlette/responses.py +0 -347
  204. prefect/_vendor/starlette/routing.py +0 -933
  205. prefect/_vendor/starlette/schemas.py +0 -154
  206. prefect/_vendor/starlette/staticfiles.py +0 -248
  207. prefect/_vendor/starlette/status.py +0 -199
  208. prefect/_vendor/starlette/templating.py +0 -231
  209. prefect/_vendor/starlette/testclient.py +0 -804
  210. prefect/_vendor/starlette/types.py +0 -30
  211. prefect/_vendor/starlette/websockets.py +0 -193
  212. prefect/agent.py +0 -698
  213. prefect/deployments/deployments.py +0 -1042
  214. prefect/deprecated/__init__.py +0 -0
  215. prefect/deprecated/data_documents.py +0 -350
  216. prefect/deprecated/packaging/__init__.py +0 -12
  217. prefect/deprecated/packaging/base.py +0 -96
  218. prefect/deprecated/packaging/docker.py +0 -146
  219. prefect/deprecated/packaging/file.py +0 -92
  220. prefect/deprecated/packaging/orion.py +0 -80
  221. prefect/deprecated/packaging/serializers.py +0 -171
  222. prefect/events/instrument.py +0 -135
  223. prefect/infrastructure/base.py +0 -323
  224. prefect/infrastructure/container.py +0 -818
  225. prefect/infrastructure/kubernetes.py +0 -920
  226. prefect/infrastructure/process.py +0 -289
  227. prefect/new_task_engine.py +0 -423
  228. prefect/pydantic/__init__.py +0 -76
  229. prefect/pydantic/main.py +0 -39
  230. prefect/software/__init__.py +0 -2
  231. prefect/software/base.py +0 -50
  232. prefect/software/conda.py +0 -199
  233. prefect/software/pip.py +0 -122
  234. prefect/software/python.py +0 -52
  235. prefect/workers/block.py +0 -218
  236. prefect_client-2.19.3.dist-info/RECORD +0 -292
  237. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/LICENSE +0 -0
  238. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/WHEEL +0 -0
  239. {prefect_client-2.19.3.dist-info → prefect_client-3.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -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.objects import MinimalDeploymentSchedule
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
- create_minimal_deployment_schedule,
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
- class Config:
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[MinimalDeploymentSchedule]] = Field(
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=False,
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
- @validator("triggers", allow_reuse=True)
236
- def validate_automation_names(cls, field_value, values):
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
- return validate_automation_names(field_value, values)
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
- @root_validator(pre=True)
242
+ @model_validator(mode="before")
243
+ @classmethod
241
244
  def reconcile_paused(cls, values):
242
245
  return reconcile_paused_deployment(values)
243
246
 
244
- @root_validator(pre=True)
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.dict(),
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
- if client.server_type.supports_automations():
329
- try:
330
- # The triggers defined in the deployment spec are, essentially,
331
- # anonymous and attempting truly sync them with cloud is not
332
- # feasible. Instead, we remove all automations that are owned
333
- # by the deployment, meaning that they were created via this
334
- # mechanism below, and then recreate them.
335
- await client.delete_resource_owned_automations(
336
- f"prefect.deployment.{deployment_id}"
337
- )
338
- except PrefectHTTPStatusError as e:
339
- if e.response.status_code == 404:
340
- # This Prefect server does not support automations, so we can safely
341
- # ignore this 404 and move on.
342
- return deployment_id
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
- for trigger in self.triggers:
346
- trigger.set_deployment_id(deployment_id)
347
- await client.create_automation(trigger.as_automation())
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[MinimalDeploymentSchedule], FlexibleScheduleList]:
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
- create_minimal_deployment_schedule(
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 [create_minimal_deployment_schedule(schedule)]
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 = False,
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 = False,
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 = False,
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,
@@ -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.objects import MinimalDeploymentSchedule
4
- from prefect.client.schemas.schedules import SCHEDULE_TYPES
3
+ from prefect.client.schemas.actions import DeploymentScheduleCreate
5
4
 
6
- try:
7
- from prefect.server.schemas.schedules import SCHEDULE_TYPES as SERVER_SCHEDULE_TYPES
5
+ if TYPE_CHECKING:
6
+ from prefect.client.schemas.schedules import SCHEDULE_TYPES
8
7
 
9
- SERVER_SCHEDULE_TYPES = get_args(SERVER_SCHEDULE_TYPES)
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
- def create_minimal_deployment_schedule(
18
- schedule: SCHEDULE_TYPES,
11
+ def create_deployment_schedule_create(
12
+ schedule: "SCHEDULE_TYPES",
19
13
  active: Optional[bool] = True,
20
- ) -> MinimalDeploymentSchedule:
21
- return MinimalDeploymentSchedule(
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 normalize_to_minimal_deployment_schedules(
28
- schedules: Optional[FlexibleScheduleList],
29
- ) -> List[MinimalDeploymentSchedule]:
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(create_minimal_deployment_schedule(obj))
35
+ normalized.append(create_deployment_schedule_create(obj))
35
36
  elif isinstance(obj, dict):
36
- normalized.append(create_minimal_deployment_schedule(**obj))
37
- elif isinstance(obj, MinimalDeploymentSchedule):
37
+ normalized.append(create_deployment_schedule_create(**obj))
38
+ elif isinstance(obj, DeploymentScheduleCreate):
38
39
  normalized.append(obj)
39
- elif isinstance(obj, SERVER_SCHEDULE_TYPES):
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
- " or a MinimalDeploymentSchedule."
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")
@@ -1,7 +1,6 @@
1
1
  from .core import run_step
2
2
  from .pull import (
3
3
  git_clone,
4
- git_clone_project,
5
4
  set_working_directory,
6
5
  pull_from_remote_storage,
7
6
  pull_with_block,
@@ -10,6 +10,7 @@ Whenever a step is run, the following actions are taken:
10
10
  - The step's function is called with the resolved inputs
11
11
  - The step's output is returned and used to resolve inputs for subsequent steps
12
12
  """
13
+
13
14
  import os
14
15
  import re
15
16
  import subprocess
@@ -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
- )