1"""Pydantic-specific warnings."""
2
3from __future__ import annotations as _annotations
4
5from .version import version_short
6
7__all__ = (
8 'PydanticDeprecatedSince20',
9 'PydanticDeprecatedSince26',
10 'PydanticDeprecatedSince29',
11 'PydanticDeprecatedSince210',
12 'PydanticDeprecatedSince211',
13 'PydanticDeprecationWarning',
14 'PydanticExperimentalWarning',
15)
16
17
18class PydanticDeprecationWarning(DeprecationWarning):
19 """A Pydantic specific deprecation warning.
20
21 This warning is raised when using deprecated functionality in Pydantic. It provides information on when the
22 deprecation was introduced and the expected version in which the corresponding functionality will be removed.
23
24 Attributes:
25 message: Description of the warning.
26 since: Pydantic version in what the deprecation was introduced.
27 expected_removal: Pydantic version in what the corresponding functionality expected to be removed.
28 """
29
30 message: str
31 since: tuple[int, int]
32 expected_removal: tuple[int, int]
33
34 def __init__(
35 self, message: str, *args: object, since: tuple[int, int], expected_removal: tuple[int, int] | None = None
36 ) -> None:
37 super().__init__(message, *args)
38 self.message = message.rstrip('.')
39 self.since = since
40 self.expected_removal = expected_removal if expected_removal is not None else (since[0] + 1, 0)
41
42 def __str__(self) -> str:
43 message = (
44 f'{self.message}. Deprecated in Pydantic V{self.since[0]}.{self.since[1]}'
45 f' to be removed in V{self.expected_removal[0]}.{self.expected_removal[1]}.'
46 )
47 if self.since == (2, 0):
48 message += f' See Pydantic V2 Migration Guide at https://errors.pydantic.dev/{version_short()}/migration/'
49 return message
50
51
52class PydanticDeprecatedSince20(PydanticDeprecationWarning):
53 """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.0."""
54
55 def __init__(self, message: str, *args: object) -> None:
56 super().__init__(message, *args, since=(2, 0), expected_removal=(3, 0))
57
58
59class PydanticDeprecatedSince26(PydanticDeprecationWarning):
60 """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.6."""
61
62 def __init__(self, message: str, *args: object) -> None:
63 super().__init__(message, *args, since=(2, 6), expected_removal=(3, 0))
64
65
66class PydanticDeprecatedSince29(PydanticDeprecationWarning):
67 """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.9."""
68
69 def __init__(self, message: str, *args: object) -> None:
70 super().__init__(message, *args, since=(2, 9), expected_removal=(3, 0))
71
72
73class PydanticDeprecatedSince210(PydanticDeprecationWarning):
74 """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.10."""
75
76 def __init__(self, message: str, *args: object) -> None:
77 super().__init__(message, *args, since=(2, 10), expected_removal=(3, 0))
78
79
80class PydanticDeprecatedSince211(PydanticDeprecationWarning):
81 """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.11."""
82
83 def __init__(self, message: str, *args: object) -> None:
84 super().__init__(message, *args, since=(2, 11), expected_removal=(3, 0))
85
86
87class GenericBeforeBaseModelWarning(Warning):
88 pass
89
90
91class PydanticExperimentalWarning(Warning):
92 """A Pydantic specific experimental functionality warning.
93
94 This warning is raised when using experimental functionality in Pydantic.
95 It is raised to warn users that the functionality may change or be removed in future versions of Pydantic.
96 """