prefect-client 2.19.4__py3-none-any.whl → 3.0.0rc2__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 (242) 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/redis.py +168 -0
  26. prefect/blocks/system.py +22 -11
  27. prefect/blocks/webhook.py +2 -9
  28. prefect/client/base.py +4 -4
  29. prefect/client/cloud.py +8 -13
  30. prefect/client/orchestration.py +362 -340
  31. prefect/client/schemas/actions.py +92 -86
  32. prefect/client/schemas/filters.py +20 -40
  33. prefect/client/schemas/objects.py +158 -152
  34. prefect/client/schemas/responses.py +16 -24
  35. prefect/client/schemas/schedules.py +47 -35
  36. prefect/client/subscriptions.py +2 -2
  37. prefect/client/utilities.py +5 -2
  38. prefect/concurrency/asyncio.py +4 -2
  39. prefect/concurrency/events.py +1 -1
  40. prefect/concurrency/services.py +7 -4
  41. prefect/context.py +195 -27
  42. prefect/deployments/__init__.py +5 -6
  43. prefect/deployments/base.py +7 -5
  44. prefect/deployments/flow_runs.py +185 -0
  45. prefect/deployments/runner.py +50 -45
  46. prefect/deployments/schedules.py +28 -23
  47. prefect/deployments/steps/__init__.py +0 -1
  48. prefect/deployments/steps/core.py +1 -0
  49. prefect/deployments/steps/pull.py +7 -21
  50. prefect/engine.py +12 -2422
  51. prefect/events/actions.py +17 -23
  52. prefect/events/cli/automations.py +19 -6
  53. prefect/events/clients.py +14 -37
  54. prefect/events/filters.py +14 -18
  55. prefect/events/related.py +2 -2
  56. prefect/events/schemas/__init__.py +0 -5
  57. prefect/events/schemas/automations.py +55 -46
  58. prefect/events/schemas/deployment_triggers.py +7 -197
  59. prefect/events/schemas/events.py +36 -65
  60. prefect/events/schemas/labelling.py +10 -14
  61. prefect/events/utilities.py +2 -3
  62. prefect/events/worker.py +2 -3
  63. prefect/filesystems.py +6 -517
  64. prefect/{new_flow_engine.py → flow_engine.py} +315 -74
  65. prefect/flow_runs.py +379 -7
  66. prefect/flows.py +248 -165
  67. prefect/futures.py +187 -345
  68. prefect/infrastructure/__init__.py +0 -27
  69. prefect/infrastructure/provisioners/__init__.py +5 -3
  70. prefect/infrastructure/provisioners/cloud_run.py +11 -6
  71. prefect/infrastructure/provisioners/container_instance.py +11 -7
  72. prefect/infrastructure/provisioners/ecs.py +6 -4
  73. prefect/infrastructure/provisioners/modal.py +8 -5
  74. prefect/input/actions.py +2 -4
  75. prefect/input/run_input.py +9 -9
  76. prefect/logging/formatters.py +0 -2
  77. prefect/logging/handlers.py +3 -11
  78. prefect/logging/loggers.py +2 -2
  79. prefect/manifests.py +2 -1
  80. prefect/records/__init__.py +1 -0
  81. prefect/records/cache_policies.py +179 -0
  82. prefect/records/result_store.py +42 -0
  83. prefect/records/store.py +9 -0
  84. prefect/results.py +43 -39
  85. prefect/runner/runner.py +9 -9
  86. prefect/runner/server.py +6 -10
  87. prefect/runner/storage.py +3 -8
  88. prefect/runner/submit.py +2 -2
  89. prefect/runner/utils.py +2 -2
  90. prefect/serializers.py +24 -35
  91. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  92. prefect/settings.py +76 -136
  93. prefect/states.py +22 -50
  94. prefect/task_engine.py +666 -56
  95. prefect/task_runners.py +272 -300
  96. prefect/task_runs.py +203 -0
  97. prefect/{task_server.py → task_worker.py} +89 -60
  98. prefect/tasks.py +358 -341
  99. prefect/transactions.py +224 -0
  100. prefect/types/__init__.py +61 -82
  101. prefect/utilities/asyncutils.py +195 -136
  102. prefect/utilities/callables.py +121 -41
  103. prefect/utilities/collections.py +23 -38
  104. prefect/utilities/dispatch.py +11 -3
  105. prefect/utilities/dockerutils.py +4 -0
  106. prefect/utilities/engine.py +140 -20
  107. prefect/utilities/importtools.py +26 -27
  108. prefect/utilities/pydantic.py +128 -38
  109. prefect/utilities/schema_tools/hydration.py +5 -1
  110. prefect/utilities/templating.py +12 -2
  111. prefect/variables.py +84 -62
  112. prefect/workers/__init__.py +0 -1
  113. prefect/workers/base.py +26 -18
  114. prefect/workers/process.py +3 -8
  115. prefect/workers/server.py +2 -2
  116. {prefect_client-2.19.4.dist-info → prefect_client-3.0.0rc2.dist-info}/METADATA +23 -21
  117. prefect_client-3.0.0rc2.dist-info/RECORD +179 -0
  118. prefect/_internal/pydantic/_base_model.py +0 -51
  119. prefect/_internal/pydantic/_compat.py +0 -82
  120. prefect/_internal/pydantic/_flags.py +0 -20
  121. prefect/_internal/pydantic/_types.py +0 -8
  122. prefect/_internal/pydantic/utilities/__init__.py +0 -0
  123. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  124. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  125. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  126. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  127. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  128. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  129. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  130. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  131. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  132. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  133. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  134. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  135. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  136. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  137. prefect/_vendor/__init__.py +0 -0
  138. prefect/_vendor/fastapi/__init__.py +0 -25
  139. prefect/_vendor/fastapi/applications.py +0 -946
  140. prefect/_vendor/fastapi/background.py +0 -3
  141. prefect/_vendor/fastapi/concurrency.py +0 -44
  142. prefect/_vendor/fastapi/datastructures.py +0 -58
  143. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  144. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  145. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  146. prefect/_vendor/fastapi/encoders.py +0 -177
  147. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  148. prefect/_vendor/fastapi/exceptions.py +0 -46
  149. prefect/_vendor/fastapi/logger.py +0 -3
  150. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  151. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  152. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  153. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  154. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  155. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  156. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  157. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  158. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  159. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  160. prefect/_vendor/fastapi/openapi/models.py +0 -480
  161. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  162. prefect/_vendor/fastapi/param_functions.py +0 -340
  163. prefect/_vendor/fastapi/params.py +0 -453
  164. prefect/_vendor/fastapi/requests.py +0 -4
  165. prefect/_vendor/fastapi/responses.py +0 -40
  166. prefect/_vendor/fastapi/routing.py +0 -1331
  167. prefect/_vendor/fastapi/security/__init__.py +0 -15
  168. prefect/_vendor/fastapi/security/api_key.py +0 -98
  169. prefect/_vendor/fastapi/security/base.py +0 -6
  170. prefect/_vendor/fastapi/security/http.py +0 -172
  171. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  172. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  173. prefect/_vendor/fastapi/security/utils.py +0 -10
  174. prefect/_vendor/fastapi/staticfiles.py +0 -1
  175. prefect/_vendor/fastapi/templating.py +0 -3
  176. prefect/_vendor/fastapi/testclient.py +0 -1
  177. prefect/_vendor/fastapi/types.py +0 -3
  178. prefect/_vendor/fastapi/utils.py +0 -235
  179. prefect/_vendor/fastapi/websockets.py +0 -7
  180. prefect/_vendor/starlette/__init__.py +0 -1
  181. prefect/_vendor/starlette/_compat.py +0 -28
  182. prefect/_vendor/starlette/_exception_handler.py +0 -80
  183. prefect/_vendor/starlette/_utils.py +0 -88
  184. prefect/_vendor/starlette/applications.py +0 -261
  185. prefect/_vendor/starlette/authentication.py +0 -159
  186. prefect/_vendor/starlette/background.py +0 -43
  187. prefect/_vendor/starlette/concurrency.py +0 -59
  188. prefect/_vendor/starlette/config.py +0 -151
  189. prefect/_vendor/starlette/convertors.py +0 -87
  190. prefect/_vendor/starlette/datastructures.py +0 -707
  191. prefect/_vendor/starlette/endpoints.py +0 -130
  192. prefect/_vendor/starlette/exceptions.py +0 -60
  193. prefect/_vendor/starlette/formparsers.py +0 -276
  194. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  195. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  196. prefect/_vendor/starlette/middleware/base.py +0 -220
  197. prefect/_vendor/starlette/middleware/cors.py +0 -176
  198. prefect/_vendor/starlette/middleware/errors.py +0 -265
  199. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  200. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  201. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  202. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  203. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  204. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  205. prefect/_vendor/starlette/requests.py +0 -328
  206. prefect/_vendor/starlette/responses.py +0 -347
  207. prefect/_vendor/starlette/routing.py +0 -933
  208. prefect/_vendor/starlette/schemas.py +0 -154
  209. prefect/_vendor/starlette/staticfiles.py +0 -248
  210. prefect/_vendor/starlette/status.py +0 -199
  211. prefect/_vendor/starlette/templating.py +0 -231
  212. prefect/_vendor/starlette/testclient.py +0 -804
  213. prefect/_vendor/starlette/types.py +0 -30
  214. prefect/_vendor/starlette/websockets.py +0 -193
  215. prefect/agent.py +0 -698
  216. prefect/deployments/deployments.py +0 -1042
  217. prefect/deprecated/__init__.py +0 -0
  218. prefect/deprecated/data_documents.py +0 -350
  219. prefect/deprecated/packaging/__init__.py +0 -12
  220. prefect/deprecated/packaging/base.py +0 -96
  221. prefect/deprecated/packaging/docker.py +0 -146
  222. prefect/deprecated/packaging/file.py +0 -92
  223. prefect/deprecated/packaging/orion.py +0 -80
  224. prefect/deprecated/packaging/serializers.py +0 -171
  225. prefect/events/instrument.py +0 -135
  226. prefect/infrastructure/base.py +0 -323
  227. prefect/infrastructure/container.py +0 -818
  228. prefect/infrastructure/kubernetes.py +0 -920
  229. prefect/infrastructure/process.py +0 -289
  230. prefect/new_task_engine.py +0 -423
  231. prefect/pydantic/__init__.py +0 -76
  232. prefect/pydantic/main.py +0 -39
  233. prefect/software/__init__.py +0 -2
  234. prefect/software/base.py +0 -50
  235. prefect/software/conda.py +0 -199
  236. prefect/software/pip.py +0 -122
  237. prefect/software/python.py +0 -52
  238. prefect/workers/block.py +0 -218
  239. prefect_client-2.19.4.dist-info/RECORD +0 -292
  240. {prefect_client-2.19.4.dist-info → prefect_client-3.0.0rc2.dist-info}/LICENSE +0 -0
  241. {prefect_client-2.19.4.dist-info → prefect_client-3.0.0rc2.dist-info}/WHEEL +0 -0
  242. {prefect_client-2.19.4.dist-info → prefect_client-3.0.0rc2.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
- )