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
@@ -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"]