prefect-client 2.19.2__py3-none-any.whl → 3.0.0rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/__init__.py +8 -56
- prefect/_internal/compatibility/deprecated.py +6 -115
- prefect/_internal/compatibility/experimental.py +4 -79
- prefect/_internal/concurrency/api.py +0 -34
- prefect/_internal/concurrency/calls.py +0 -6
- prefect/_internal/concurrency/cancellation.py +0 -3
- prefect/_internal/concurrency/event_loop.py +0 -20
- prefect/_internal/concurrency/inspection.py +3 -3
- prefect/_internal/concurrency/threads.py +35 -0
- prefect/_internal/concurrency/waiters.py +0 -28
- prefect/_internal/pydantic/__init__.py +0 -45
- prefect/_internal/pydantic/v1_schema.py +21 -22
- prefect/_internal/pydantic/v2_schema.py +0 -2
- prefect/_internal/pydantic/v2_validated_func.py +18 -23
- prefect/_internal/schemas/bases.py +44 -177
- prefect/_internal/schemas/fields.py +1 -43
- prefect/_internal/schemas/validators.py +60 -158
- prefect/artifacts.py +161 -14
- prefect/automations.py +39 -4
- prefect/blocks/abstract.py +1 -1
- prefect/blocks/core.py +268 -148
- prefect/blocks/fields.py +2 -57
- prefect/blocks/kubernetes.py +8 -12
- prefect/blocks/notifications.py +40 -20
- prefect/blocks/system.py +22 -11
- prefect/blocks/webhook.py +2 -9
- prefect/client/base.py +4 -4
- prefect/client/cloud.py +8 -13
- prefect/client/orchestration.py +347 -341
- prefect/client/schemas/actions.py +92 -86
- prefect/client/schemas/filters.py +20 -40
- prefect/client/schemas/objects.py +151 -145
- prefect/client/schemas/responses.py +16 -24
- prefect/client/schemas/schedules.py +47 -35
- prefect/client/subscriptions.py +2 -2
- prefect/client/utilities.py +5 -2
- prefect/concurrency/asyncio.py +3 -1
- prefect/concurrency/events.py +1 -1
- prefect/concurrency/services.py +6 -3
- prefect/context.py +195 -27
- prefect/deployments/__init__.py +5 -6
- prefect/deployments/base.py +7 -5
- prefect/deployments/flow_runs.py +185 -0
- prefect/deployments/runner.py +50 -45
- prefect/deployments/schedules.py +28 -23
- prefect/deployments/steps/__init__.py +0 -1
- prefect/deployments/steps/core.py +1 -0
- prefect/deployments/steps/pull.py +7 -21
- prefect/engine.py +12 -2422
- prefect/events/actions.py +17 -23
- prefect/events/cli/automations.py +19 -6
- prefect/events/clients.py +14 -37
- prefect/events/filters.py +14 -18
- prefect/events/related.py +2 -2
- prefect/events/schemas/__init__.py +0 -5
- prefect/events/schemas/automations.py +55 -46
- prefect/events/schemas/deployment_triggers.py +7 -197
- prefect/events/schemas/events.py +34 -65
- prefect/events/schemas/labelling.py +10 -14
- prefect/events/utilities.py +2 -3
- prefect/events/worker.py +2 -3
- prefect/filesystems.py +6 -517
- prefect/{new_flow_engine.py → flow_engine.py} +313 -72
- prefect/flow_runs.py +377 -5
- prefect/flows.py +307 -166
- prefect/futures.py +186 -345
- prefect/infrastructure/__init__.py +0 -27
- prefect/infrastructure/provisioners/__init__.py +5 -3
- prefect/infrastructure/provisioners/cloud_run.py +11 -6
- prefect/infrastructure/provisioners/container_instance.py +11 -7
- prefect/infrastructure/provisioners/ecs.py +6 -4
- prefect/infrastructure/provisioners/modal.py +8 -5
- prefect/input/actions.py +2 -4
- prefect/input/run_input.py +5 -7
- prefect/logging/formatters.py +0 -2
- prefect/logging/handlers.py +3 -11
- prefect/logging/loggers.py +2 -2
- prefect/manifests.py +2 -1
- prefect/records/__init__.py +1 -0
- prefect/records/result_store.py +42 -0
- prefect/records/store.py +9 -0
- prefect/results.py +43 -39
- prefect/runner/runner.py +19 -15
- prefect/runner/server.py +6 -10
- prefect/runner/storage.py +3 -8
- prefect/runner/submit.py +2 -2
- prefect/runner/utils.py +2 -2
- prefect/serializers.py +24 -35
- prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
- prefect/settings.py +70 -133
- prefect/states.py +17 -47
- prefect/task_engine.py +697 -58
- prefect/task_runners.py +269 -301
- prefect/task_server.py +53 -34
- prefect/tasks.py +327 -337
- prefect/transactions.py +220 -0
- prefect/types/__init__.py +61 -82
- prefect/utilities/asyncutils.py +195 -136
- prefect/utilities/callables.py +311 -43
- prefect/utilities/collections.py +23 -38
- prefect/utilities/dispatch.py +11 -3
- prefect/utilities/dockerutils.py +4 -0
- prefect/utilities/engine.py +140 -20
- prefect/utilities/importtools.py +97 -27
- prefect/utilities/pydantic.py +128 -38
- prefect/utilities/schema_tools/hydration.py +5 -1
- prefect/utilities/templating.py +12 -2
- prefect/variables.py +78 -61
- prefect/workers/__init__.py +0 -1
- prefect/workers/base.py +15 -17
- prefect/workers/process.py +3 -8
- prefect/workers/server.py +2 -2
- {prefect_client-2.19.2.dist-info → prefect_client-3.0.0rc1.dist-info}/METADATA +22 -21
- prefect_client-3.0.0rc1.dist-info/RECORD +176 -0
- prefect/_internal/pydantic/_base_model.py +0 -51
- prefect/_internal/pydantic/_compat.py +0 -82
- prefect/_internal/pydantic/_flags.py +0 -20
- prefect/_internal/pydantic/_types.py +0 -8
- prefect/_internal/pydantic/utilities/__init__.py +0 -0
- prefect/_internal/pydantic/utilities/config_dict.py +0 -72
- prefect/_internal/pydantic/utilities/field_validator.py +0 -150
- prefect/_internal/pydantic/utilities/model_construct.py +0 -56
- prefect/_internal/pydantic/utilities/model_copy.py +0 -55
- prefect/_internal/pydantic/utilities/model_dump.py +0 -136
- prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
- prefect/_internal/pydantic/utilities/model_fields.py +0 -50
- prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
- prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
- prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
- prefect/_internal/pydantic/utilities/model_validate.py +0 -75
- prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
- prefect/_internal/pydantic/utilities/model_validator.py +0 -87
- prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
- prefect/_vendor/__init__.py +0 -0
- prefect/_vendor/fastapi/__init__.py +0 -25
- prefect/_vendor/fastapi/applications.py +0 -946
- prefect/_vendor/fastapi/background.py +0 -3
- prefect/_vendor/fastapi/concurrency.py +0 -44
- prefect/_vendor/fastapi/datastructures.py +0 -58
- prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
- prefect/_vendor/fastapi/dependencies/models.py +0 -64
- prefect/_vendor/fastapi/dependencies/utils.py +0 -877
- prefect/_vendor/fastapi/encoders.py +0 -177
- prefect/_vendor/fastapi/exception_handlers.py +0 -40
- prefect/_vendor/fastapi/exceptions.py +0 -46
- prefect/_vendor/fastapi/logger.py +0 -3
- prefect/_vendor/fastapi/middleware/__init__.py +0 -1
- prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
- prefect/_vendor/fastapi/middleware/cors.py +0 -3
- prefect/_vendor/fastapi/middleware/gzip.py +0 -3
- prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
- prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
- prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
- prefect/_vendor/fastapi/openapi/__init__.py +0 -0
- prefect/_vendor/fastapi/openapi/constants.py +0 -2
- prefect/_vendor/fastapi/openapi/docs.py +0 -203
- prefect/_vendor/fastapi/openapi/models.py +0 -480
- prefect/_vendor/fastapi/openapi/utils.py +0 -485
- prefect/_vendor/fastapi/param_functions.py +0 -340
- prefect/_vendor/fastapi/params.py +0 -453
- prefect/_vendor/fastapi/requests.py +0 -4
- prefect/_vendor/fastapi/responses.py +0 -40
- prefect/_vendor/fastapi/routing.py +0 -1331
- prefect/_vendor/fastapi/security/__init__.py +0 -15
- prefect/_vendor/fastapi/security/api_key.py +0 -98
- prefect/_vendor/fastapi/security/base.py +0 -6
- prefect/_vendor/fastapi/security/http.py +0 -172
- prefect/_vendor/fastapi/security/oauth2.py +0 -227
- prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
- prefect/_vendor/fastapi/security/utils.py +0 -10
- prefect/_vendor/fastapi/staticfiles.py +0 -1
- prefect/_vendor/fastapi/templating.py +0 -3
- prefect/_vendor/fastapi/testclient.py +0 -1
- prefect/_vendor/fastapi/types.py +0 -3
- prefect/_vendor/fastapi/utils.py +0 -235
- prefect/_vendor/fastapi/websockets.py +0 -7
- prefect/_vendor/starlette/__init__.py +0 -1
- prefect/_vendor/starlette/_compat.py +0 -28
- prefect/_vendor/starlette/_exception_handler.py +0 -80
- prefect/_vendor/starlette/_utils.py +0 -88
- prefect/_vendor/starlette/applications.py +0 -261
- prefect/_vendor/starlette/authentication.py +0 -159
- prefect/_vendor/starlette/background.py +0 -43
- prefect/_vendor/starlette/concurrency.py +0 -59
- prefect/_vendor/starlette/config.py +0 -151
- prefect/_vendor/starlette/convertors.py +0 -87
- prefect/_vendor/starlette/datastructures.py +0 -707
- prefect/_vendor/starlette/endpoints.py +0 -130
- prefect/_vendor/starlette/exceptions.py +0 -60
- prefect/_vendor/starlette/formparsers.py +0 -276
- prefect/_vendor/starlette/middleware/__init__.py +0 -17
- prefect/_vendor/starlette/middleware/authentication.py +0 -52
- prefect/_vendor/starlette/middleware/base.py +0 -220
- prefect/_vendor/starlette/middleware/cors.py +0 -176
- prefect/_vendor/starlette/middleware/errors.py +0 -265
- prefect/_vendor/starlette/middleware/exceptions.py +0 -74
- prefect/_vendor/starlette/middleware/gzip.py +0 -113
- prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
- prefect/_vendor/starlette/middleware/sessions.py +0 -82
- prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
- prefect/_vendor/starlette/middleware/wsgi.py +0 -147
- prefect/_vendor/starlette/requests.py +0 -328
- prefect/_vendor/starlette/responses.py +0 -347
- prefect/_vendor/starlette/routing.py +0 -933
- prefect/_vendor/starlette/schemas.py +0 -154
- prefect/_vendor/starlette/staticfiles.py +0 -248
- prefect/_vendor/starlette/status.py +0 -199
- prefect/_vendor/starlette/templating.py +0 -231
- prefect/_vendor/starlette/testclient.py +0 -804
- prefect/_vendor/starlette/types.py +0 -30
- prefect/_vendor/starlette/websockets.py +0 -193
- prefect/agent.py +0 -698
- prefect/deployments/deployments.py +0 -1042
- prefect/deprecated/__init__.py +0 -0
- prefect/deprecated/data_documents.py +0 -350
- prefect/deprecated/packaging/__init__.py +0 -12
- prefect/deprecated/packaging/base.py +0 -96
- prefect/deprecated/packaging/docker.py +0 -146
- prefect/deprecated/packaging/file.py +0 -92
- prefect/deprecated/packaging/orion.py +0 -80
- prefect/deprecated/packaging/serializers.py +0 -171
- prefect/events/instrument.py +0 -135
- prefect/infrastructure/base.py +0 -323
- prefect/infrastructure/container.py +0 -818
- prefect/infrastructure/kubernetes.py +0 -920
- prefect/infrastructure/process.py +0 -289
- prefect/new_task_engine.py +0 -423
- prefect/pydantic/__init__.py +0 -76
- prefect/pydantic/main.py +0 -39
- prefect/software/__init__.py +0 -2
- prefect/software/base.py +0 -50
- prefect/software/conda.py +0 -199
- prefect/software/pip.py +0 -122
- prefect/software/python.py +0 -52
- prefect/workers/block.py +0 -218
- prefect_client-2.19.2.dist-info/RECORD +0 -292
- {prefect_client-2.19.2.dist-info → prefect_client-3.0.0rc1.dist-info}/LICENSE +0 -0
- {prefect_client-2.19.2.dist-info → prefect_client-3.0.0rc1.dist-info}/WHEEL +0 -0
- {prefect_client-2.19.2.dist-info → prefect_client-3.0.0rc1.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"]
|