Coverage for pydantic/validators.py: 100.00%
437 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-15 13:26 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-08-15 13:26 +0000
1import math 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
2import re 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
3from collections import OrderedDict, deque 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
4from collections.abc import Hashable as CollectionsHashable 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
5from datetime import date, datetime, time, timedelta 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
6from decimal import Decimal, DecimalException 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
7from enum import Enum, IntEnum 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
8from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
9from pathlib import Path 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
10from typing import ( 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
11 TYPE_CHECKING,
12 Any,
13 Callable,
14 Deque,
15 Dict,
16 ForwardRef,
17 FrozenSet,
18 Generator,
19 Hashable,
20 List,
21 NamedTuple,
22 Pattern,
23 Set,
24 Tuple,
25 Type,
26 TypeVar,
27 Union,
28)
29from uuid import UUID 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
31from pydantic import errors 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
32from pydantic.datetime_parse import parse_date, parse_datetime, parse_duration, parse_time 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
33from pydantic.typing import ( 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
34 AnyCallable,
35 all_literal_values,
36 display_as_type,
37 get_class,
38 is_callable_type,
39 is_literal_type,
40 is_namedtuple,
41 is_none_type,
42 is_typeddict,
43)
44from pydantic.utils import almost_equal_floats, lenient_issubclass, sequence_like 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
46if TYPE_CHECKING: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
47 from typing_extensions import Literal, TypedDict
49 from pydantic.config import BaseConfig
50 from pydantic.fields import ModelField
51 from pydantic.types import ConstrainedDecimal, ConstrainedFloat, ConstrainedInt
53 ConstrainedNumber = Union[ConstrainedDecimal, ConstrainedFloat, ConstrainedInt]
54 AnyOrderedDict = OrderedDict[Any, Any]
55 Number = Union[int, float, Decimal]
56 StrBytes = Union[str, bytes]
59def str_validator(v: Any) -> Union[str]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
60 if isinstance(v, str): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
61 if isinstance(v, Enum): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
62 return v.value 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
63 else:
64 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
65 elif isinstance(v, (float, int, Decimal)): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
66 # is there anything else we want to add here? If you think so, create an issue.
67 return str(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
68 elif isinstance(v, (bytes, bytearray)): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
69 return v.decode() 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
70 else:
71 raise errors.StrError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
74def strict_str_validator(v: Any) -> Union[str]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
75 if isinstance(v, str) and not isinstance(v, Enum): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
76 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
77 raise errors.StrError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
80def bytes_validator(v: Any) -> Union[bytes]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
81 if isinstance(v, bytes): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
82 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
83 elif isinstance(v, bytearray): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
84 return bytes(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
85 elif isinstance(v, str): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
86 return v.encode() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
87 elif isinstance(v, (float, int, Decimal)): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
88 return str(v).encode() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
89 else:
90 raise errors.BytesError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
93def strict_bytes_validator(v: Any) -> Union[bytes]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
94 if isinstance(v, bytes): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
95 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
96 elif isinstance(v, bytearray): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
97 return bytes(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
98 else:
99 raise errors.BytesError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
102BOOL_FALSE = {0, '0', 'off', 'f', 'false', 'n', 'no'} 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
103BOOL_TRUE = {1, '1', 'on', 't', 'true', 'y', 'yes'} 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
106def bool_validator(v: Any) -> bool: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
107 if v is True or v is False: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
108 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
109 if isinstance(v, bytes): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
110 v = v.decode() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
111 if isinstance(v, str): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
112 v = v.lower() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
113 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
114 if v in BOOL_TRUE: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
115 return True 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
116 if v in BOOL_FALSE: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
117 return False 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
118 except TypeError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
119 raise errors.BoolError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
120 raise errors.BoolError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
123# matches the default limit cpython, see https://github.com/python/cpython/pull/96500
124max_str_int = 4_300 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
127def int_validator(v: Any) -> int: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
128 if isinstance(v, int) and not (v is True or v is False): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
129 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
131 # see https://github.com/pydantic/pydantic/issues/1477 and in turn, https://github.com/python/cpython/issues/95778
132 # this check should be unnecessary once patch releases are out for 3.7, 3.8, 3.9 and 3.10
133 # but better to check here until then.
134 # NOTICE: this does not fully protect user from the DOS risk since the standard library JSON implementation
135 # (and other std lib modules like xml) use `int()` and are likely called before this, the best workaround is to
136 # 1. update to the latest patch release of python once released, 2. use a different JSON library like ujson
137 if isinstance(v, (str, bytes, bytearray)) and len(v) > max_str_int: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
138 raise errors.IntegerError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
140 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
141 return int(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
142 except (TypeError, ValueError, OverflowError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
143 raise errors.IntegerError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
146def strict_int_validator(v: Any) -> int: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
147 if isinstance(v, int) and not (v is True or v is False): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
148 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
149 raise errors.IntegerError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
152def float_validator(v: Any) -> float: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
153 if isinstance(v, float): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
154 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
156 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
157 return float(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
158 except (TypeError, ValueError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
159 raise errors.FloatError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
162def strict_float_validator(v: Any) -> float: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
163 if isinstance(v, float): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
164 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
165 raise errors.FloatError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
168def float_finite_validator(v: 'Number', field: 'ModelField', config: 'BaseConfig') -> 'Number': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
169 allow_inf_nan = getattr(field.type_, 'allow_inf_nan', None) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
170 if allow_inf_nan is None: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
171 allow_inf_nan = config.allow_inf_nan 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
173 if allow_inf_nan is False and (math.isnan(v) or math.isinf(v)): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
174 raise errors.NumberNotFiniteError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
175 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
178def number_multiple_validator(v: 'Number', field: 'ModelField') -> 'Number': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
179 field_type: ConstrainedNumber = field.type_ 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
180 if field_type.multiple_of is not None: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
181 mod = float(v) / float(field_type.multiple_of) % 1 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
182 if not almost_equal_floats(mod, 0.0) and not almost_equal_floats(mod, 1.0): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
183 raise errors.NumberNotMultipleError(multiple_of=field_type.multiple_of) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
184 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
187def number_size_validator(v: 'Number', field: 'ModelField') -> 'Number': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
188 field_type: ConstrainedNumber = field.type_ 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
189 if field_type.gt is not None and not v > field_type.gt: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
190 raise errors.NumberNotGtError(limit_value=field_type.gt) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
191 elif field_type.ge is not None and not v >= field_type.ge: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
192 raise errors.NumberNotGeError(limit_value=field_type.ge) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
194 if field_type.lt is not None and not v < field_type.lt: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
195 raise errors.NumberNotLtError(limit_value=field_type.lt) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
196 if field_type.le is not None and not v <= field_type.le: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
197 raise errors.NumberNotLeError(limit_value=field_type.le) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
199 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
202def constant_validator(v: 'Any', field: 'ModelField') -> 'Any': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
203 """Validate ``const`` fields.
205 The value provided for a ``const`` field must be equal to the default value
206 of the field. This is to support the keyword of the same name in JSON
207 Schema.
208 """
209 if v != field.default: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
210 raise errors.WrongConstantError(given=v, permitted=[field.default]) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
212 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
215def anystr_length_validator(v: 'StrBytes', config: 'BaseConfig') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
216 v_len = len(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
218 min_length = config.min_anystr_length 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
219 if v_len < min_length: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
220 raise errors.AnyStrMinLengthError(limit_value=min_length) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
222 max_length = config.max_anystr_length 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
223 if max_length is not None and v_len > max_length: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
224 raise errors.AnyStrMaxLengthError(limit_value=max_length) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
226 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
229def anystr_strip_whitespace(v: 'StrBytes') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
230 return v.strip() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
233def anystr_upper(v: 'StrBytes') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
234 return v.upper() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
237def anystr_lower(v: 'StrBytes') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
238 return v.lower() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
241def ordered_dict_validator(v: Any) -> 'AnyOrderedDict': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
242 if isinstance(v, OrderedDict): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
243 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
245 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
246 return OrderedDict(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
247 except (TypeError, ValueError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
248 raise errors.DictError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
251def dict_validator(v: Any) -> Dict[Any, Any]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
252 if isinstance(v, dict): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
253 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
255 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
256 return dict(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
257 except (TypeError, ValueError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
258 raise errors.DictError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
261def list_validator(v: Any) -> List[Any]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
262 if isinstance(v, list): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
263 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
264 elif sequence_like(v): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
265 return list(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
266 else:
267 raise errors.ListError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
270def tuple_validator(v: Any) -> Tuple[Any, ...]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
271 if isinstance(v, tuple): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
272 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
273 elif sequence_like(v): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
274 return tuple(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
275 else:
276 raise errors.TupleError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
279def set_validator(v: Any) -> Set[Any]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
280 if isinstance(v, set): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
281 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
282 elif sequence_like(v): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
283 return set(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
284 else:
285 raise errors.SetError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
288def frozenset_validator(v: Any) -> FrozenSet[Any]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
289 if isinstance(v, frozenset): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
290 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
291 elif sequence_like(v): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
292 return frozenset(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
293 else:
294 raise errors.FrozenSetError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
297def deque_validator(v: Any) -> Deque[Any]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
298 if isinstance(v, deque): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
299 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
300 elif sequence_like(v): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
301 return deque(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
302 else:
303 raise errors.DequeError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
306def enum_member_validator(v: Any, field: 'ModelField', config: 'BaseConfig') -> Enum: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
307 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
308 enum_v = field.type_(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
309 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
310 # field.type_ should be an enum, so will be iterable
311 raise errors.EnumMemberError(enum_values=list(field.type_)) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
312 return enum_v.value if config.use_enum_values else enum_v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
315def uuid_validator(v: Any, field: 'ModelField') -> UUID: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
316 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
317 if isinstance(v, str): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
318 v = UUID(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
319 elif isinstance(v, (bytes, bytearray)): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
320 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
321 v = UUID(v.decode()) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
322 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
323 # 16 bytes in big-endian order as the bytes argument fail
324 # the above check
325 v = UUID(bytes=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
326 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
327 raise errors.UUIDError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
329 if not isinstance(v, UUID): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
330 raise errors.UUIDError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
332 required_version = getattr(field.type_, '_required_version', None) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
333 if required_version and v.version != required_version: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
334 raise errors.UUIDVersionError(required_version=required_version) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
336 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
339def decimal_validator(v: Any) -> Decimal: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
340 if isinstance(v, Decimal): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
341 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
342 elif isinstance(v, (bytes, bytearray)): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
343 v = v.decode() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
345 v = str(v).strip() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
347 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
348 v = Decimal(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
349 except DecimalException: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
350 raise errors.DecimalError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
352 if not v.is_finite(): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
353 raise errors.DecimalIsNotFiniteError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
355 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
358def hashable_validator(v: Any) -> Hashable: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
359 if isinstance(v, Hashable): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
360 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
362 raise errors.HashableError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
365def ip_v4_address_validator(v: Any) -> IPv4Address: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
366 if isinstance(v, IPv4Address): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
367 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
369 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
370 return IPv4Address(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
371 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
372 raise errors.IPv4AddressError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
375def ip_v6_address_validator(v: Any) -> IPv6Address: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
376 if isinstance(v, IPv6Address): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
377 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
379 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
380 return IPv6Address(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
381 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
382 raise errors.IPv6AddressError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
385def ip_v4_network_validator(v: Any) -> IPv4Network: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
386 """
387 Assume IPv4Network initialised with a default ``strict`` argument
389 See more:
390 https://docs.python.org/library/ipaddress.html#ipaddress.IPv4Network
391 """
392 if isinstance(v, IPv4Network): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
393 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
395 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
396 return IPv4Network(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
397 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
398 raise errors.IPv4NetworkError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
401def ip_v6_network_validator(v: Any) -> IPv6Network: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
402 """
403 Assume IPv6Network initialised with a default ``strict`` argument
405 See more:
406 https://docs.python.org/library/ipaddress.html#ipaddress.IPv6Network
407 """
408 if isinstance(v, IPv6Network): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
409 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
411 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
412 return IPv6Network(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
413 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
414 raise errors.IPv6NetworkError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
417def ip_v4_interface_validator(v: Any) -> IPv4Interface: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
418 if isinstance(v, IPv4Interface): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
419 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
421 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
422 return IPv4Interface(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
423 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
424 raise errors.IPv4InterfaceError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
427def ip_v6_interface_validator(v: Any) -> IPv6Interface: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
428 if isinstance(v, IPv6Interface): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
429 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
431 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
432 return IPv6Interface(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
433 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
434 raise errors.IPv6InterfaceError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
437def path_validator(v: Any) -> Path: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
438 if isinstance(v, Path): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
439 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
441 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
442 return Path(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
443 except TypeError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
444 raise errors.PathError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
447def path_exists_validator(v: Any) -> Path: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
448 if not v.exists(): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
449 raise errors.PathNotExistsError(path=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
451 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
454def callable_validator(v: Any) -> AnyCallable: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
455 """
456 Perform a simple check if the value is callable.
458 Note: complete matching of argument type hints and return types is not performed
459 """
460 if callable(v): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
461 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
463 raise errors.CallableError(value=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
466def enum_validator(v: Any) -> Enum: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
467 if isinstance(v, Enum): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
468 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
470 raise errors.EnumError(value=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
473def int_enum_validator(v: Any) -> IntEnum: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
474 if isinstance(v, IntEnum): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
475 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
477 raise errors.IntEnumError(value=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
480def make_literal_validator(type_: Any) -> Callable[[Any], Any]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
481 permitted_choices = all_literal_values(type_) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
483 # To have a O(1) complexity and still return one of the values set inside the `Literal`,
484 # we create a dict with the set values (a set causes some problems with the way intersection works).
485 # In some cases the set value and checked value can indeed be different (see `test_literal_validator_str_enum`)
486 allowed_choices = {v: v for v in permitted_choices} 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
488 def literal_validator(v: Any) -> Any: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
489 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
490 return allowed_choices[v] 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
491 except (KeyError, TypeError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
492 raise errors.WrongConstantError(given=v, permitted=permitted_choices) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
494 return literal_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
497def constr_length_validator(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
498 v_len = len(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
500 min_length = field.type_.min_length if field.type_.min_length is not None else config.min_anystr_length 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
501 if v_len < min_length: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
502 raise errors.AnyStrMinLengthError(limit_value=min_length) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
504 max_length = field.type_.max_length if field.type_.max_length is not None else config.max_anystr_length 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
505 if max_length is not None and v_len > max_length: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
506 raise errors.AnyStrMaxLengthError(limit_value=max_length) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
508 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
511def constr_strip_whitespace(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
512 strip_whitespace = field.type_.strip_whitespace or config.anystr_strip_whitespace 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
513 if strip_whitespace: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
514 v = v.strip() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
516 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
519def constr_upper(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
520 upper = field.type_.to_upper or config.anystr_upper 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
521 if upper: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
522 v = v.upper() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
524 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
527def constr_lower(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
528 lower = field.type_.to_lower or config.anystr_lower 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
529 if lower: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
530 v = v.lower() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
531 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
534def validate_json(v: Any, config: 'BaseConfig') -> Any: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
535 if v is None: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
536 # pass None through to other validators
537 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
538 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
539 return config.json_loads(v) # type: ignore 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
540 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
541 raise errors.JsonError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
542 except TypeError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
543 raise errors.JsonTypeError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
546T = TypeVar('T') 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
549def make_arbitrary_type_validator(type_: Type[T]) -> Callable[[T], T]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
550 def arbitrary_type_validator(v: Any) -> T: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
551 if isinstance(v, type_): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
552 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
553 raise errors.ArbitraryTypeError(expected_arbitrary_type=type_) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
555 return arbitrary_type_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
558def make_class_validator(type_: Type[T]) -> Callable[[Any], Type[T]]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
559 def class_validator(v: Any) -> Type[T]: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
560 if lenient_issubclass(v, type_): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
561 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
562 raise errors.SubclassError(expected_class=type_) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
564 return class_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
567def any_class_validator(v: Any) -> Type[T]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
568 if isinstance(v, type): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
569 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
570 raise errors.ClassError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
573def none_validator(v: Any) -> 'Literal[None]': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
574 if v is None: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
575 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
576 raise errors.NotNoneError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
579def pattern_validator(v: Any) -> Pattern[str]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
580 if isinstance(v, Pattern): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
581 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
583 str_value = str_validator(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
585 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
586 return re.compile(str_value) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
587 except re.error: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
588 raise errors.PatternError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
591NamedTupleT = TypeVar('NamedTupleT', bound=NamedTuple) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
594def make_namedtuple_validator( 1abcdefghijFGHIklmnopqrstPQRSTUuvwxyzABCDE
595 namedtuple_cls: Type[NamedTupleT], config: Type['BaseConfig']
596) -> Callable[[Tuple[Any, ...]], NamedTupleT]:
597 from pydantic.annotated_types import create_model_from_namedtuple 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
599 NamedTupleModel = create_model_from_namedtuple( 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
600 namedtuple_cls,
601 __config__=config,
602 __module__=namedtuple_cls.__module__,
603 )
604 namedtuple_cls.__pydantic_model__ = NamedTupleModel # type: ignore[attr-defined] 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
606 def namedtuple_validator(values: Tuple[Any, ...]) -> NamedTupleT: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
607 annotations = NamedTupleModel.__annotations__ 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
609 if len(values) > len(annotations): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
610 raise errors.ListMaxLengthError(limit_value=len(annotations)) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
612 dict_values: Dict[str, Any] = dict(zip(annotations, values)) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
613 validated_dict_values: Dict[str, Any] = dict(NamedTupleModel(**dict_values)) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
614 return namedtuple_cls(**validated_dict_values) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
616 return namedtuple_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
619def make_typeddict_validator( 1abcdefghijFGHIklmnopqrstPQRSTUuvwxyzABCDE
620 typeddict_cls: Type['TypedDict'], config: Type['BaseConfig'] # type: ignore[valid-type]
621) -> Callable[[Any], Dict[str, Any]]:
622 from pydantic.annotated_types import create_model_from_typeddict 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
624 TypedDictModel = create_model_from_typeddict( 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
625 typeddict_cls,
626 __config__=config,
627 __module__=typeddict_cls.__module__,
628 )
629 typeddict_cls.__pydantic_model__ = TypedDictModel # type: ignore[attr-defined] 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
631 def typeddict_validator(values: 'TypedDict') -> Dict[str, Any]: # type: ignore[valid-type] 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
632 return TypedDictModel.parse_obj(values).dict(exclude_unset=True) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
634 return typeddict_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
637class IfConfig: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
638 def __init__(self, validator: AnyCallable, *config_attr_names: str, ignored_value: Any = False) -> None: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
639 self.validator = validator 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
640 self.config_attr_names = config_attr_names 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
641 self.ignored_value = ignored_value 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
643 def check(self, config: Type['BaseConfig']) -> bool: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
644 return any(getattr(config, name) not in {None, self.ignored_value} for name in self.config_attr_names) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
647# order is important here, for example: bool is a subclass of int so has to come first, datetime before date same,
648# IPv4Interface before IPv4Address, etc
649_VALIDATORS: List[Tuple[Type[Any], List[Any]]] = [ 1abcdefghijFGHIklmnopqrstPQRSTUuvwxyzABCDE
650 (IntEnum, [int_validator, enum_member_validator]),
651 (Enum, [enum_member_validator]),
652 (
653 str,
654 [
655 str_validator,
656 IfConfig(anystr_strip_whitespace, 'anystr_strip_whitespace'),
657 IfConfig(anystr_upper, 'anystr_upper'),
658 IfConfig(anystr_lower, 'anystr_lower'),
659 IfConfig(anystr_length_validator, 'min_anystr_length', 'max_anystr_length'),
660 ],
661 ),
662 (
663 bytes,
664 [
665 bytes_validator,
666 IfConfig(anystr_strip_whitespace, 'anystr_strip_whitespace'),
667 IfConfig(anystr_upper, 'anystr_upper'),
668 IfConfig(anystr_lower, 'anystr_lower'),
669 IfConfig(anystr_length_validator, 'min_anystr_length', 'max_anystr_length'),
670 ],
671 ),
672 (bool, [bool_validator]),
673 (int, [int_validator]),
674 (float, [float_validator, IfConfig(float_finite_validator, 'allow_inf_nan', ignored_value=True)]),
675 (Path, [path_validator]),
676 (datetime, [parse_datetime]),
677 (date, [parse_date]),
678 (time, [parse_time]),
679 (timedelta, [parse_duration]),
680 (OrderedDict, [ordered_dict_validator]),
681 (dict, [dict_validator]),
682 (list, [list_validator]),
683 (tuple, [tuple_validator]),
684 (set, [set_validator]),
685 (frozenset, [frozenset_validator]),
686 (deque, [deque_validator]),
687 (UUID, [uuid_validator]),
688 (Decimal, [decimal_validator]),
689 (IPv4Interface, [ip_v4_interface_validator]),
690 (IPv6Interface, [ip_v6_interface_validator]),
691 (IPv4Address, [ip_v4_address_validator]),
692 (IPv6Address, [ip_v6_address_validator]),
693 (IPv4Network, [ip_v4_network_validator]),
694 (IPv6Network, [ip_v6_network_validator]),
695]
698def find_validators( # noqa: C901 (ignore complexity) 1abcdefghijFGHIklmnopqrstPQRSTUuvwxyzABCDE
699 type_: Type[Any], config: Type['BaseConfig']
700) -> Generator[AnyCallable, None, None]:
701 from pydantic.dataclasses import is_builtin_dataclass, make_dataclass_validator 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
703 if type_ is Any or type_ is object: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
704 return 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
705 type_type = type_.__class__ 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
706 if type_type == ForwardRef or type_type == TypeVar: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
707 return 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
709 if is_none_type(type_): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
710 yield none_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
711 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
712 if type_ is Pattern or type_ is re.Pattern: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
713 yield pattern_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
714 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
715 if type_ is Hashable or type_ is CollectionsHashable: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
716 yield hashable_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
717 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
718 if is_callable_type(type_): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
719 yield callable_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
720 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
721 if is_literal_type(type_): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
722 yield make_literal_validator(type_) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
723 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
724 if is_builtin_dataclass(type_): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
725 yield from make_dataclass_validator(type_, config) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
726 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
727 if type_ is Enum: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
728 yield enum_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
729 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
730 if type_ is IntEnum: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
731 yield int_enum_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
732 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
733 if is_namedtuple(type_): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
734 yield tuple_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
735 yield make_namedtuple_validator(type_, config) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
736 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
737 if is_typeddict(type_): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
738 yield make_typeddict_validator(type_, config) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
739 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
741 class_ = get_class(type_) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
742 if class_ is not None: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
743 if class_ is not Any and isinstance(class_, type): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
744 yield make_class_validator(class_) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
745 else:
746 yield any_class_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
747 return 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
749 for val_type, validators in _VALIDATORS: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
750 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
751 if issubclass(type_, val_type): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
752 for v in validators: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
753 if isinstance(v, IfConfig): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
754 if v.check(config): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
755 yield v.validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
756 else:
757 yield v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE
758 return 1JKabcdefghijLMklmnopqrstPQRSTUuNOvwxyzABCDE
759 except TypeError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
760 raise RuntimeError(f'error checking inheritance of {type_!r} (type: {display_as_type(type_)})') 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
762 if config.arbitrary_types_allowed: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
763 yield make_arbitrary_type_validator(type_) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE
764 else:
765 raise RuntimeError(f'no validator found for {type_}, see `arbitrary_types_allowed` in Config') 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE