prefect-client 2.20.2__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.
Files changed (288) hide show
  1. prefect/__init__.py +74 -110
  2. prefect/_internal/compatibility/deprecated.py +6 -115
  3. prefect/_internal/compatibility/experimental.py +4 -79
  4. prefect/_internal/compatibility/migration.py +166 -0
  5. prefect/_internal/concurrency/__init__.py +2 -2
  6. prefect/_internal/concurrency/api.py +1 -35
  7. prefect/_internal/concurrency/calls.py +0 -6
  8. prefect/_internal/concurrency/cancellation.py +0 -3
  9. prefect/_internal/concurrency/event_loop.py +0 -20
  10. prefect/_internal/concurrency/inspection.py +3 -3
  11. prefect/_internal/concurrency/primitives.py +1 -0
  12. prefect/_internal/concurrency/services.py +23 -0
  13. prefect/_internal/concurrency/threads.py +35 -0
  14. prefect/_internal/concurrency/waiters.py +0 -28
  15. prefect/_internal/integrations.py +7 -0
  16. prefect/_internal/pydantic/__init__.py +0 -45
  17. prefect/_internal/pydantic/annotations/pendulum.py +2 -2
  18. prefect/_internal/pydantic/v1_schema.py +21 -22
  19. prefect/_internal/pydantic/v2_schema.py +0 -2
  20. prefect/_internal/pydantic/v2_validated_func.py +18 -23
  21. prefect/_internal/pytz.py +1 -1
  22. prefect/_internal/retries.py +61 -0
  23. prefect/_internal/schemas/bases.py +45 -177
  24. prefect/_internal/schemas/fields.py +1 -43
  25. prefect/_internal/schemas/validators.py +47 -233
  26. prefect/agent.py +3 -695
  27. prefect/artifacts.py +173 -14
  28. prefect/automations.py +39 -4
  29. prefect/blocks/abstract.py +1 -1
  30. prefect/blocks/core.py +423 -164
  31. prefect/blocks/fields.py +2 -57
  32. prefect/blocks/notifications.py +43 -28
  33. prefect/blocks/redis.py +168 -0
  34. prefect/blocks/system.py +67 -20
  35. prefect/blocks/webhook.py +2 -9
  36. prefect/cache_policies.py +239 -0
  37. prefect/client/__init__.py +4 -0
  38. prefect/client/base.py +33 -27
  39. prefect/client/cloud.py +65 -20
  40. prefect/client/collections.py +1 -1
  41. prefect/client/orchestration.py +667 -440
  42. prefect/client/schemas/actions.py +115 -100
  43. prefect/client/schemas/filters.py +46 -52
  44. prefect/client/schemas/objects.py +228 -178
  45. prefect/client/schemas/responses.py +18 -36
  46. prefect/client/schemas/schedules.py +55 -36
  47. prefect/client/schemas/sorting.py +2 -0
  48. prefect/client/subscriptions.py +8 -7
  49. prefect/client/types/flexible_schedule_list.py +11 -0
  50. prefect/client/utilities.py +9 -6
  51. prefect/concurrency/asyncio.py +60 -11
  52. prefect/concurrency/context.py +24 -0
  53. prefect/concurrency/events.py +2 -2
  54. prefect/concurrency/services.py +46 -16
  55. prefect/concurrency/sync.py +51 -7
  56. prefect/concurrency/v1/asyncio.py +143 -0
  57. prefect/concurrency/v1/context.py +27 -0
  58. prefect/concurrency/v1/events.py +61 -0
  59. prefect/concurrency/v1/services.py +116 -0
  60. prefect/concurrency/v1/sync.py +92 -0
  61. prefect/context.py +246 -149
  62. prefect/deployments/__init__.py +33 -18
  63. prefect/deployments/base.py +10 -15
  64. prefect/deployments/deployments.py +2 -1048
  65. prefect/deployments/flow_runs.py +178 -0
  66. prefect/deployments/runner.py +72 -173
  67. prefect/deployments/schedules.py +31 -25
  68. prefect/deployments/steps/__init__.py +0 -1
  69. prefect/deployments/steps/core.py +7 -0
  70. prefect/deployments/steps/pull.py +15 -21
  71. prefect/deployments/steps/utility.py +2 -1
  72. prefect/docker/__init__.py +20 -0
  73. prefect/docker/docker_image.py +82 -0
  74. prefect/engine.py +15 -2466
  75. prefect/events/actions.py +17 -23
  76. prefect/events/cli/automations.py +20 -7
  77. prefect/events/clients.py +142 -80
  78. prefect/events/filters.py +14 -18
  79. prefect/events/related.py +74 -75
  80. prefect/events/schemas/__init__.py +0 -5
  81. prefect/events/schemas/automations.py +55 -46
  82. prefect/events/schemas/deployment_triggers.py +7 -197
  83. prefect/events/schemas/events.py +46 -65
  84. prefect/events/schemas/labelling.py +10 -14
  85. prefect/events/utilities.py +4 -5
  86. prefect/events/worker.py +23 -8
  87. prefect/exceptions.py +15 -0
  88. prefect/filesystems.py +30 -529
  89. prefect/flow_engine.py +827 -0
  90. prefect/flow_runs.py +379 -7
  91. prefect/flows.py +470 -360
  92. prefect/futures.py +382 -331
  93. prefect/infrastructure/__init__.py +5 -26
  94. prefect/infrastructure/base.py +3 -320
  95. prefect/infrastructure/provisioners/__init__.py +5 -3
  96. prefect/infrastructure/provisioners/cloud_run.py +13 -8
  97. prefect/infrastructure/provisioners/container_instance.py +14 -9
  98. prefect/infrastructure/provisioners/ecs.py +10 -8
  99. prefect/infrastructure/provisioners/modal.py +8 -5
  100. prefect/input/__init__.py +4 -0
  101. prefect/input/actions.py +2 -4
  102. prefect/input/run_input.py +9 -9
  103. prefect/logging/formatters.py +2 -4
  104. prefect/logging/handlers.py +9 -14
  105. prefect/logging/loggers.py +5 -5
  106. prefect/main.py +72 -0
  107. prefect/plugins.py +2 -64
  108. prefect/profiles.toml +16 -2
  109. prefect/records/__init__.py +1 -0
  110. prefect/records/base.py +223 -0
  111. prefect/records/filesystem.py +207 -0
  112. prefect/records/memory.py +178 -0
  113. prefect/records/result_store.py +64 -0
  114. prefect/results.py +577 -504
  115. prefect/runner/runner.py +124 -51
  116. prefect/runner/server.py +32 -34
  117. prefect/runner/storage.py +3 -12
  118. prefect/runner/submit.py +2 -10
  119. prefect/runner/utils.py +2 -2
  120. prefect/runtime/__init__.py +1 -0
  121. prefect/runtime/deployment.py +1 -0
  122. prefect/runtime/flow_run.py +40 -5
  123. prefect/runtime/task_run.py +1 -0
  124. prefect/serializers.py +28 -39
  125. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  126. prefect/settings.py +209 -332
  127. prefect/states.py +160 -63
  128. prefect/task_engine.py +1478 -57
  129. prefect/task_runners.py +383 -287
  130. prefect/task_runs.py +240 -0
  131. prefect/task_worker.py +463 -0
  132. prefect/tasks.py +684 -374
  133. prefect/transactions.py +410 -0
  134. prefect/types/__init__.py +72 -86
  135. prefect/types/entrypoint.py +13 -0
  136. prefect/utilities/annotations.py +4 -3
  137. prefect/utilities/asyncutils.py +227 -148
  138. prefect/utilities/callables.py +138 -48
  139. prefect/utilities/collections.py +134 -86
  140. prefect/utilities/dispatch.py +27 -14
  141. prefect/utilities/dockerutils.py +11 -4
  142. prefect/utilities/engine.py +186 -32
  143. prefect/utilities/filesystem.py +4 -5
  144. prefect/utilities/importtools.py +26 -27
  145. prefect/utilities/pydantic.py +128 -38
  146. prefect/utilities/schema_tools/hydration.py +18 -1
  147. prefect/utilities/schema_tools/validation.py +30 -0
  148. prefect/utilities/services.py +35 -9
  149. prefect/utilities/templating.py +12 -2
  150. prefect/utilities/timeout.py +20 -5
  151. prefect/utilities/urls.py +195 -0
  152. prefect/utilities/visualization.py +1 -0
  153. prefect/variables.py +78 -59
  154. prefect/workers/__init__.py +0 -1
  155. prefect/workers/base.py +237 -244
  156. prefect/workers/block.py +5 -226
  157. prefect/workers/cloud.py +6 -0
  158. prefect/workers/process.py +265 -12
  159. prefect/workers/server.py +29 -11
  160. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/METADATA +30 -26
  161. prefect_client-3.0.0.dist-info/RECORD +201 -0
  162. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/WHEEL +1 -1
  163. prefect/_internal/pydantic/_base_model.py +0 -51
  164. prefect/_internal/pydantic/_compat.py +0 -82
  165. prefect/_internal/pydantic/_flags.py +0 -20
  166. prefect/_internal/pydantic/_types.py +0 -8
  167. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  168. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  169. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  170. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  171. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  172. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  173. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  174. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  175. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  176. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  177. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  178. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  179. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  180. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  181. prefect/_vendor/fastapi/__init__.py +0 -25
  182. prefect/_vendor/fastapi/applications.py +0 -946
  183. prefect/_vendor/fastapi/background.py +0 -3
  184. prefect/_vendor/fastapi/concurrency.py +0 -44
  185. prefect/_vendor/fastapi/datastructures.py +0 -58
  186. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  187. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  188. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  189. prefect/_vendor/fastapi/encoders.py +0 -177
  190. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  191. prefect/_vendor/fastapi/exceptions.py +0 -46
  192. prefect/_vendor/fastapi/logger.py +0 -3
  193. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  194. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  195. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  196. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  197. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  198. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  199. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  200. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  201. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  202. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  203. prefect/_vendor/fastapi/openapi/models.py +0 -480
  204. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  205. prefect/_vendor/fastapi/param_functions.py +0 -340
  206. prefect/_vendor/fastapi/params.py +0 -453
  207. prefect/_vendor/fastapi/py.typed +0 -0
  208. prefect/_vendor/fastapi/requests.py +0 -4
  209. prefect/_vendor/fastapi/responses.py +0 -40
  210. prefect/_vendor/fastapi/routing.py +0 -1331
  211. prefect/_vendor/fastapi/security/__init__.py +0 -15
  212. prefect/_vendor/fastapi/security/api_key.py +0 -98
  213. prefect/_vendor/fastapi/security/base.py +0 -6
  214. prefect/_vendor/fastapi/security/http.py +0 -172
  215. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  216. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  217. prefect/_vendor/fastapi/security/utils.py +0 -10
  218. prefect/_vendor/fastapi/staticfiles.py +0 -1
  219. prefect/_vendor/fastapi/templating.py +0 -3
  220. prefect/_vendor/fastapi/testclient.py +0 -1
  221. prefect/_vendor/fastapi/types.py +0 -3
  222. prefect/_vendor/fastapi/utils.py +0 -235
  223. prefect/_vendor/fastapi/websockets.py +0 -7
  224. prefect/_vendor/starlette/__init__.py +0 -1
  225. prefect/_vendor/starlette/_compat.py +0 -28
  226. prefect/_vendor/starlette/_exception_handler.py +0 -80
  227. prefect/_vendor/starlette/_utils.py +0 -88
  228. prefect/_vendor/starlette/applications.py +0 -261
  229. prefect/_vendor/starlette/authentication.py +0 -159
  230. prefect/_vendor/starlette/background.py +0 -43
  231. prefect/_vendor/starlette/concurrency.py +0 -59
  232. prefect/_vendor/starlette/config.py +0 -151
  233. prefect/_vendor/starlette/convertors.py +0 -87
  234. prefect/_vendor/starlette/datastructures.py +0 -707
  235. prefect/_vendor/starlette/endpoints.py +0 -130
  236. prefect/_vendor/starlette/exceptions.py +0 -60
  237. prefect/_vendor/starlette/formparsers.py +0 -276
  238. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  239. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  240. prefect/_vendor/starlette/middleware/base.py +0 -220
  241. prefect/_vendor/starlette/middleware/cors.py +0 -176
  242. prefect/_vendor/starlette/middleware/errors.py +0 -265
  243. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  244. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  245. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  246. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  247. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  248. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  249. prefect/_vendor/starlette/py.typed +0 -0
  250. prefect/_vendor/starlette/requests.py +0 -328
  251. prefect/_vendor/starlette/responses.py +0 -347
  252. prefect/_vendor/starlette/routing.py +0 -933
  253. prefect/_vendor/starlette/schemas.py +0 -154
  254. prefect/_vendor/starlette/staticfiles.py +0 -248
  255. prefect/_vendor/starlette/status.py +0 -199
  256. prefect/_vendor/starlette/templating.py +0 -231
  257. prefect/_vendor/starlette/testclient.py +0 -804
  258. prefect/_vendor/starlette/types.py +0 -30
  259. prefect/_vendor/starlette/websockets.py +0 -193
  260. prefect/blocks/kubernetes.py +0 -119
  261. prefect/deprecated/__init__.py +0 -0
  262. prefect/deprecated/data_documents.py +0 -350
  263. prefect/deprecated/packaging/__init__.py +0 -12
  264. prefect/deprecated/packaging/base.py +0 -96
  265. prefect/deprecated/packaging/docker.py +0 -146
  266. prefect/deprecated/packaging/file.py +0 -92
  267. prefect/deprecated/packaging/orion.py +0 -80
  268. prefect/deprecated/packaging/serializers.py +0 -171
  269. prefect/events/instrument.py +0 -135
  270. prefect/infrastructure/container.py +0 -824
  271. prefect/infrastructure/kubernetes.py +0 -920
  272. prefect/infrastructure/process.py +0 -289
  273. prefect/manifests.py +0 -20
  274. prefect/new_flow_engine.py +0 -449
  275. prefect/new_task_engine.py +0 -423
  276. prefect/pydantic/__init__.py +0 -76
  277. prefect/pydantic/main.py +0 -39
  278. prefect/software/__init__.py +0 -2
  279. prefect/software/base.py +0 -50
  280. prefect/software/conda.py +0 -199
  281. prefect/software/pip.py +0 -122
  282. prefect/software/python.py +0 -52
  283. prefect/task_server.py +0 -322
  284. prefect_client-2.20.2.dist-info/RECORD +0 -294
  285. /prefect/{_internal/pydantic/utilities → client/types}/__init__.py +0 -0
  286. /prefect/{_vendor → concurrency/v1}/__init__.py +0 -0
  287. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
  288. {prefect_client-2.20.2.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._internal.pydantic import HAS_PYDANTIC_V2
25
- from prefect._internal.pydantic._flags import USE_PYDANTIC_V2
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
- ### SCHEDULE SCHEMA VALIDATORS ###
240
-
241
-
242
- def validate_deprecated_schedule_fields(values: dict, logger: logging.Logger) -> dict:
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
- schedule = values.get("schedule", NotSet)
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
- create_minimal_deployment_schedule,
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
- if schedules is None and schedule is not None:
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
- is_schedule_active = values.get("is_schedule_active")
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: DateTimeTZ) -> DateTimeTZ:
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] = {}) -> str:
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.name
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
- raise ValueError(f"Unknown setting {setting!r}.")
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