prefect-client 2.20.4__py3-none-any.whl → 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +405 -153
  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 +650 -442
  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 -2475
  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 +117 -47
  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 +137 -45
  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.4.dist-info → prefect_client-3.0.0.dist-info}/METADATA +28 -24
  161. prefect_client-3.0.0.dist-info/RECORD +201 -0
  162. {prefect_client-2.20.4.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.4.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.4.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
  288. {prefect_client-2.20.4.dist-info → prefect_client-3.0.0.dist-info}/top_level.txt +0 -0
@@ -1,150 +0,0 @@
1
- """
2
- Conditional decorator for fields depending on Pydantic version.
3
- """
4
-
5
- import functools
6
- from inspect import signature
7
- from typing import TYPE_CHECKING, Any, Callable, Dict, Literal, TypeVar, Union
8
-
9
- from typing_extensions import TypeAlias
10
-
11
- from prefect._internal.pydantic._flags import HAS_PYDANTIC_V2, USE_V2_MODELS
12
-
13
- FieldValidatorModes: TypeAlias = Literal["before", "after", "wrap", "plain"]
14
- T = TypeVar("T", bound=Callable[..., Any])
15
-
16
- if TYPE_CHECKING:
17
- from prefect._internal.pydantic._compat import BaseModel
18
-
19
-
20
- def field_validator(
21
- field: str,
22
- /,
23
- *fields: str,
24
- mode: FieldValidatorModes = "after",
25
- check_fields: Union[bool, None] = None,
26
- ) -> Callable[[Any], Any]:
27
- """Usage docs: https://docs.pydantic.dev/2.7/concepts/validators/#field-validators
28
- Returns a decorator that conditionally applies Pydantic's `field_validator` or `validator`,
29
- based on the Pydantic version available, for specified field(s) of a Pydantic model.
30
-
31
- In Pydantic V2, it uses `field_validator` allowing more granular control over validation,
32
- including pre-validation and post-validation modes. In Pydantic V1, it falls back to
33
- using `validator`, which is less flexible but maintains backward compatibility.
34
-
35
- Decorate methods on the class indicating that they should be used to validate fields.
36
-
37
- !!! note Replacing Pydantic V1 `pre=True` kwarg:
38
- To replace a @validator that uses Pydantic V1's `pre` parameter, e.g. `@validator('a', pre=True)`,
39
- you can use `mode='before'`, e.g. @field_validator('a', mode='before').
40
-
41
- If a user has Pydantic V1 installed, `mode` will map to the `pre` parameter of `validator` if the value is `before`.
42
-
43
- !!! note Replacing Pydantic V1 `always=True` kwarg:
44
- To replace a @validator that uses Pydantic V1's `always` parameter, e.g. `@validator('a', always=True)`,
45
- you can use the @model_validator (not the @field_validator) with the `mode='before'` parameter, (and also add a check that the field is not None, if necessary).
46
-
47
- Read more discussion on that here: https://github.com/pydantic/pydantic/discussions/6337
48
-
49
- !!! note Replacing Pydantic V1 `allow_reuse=True` kwarg:
50
- To replace a @validator that uses Pydantic V1's `allow_reuse=True` parameter, e.g. `@validator('a', allow_reuse=True)`,
51
- you can simply remove the `allow_reuse` parameter when replacing the decorator, e.g. `@field_validator('a')`. This is because
52
- Pydantic V2 by default allows reuse of the decorated function, rendering the kwarg necessary), while Pydantic V1 required explicit
53
- declaration of `allow_reuse=True`.
54
-
55
- https://docs.pydantic.dev/2.0/migration/#the-allow_reuse-keyword-argument-is-no-longer-necessary
56
-
57
- Example usage:
58
- ```py
59
- from typing import Any
60
-
61
- from pydantic import (
62
- BaseModel,
63
- ValidationError,
64
- field_validator,
65
- )
66
-
67
- class Model(BaseModel):
68
- a: str
69
-
70
- @field_validator('a')
71
- @classmethod
72
- def ensure_foobar(cls, v: Any):
73
- if 'foobar' not in v:
74
- raise ValueError('"foobar" not found in a')
75
- return v
76
-
77
- print(repr(Model(a='this is foobar good')))
78
- #> Model(a='this is foobar good')
79
-
80
- try:
81
- Model(a='snap')
82
- except ValidationError as exc_info:
83
- print(exc_info)
84
- '''
85
- 1 validation error for Model
86
- a
87
- Value error, "foobar" not found in a [type=value_error, input_value='snap', input_type=str]
88
- '''
89
- ```
90
-
91
- For more in depth examples, see https://docs.pydantic.dev/latest/concepts/validators/#field-validators
92
-
93
- Args:
94
- field: The first field the `field_validator` should be called on; this is separate
95
- from `fields` to ensure an error is raised if you don't pass at least one.
96
- *fields: Additional field(s) the `field_validator` should be called on.
97
- mode: Specifies whether to validate the fields before or after validation.
98
- check_fields: Whether to check that the fields actually exist on the model.
99
-
100
- Returns:
101
- A decorator that can be used to decorate a function to be used as a field_validator.
102
-
103
- Raises:
104
- PydanticUserError:
105
- - If `@field_validator` is used bare (with no fields).
106
- - If the args passed to `@field_validator` as fields are not strings.
107
- - If `@field_validator` applied to instance methods.
108
- """
109
-
110
- def decorator(validate_func: T) -> T:
111
- if USE_V2_MODELS:
112
- from pydantic import field_validator # type: ignore
113
-
114
- return field_validator(
115
- field, *fields, mode=mode, check_fields=check_fields
116
- )(validate_func)
117
- elif HAS_PYDANTIC_V2:
118
- from pydantic.v1 import validator # type: ignore
119
- else:
120
- from pydantic import validator
121
-
122
- # Extract the parameters of the validate_func function
123
- # e.g. if validate_func has a signature of (cls, v, values, config), we want to
124
- # filter the kwargs to include only those expected by validate_func, which may
125
- # look like (cls, v) or (cls, v, values) etc.
126
- validate_func_params = signature(validate_func).parameters
127
-
128
- @functools.wraps(validate_func)
129
- def wrapper(
130
- cls: "BaseModel",
131
- v: Any,
132
- **kwargs: Any,
133
- ) -> Any:
134
- filtered_kwargs: Dict[str, Any] = {
135
- k: v for k, v in kwargs.items() if k in validate_func_params
136
- }
137
-
138
- return validate_func(cls, v, **filtered_kwargs)
139
-
140
- # Map Pydantic V2's `mode` to Pydantic V1's `pre` parameter for use in `@validator`
141
- pre: bool = mode == "before"
142
-
143
- validator_kwargs: Dict[str, Any] = {
144
- "pre": pre,
145
- "check_fields": check_fields if check_fields is not None else True,
146
- }
147
-
148
- return validator(field, *fields, **validator_kwargs)(wrapper) # type: ignore
149
-
150
- return decorator
@@ -1,56 +0,0 @@
1
- import typing
2
-
3
- from typing_extensions import Self
4
-
5
- from prefect._internal.pydantic._base_model import BaseModel
6
- from prefect._internal.pydantic._flags import USE_V2_MODELS
7
-
8
- T = typing.TypeVar("T", bound="BaseModel")
9
-
10
-
11
- def model_construct(
12
- model: typing.Type[T],
13
- _fields_set: typing.Optional[typing.Set[str]] = None,
14
- **values: typing.Any,
15
- ) -> T:
16
- """Creates a new instance of the `model` class with validated data.
17
-
18
- Creates a new model setting `__dict__` and `__pydantic_fields_set__` from trusted or pre-validated data.
19
- Default values are respected, but no other validation is performed.
20
-
21
- Args:
22
- _fields_set: The set of field names accepted for the Model instance.
23
- values: Trusted or pre-validated data dictionary.
24
-
25
- Returns:
26
- A new instance of the `model` class with validated data.
27
- """
28
- if USE_V2_MODELS:
29
- return model.model_construct(_fields_set=_fields_set, **values)
30
- else:
31
- return getattr(model, "construct")(**values)
32
-
33
-
34
- class ModelConstructMixin(BaseModel):
35
- @classmethod
36
- def model_construct(
37
- cls: typing.Type["Self"],
38
- _fields_set: typing.Optional[typing.Set[str]] = None,
39
- **values: typing.Any,
40
- ) -> "Self":
41
- """Creates a new instance of the `model` class with validated data.
42
-
43
- Creates a new model setting `__dict__` and `__pydantic_fields_set__` from trusted or pre-validated data.
44
- Default values are respected, but no other validation is performed.
45
-
46
- Args:
47
- _fields_set: The set of field names accepted for the Model instance.
48
- values: Trusted or pre-validated data dictionary.
49
-
50
- Returns:
51
- A new instance of the `model` class with validated data.
52
- """
53
- return model_construct(cls, _fields_set=_fields_set, **values)
54
-
55
-
56
- __all__ = ["model_construct", "ModelConstructMixin"]
@@ -1,55 +0,0 @@
1
- import typing
2
-
3
- from typing_extensions import Self
4
-
5
- from prefect._internal.pydantic._base_model import BaseModel
6
- from prefect._internal.pydantic._flags import USE_V2_MODELS
7
-
8
- T = typing.TypeVar("T", bound="BaseModel")
9
-
10
-
11
- def model_copy( # type: ignore[no-redef]
12
- model_instance: T,
13
- *,
14
- update: typing.Optional[typing.Dict[str, typing.Any]] = None,
15
- deep: bool = False,
16
- ) -> T:
17
- """
18
- Returns a copy of the model.
19
-
20
- Args:
21
- update: Values to change/add in the new model. Note: the data is not validated
22
- before creating the new model. You should trust this data.
23
- deep: Set to `True` to make a deep copy of the model.
24
-
25
- Returns:
26
- New model instance.
27
- """
28
- if USE_V2_MODELS:
29
- return model_instance.model_copy(update=update, deep=deep)
30
- else:
31
- return getattr(model_instance, "copy")(update=update, deep=deep)
32
-
33
-
34
- class ModelCopyMixin(BaseModel):
35
- def model_copy(
36
- self: "Self",
37
- *,
38
- update: typing.Optional[typing.Dict[str, typing.Any]] = None,
39
- deep: bool = False,
40
- ) -> "Self":
41
- """
42
- Returns a copy of the model.
43
-
44
- Args:
45
- update: Values to change/add in the new model. Note: the data is not validated
46
- before creating the new model. You should trust this data.
47
- deep: Set to `True` to make a deep copy of the model.
48
-
49
- Returns:
50
- New model instance.
51
- """
52
- return model_copy(self, update=update, deep=deep)
53
-
54
-
55
- __all__ = ["model_copy"]
@@ -1,136 +0,0 @@
1
- import typing
2
- import warnings as python_warnings
3
-
4
- from pydantic_core import from_json
5
- from typing_extensions import Self
6
-
7
- from prefect._internal.pydantic._base_model import BaseModel
8
- from prefect._internal.pydantic._flags import USE_V2_MODELS
9
-
10
- if typing.TYPE_CHECKING:
11
- from prefect._internal.pydantic._types import IncEx
12
-
13
- T = typing.TypeVar("T", bound="BaseModel")
14
-
15
-
16
- def model_dump( # type: ignore[no-redef]
17
- model_instance: "BaseModel",
18
- *,
19
- mode: typing.Union[typing.Literal["json", "python"], str] = "python",
20
- include: "IncEx" = None,
21
- exclude: "IncEx" = None,
22
- by_alias: bool = False,
23
- exclude_unset: bool = False,
24
- exclude_defaults: bool = False,
25
- exclude_none: bool = False,
26
- round_trip: bool = False,
27
- warnings: bool = True,
28
- ) -> typing.Dict[str, typing.Any]:
29
- """
30
- Generate a dictionary representation of the model, optionally specifying which fields to include or exclude.
31
-
32
- Args:
33
- mode: The mode in which `to_python` should run.
34
- If mode is 'json', the output will only contain JSON serializable types.
35
- If mode is 'python', the output may contain non-JSON-serializable Python objects.
36
- include: A set of fields to include in the output.
37
- exclude: A set of fields to exclude from the output.
38
- context: Additional context to pass to the serializer.
39
- by_alias: Whether to use the field's alias in the dictionary key if defined.
40
- exclude_unset: Whether to exclude fields that have not been explicitly set.
41
- exclude_defaults: Whether to exclude fields that are set to their default value.
42
- exclude_none: Whether to exclude fields that have a value of `None`.
43
- round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T].
44
- warnings: Whether to log warnings when invalid fields are encountered.
45
- serialize_as_any: Whether to serialize fields with duck-typing serialization behavior.
46
-
47
- Returns:
48
- A dictionary representation of the model.
49
- """
50
- if USE_V2_MODELS and hasattr(model_instance, "model_dump"):
51
- return model_instance.model_dump(
52
- mode=mode,
53
- include=include,
54
- exclude=exclude,
55
- by_alias=by_alias,
56
- exclude_unset=exclude_unset,
57
- exclude_defaults=exclude_defaults,
58
- exclude_none=exclude_none,
59
- round_trip=round_trip,
60
- warnings=warnings,
61
- )
62
- else:
63
- if mode == "json":
64
- with python_warnings.catch_warnings():
65
- python_warnings.simplefilter("ignore")
66
- return from_json(
67
- model_instance.json(
68
- include=include,
69
- exclude=exclude,
70
- by_alias=by_alias,
71
- exclude_unset=exclude_unset,
72
- exclude_defaults=exclude_defaults,
73
- exclude_none=exclude_none,
74
- )
75
- )
76
-
77
- return getattr(model_instance, "dict")(
78
- include=include,
79
- exclude=exclude,
80
- by_alias=by_alias,
81
- exclude_unset=exclude_unset,
82
- exclude_defaults=exclude_defaults,
83
- exclude_none=exclude_none,
84
- )
85
-
86
-
87
- class ModelDumpMixin(BaseModel):
88
- def model_dump(
89
- self: "Self",
90
- *,
91
- mode: typing.Union[typing.Literal["json", "python"], str] = "python",
92
- include: "IncEx" = None,
93
- exclude: "IncEx" = None,
94
- by_alias: bool = False,
95
- exclude_unset: bool = False,
96
- exclude_defaults: bool = False,
97
- exclude_none: bool = False,
98
- round_trip: bool = False,
99
- warnings: bool = True,
100
- ) -> typing.Dict[str, typing.Any]:
101
- """
102
- Generate a dictionary representation of the model, optionally specifying which fields to include or exclude.
103
-
104
- Args:
105
- mode: The mode in which `to_python` should run.
106
- If mode is 'json', the output will only contain JSON serializable types.
107
- If mode is 'python', the output may contain non-JSON-serializable Python objects.
108
- include: A set of fields to include in the output.
109
- exclude: A set of fields to exclude from the output.
110
- context: Additional context to pass to the serializer.
111
- by_alias: Whether to use the field's alias in the dictionary key if defined.
112
- exclude_unset: Whether to exclude fields that have not been explicitly set.
113
- exclude_defaults: Whether to exclude fields that are set to their default value.
114
- exclude_none: Whether to exclude fields that have a value of `None`.
115
- round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T].
116
- warnings: Whether to log warnings when invalid fields are encountered.
117
- serialize_as_any: Whether to serialize fields with duck-typing serialization behavior.
118
-
119
- Returns:
120
- A dictionary representation of the model.
121
- """
122
- return model_dump(
123
- self,
124
- mode=mode,
125
- include=include,
126
- exclude=exclude,
127
- by_alias=by_alias,
128
- exclude_unset=exclude_unset,
129
- exclude_defaults=exclude_defaults,
130
- exclude_none=exclude_none,
131
- round_trip=round_trip,
132
- warnings=warnings,
133
- )
134
-
135
-
136
- __all__ = ["model_dump", "ModelDumpMixin"]
@@ -1,112 +0,0 @@
1
- import typing
2
-
3
- from typing_extensions import Self
4
-
5
- from prefect._internal.pydantic._base_model import BaseModel
6
- from prefect._internal.pydantic._flags import USE_V2_MODELS
7
-
8
- if typing.TYPE_CHECKING:
9
- from prefect._internal.pydantic._types import IncEx
10
-
11
- T = typing.TypeVar("T", bound="BaseModel")
12
-
13
-
14
- def model_dump_json(
15
- model_instance: "BaseModel",
16
- *,
17
- indent: typing.Optional[int] = None,
18
- include: "IncEx" = None,
19
- exclude: "IncEx" = None,
20
- by_alias: bool = False,
21
- exclude_unset: bool = False,
22
- exclude_defaults: bool = False,
23
- exclude_none: bool = False,
24
- round_trip: bool = False,
25
- warnings: bool = True,
26
- ) -> str:
27
- """
28
- Generate a JSON representation of the model, optionally specifying which fields to include or exclude.
29
-
30
- Args:
31
- indent: If provided, the number of spaces to indent the JSON output.
32
- include: A list of fields to include in the output.
33
- exclude: A list of fields to exclude from the output.
34
- by_alias: Whether to use the field's alias in the dictionary key if defined.
35
- exclude_unset: Whether to exclude fields that have not been explicitly set.
36
- exclude_defaults: Whether to exclude fields that are set to their default value.
37
- exclude_none: Whether to exclude fields that have a value of `None`.
38
- round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T].
39
- warnings: Whether to log warnings when invalid fields are encountered.
40
-
41
- Returns:
42
- A JSON representation of the model.
43
- """
44
- if USE_V2_MODELS:
45
- return model_instance.model_dump_json(
46
- indent=indent,
47
- include=include,
48
- exclude=exclude,
49
- by_alias=by_alias,
50
- exclude_unset=exclude_unset,
51
- exclude_defaults=exclude_defaults,
52
- exclude_none=exclude_none,
53
- round_trip=round_trip,
54
- warnings=warnings,
55
- )
56
- else:
57
- return getattr(model_instance, "json")(
58
- include=include,
59
- exclude=exclude,
60
- by_alias=by_alias,
61
- exclude_unset=exclude_unset,
62
- exclude_defaults=exclude_defaults,
63
- exclude_none=exclude_none,
64
- )
65
-
66
-
67
- class ModelDumpJsonMixin(BaseModel):
68
- def model_dump_json(
69
- self: "Self",
70
- *,
71
- indent: typing.Optional[int] = None,
72
- include: "IncEx" = None,
73
- exclude: "IncEx" = None,
74
- by_alias: bool = False,
75
- exclude_unset: bool = False,
76
- exclude_defaults: bool = False,
77
- exclude_none: bool = False,
78
- round_trip: bool = False,
79
- warnings: bool = True,
80
- ) -> str:
81
- """
82
- Generate a JSON representation of the model, optionally specifying which fields to include or exclude.
83
-
84
- Args:
85
- indent: If provided, the number of spaces to indent the JSON output.
86
- include: A list of fields to include in the output.
87
- exclude: A list of fields to exclude from the output.
88
- by_alias: Whether to use the field's alias in the dictionary key if defined.
89
- exclude_unset: Whether to exclude fields that have not been explicitly set.
90
- exclude_defaults: Whether to exclude fields that are set to their default value.
91
- exclude_none: Whether to exclude fields that have a value of `None`.
92
- round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T].
93
- warnings: Whether to log warnings when invalid fields are encountered.
94
-
95
- Returns:
96
- A JSON representation of the model.
97
- """
98
- return model_dump_json(
99
- self,
100
- indent=indent,
101
- include=include,
102
- exclude=exclude,
103
- by_alias=by_alias,
104
- exclude_unset=exclude_unset,
105
- exclude_defaults=exclude_defaults,
106
- exclude_none=exclude_none,
107
- round_trip=round_trip,
108
- warnings=warnings,
109
- )
110
-
111
-
112
- __all__ = ["model_dump_json", "ModelDumpJsonMixin"]
@@ -1,50 +0,0 @@
1
- import operator
2
- import typing
3
-
4
- from prefect._internal.pydantic._base_model import BaseModel, FieldInfo
5
- from prefect._internal.pydantic._flags import HAS_PYDANTIC_V2, USE_PYDANTIC_V2
6
-
7
- T = typing.TypeVar("T")
8
-
9
- if HAS_PYDANTIC_V2 and USE_PYDANTIC_V2:
10
-
11
- class ModelFieldMixin(BaseModel): # type: ignore [no-redef]
12
- pass
13
-
14
- else:
15
-
16
- def cast_model_field_to_field_info(model_field: typing.Any) -> FieldInfo:
17
- class _FieldInfo(BaseModel):
18
- model_field: typing.Any
19
-
20
- @property
21
- def annotation(self) -> typing.Any:
22
- return getattr(self.model_field, "outer_type_")
23
-
24
- @property
25
- def frozen(self) -> bool:
26
- return not operator.attrgetter("field_info.allow_mutation")(
27
- self.model_field
28
- )
29
-
30
- @property
31
- def json_schema_extra(self) -> typing.Dict[str, typing.Any]:
32
- return operator.attrgetter("field_info.extra")(self.model_field)
33
-
34
- def __getattr__(self, key: str) -> typing.Any:
35
- return getattr(self.model_field, key)
36
-
37
- def __repr__(self) -> str:
38
- return repr(self.model_field)
39
-
40
- return typing.cast(FieldInfo, _FieldInfo(model_field=model_field))
41
-
42
- class ModelFieldMixin(BaseModel):
43
- model_fields: typing.ClassVar[typing.Dict[str, FieldInfo]]
44
-
45
- def __init_subclass__(cls, **kwargs: typing.Any) -> None:
46
- cls.model_fields = {
47
- field_name: cast_model_field_to_field_info(field)
48
- for field_name, field in getattr(cls, "__fields__", {}).items()
49
- }
50
- super().__init_subclass__(**kwargs)
@@ -1,29 +0,0 @@
1
- import typing
2
-
3
- from prefect._internal.pydantic._base_model import BaseModel
4
- from prefect._internal.pydantic._flags import USE_V2_MODELS
5
-
6
-
7
- def model_fields_set(model_instance: "BaseModel") -> typing.Set[str]:
8
- """
9
- Returns a set of the model's fields.
10
- """
11
- if USE_V2_MODELS:
12
- return getattr(model_instance, "__pydantic_fields_set__")
13
- else:
14
- return getattr(model_instance, "__fields_set__")
15
-
16
-
17
- class ModelFieldsSetMixin(BaseModel):
18
- @property
19
- def model_fields_set(self) -> typing.Set[str]:
20
- """Returns the set of fields that have been explicitly set on this model instance.
21
-
22
- Returns:
23
- A set of strings representing the fields that have been set,
24
- i.e. that were not filled from defaults.
25
- """
26
- return model_fields_set(self)
27
-
28
-
29
- __all__ = ["ModelFieldsSetMixin", "model_fields_set"]
@@ -1,82 +0,0 @@
1
- import typing
2
-
3
- from typing_extensions import Self
4
-
5
- from prefect._internal.pydantic._base_model import BaseModel
6
- from prefect._internal.pydantic._flags import USE_V2_MODELS
7
-
8
- if typing.TYPE_CHECKING:
9
- from prefect._internal.pydantic._types import JsonSchemaMode
10
-
11
- from prefect._internal.pydantic._types import DEFAULT_REF_TEMPLATE
12
-
13
- T = typing.TypeVar("T", bound="BaseModel")
14
-
15
-
16
- def model_json_schema(
17
- model: typing.Type[T],
18
- by_alias: bool = True,
19
- ref_template: str = DEFAULT_REF_TEMPLATE,
20
- schema_generator: typing.Any = None,
21
- mode: "JsonSchemaMode" = "validation",
22
- ) -> typing.Dict[str, typing.Any]:
23
- """
24
- Generates a JSON schema for a model class.
25
-
26
- Args:
27
- by_alias: Whether to use attribute aliases or not.
28
- ref_template: The reference template.
29
- schema_generator: To override the logic used to generate the JSON schema, as a subclass of
30
- `GenerateJsonSchema` with your desired modifications
31
- mode: The mode in which to generate the schema.
32
-
33
- Returns:
34
- The JSON schema for the given model class.
35
- """
36
- if USE_V2_MODELS:
37
- return model.model_json_schema(
38
- by_alias=by_alias,
39
- ref_template=ref_template,
40
- mode=mode,
41
- # We've changed the type of schema_generator of 'schema_generator' to 'typing.Any',
42
- # which is will throw an error if its None. So, we've to pass it only if its not None.
43
- **{"schema_generator": schema_generator} if schema_generator else {},
44
- )
45
- else:
46
- return getattr(model, "schema")(
47
- by_alias=by_alias,
48
- ref_template=ref_template,
49
- )
50
-
51
-
52
- class ModelJsonSchemaMixin(BaseModel):
53
- @classmethod
54
- def model_json_schema(
55
- cls: typing.Type["Self"],
56
- by_alias: bool = True,
57
- ref_template: str = DEFAULT_REF_TEMPLATE,
58
- schema_generator: typing.Any = None,
59
- mode: "JsonSchemaMode" = "validation",
60
- ) -> typing.Dict[str, typing.Any]:
61
- """
62
- Generates a JSON schema for a model class.
63
-
64
- Args:
65
- by_alias: Whether to use attribute aliases or not.
66
- ref_template: The reference template.
67
- schema_generator: To override the logic used to generate the JSON schema, as a subclass of
68
- `GenerateJsonSchema` with your desired modifications
69
- mode: The mode in which to generate the schema.
70
-
71
- Returns:
72
- The JSON schema for the given model class.
73
- """
74
- return model_json_schema(
75
- cls,
76
- by_alias=by_alias,
77
- ref_template=ref_template,
78
- mode=mode,
79
- )
80
-
81
-
82
- __all__ = ["model_json_schema", "ModelJsonSchemaMixin"]