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

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

30 

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

45 

46if TYPE_CHECKING: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

47 from typing_extensions import Literal, TypedDict 

48 

49 from pydantic.config import BaseConfig 

50 from pydantic.fields import ModelField 

51 from pydantic.types import ConstrainedDecimal, ConstrainedFloat, ConstrainedInt 

52 

53 ConstrainedNumber = Union[ConstrainedDecimal, ConstrainedFloat, ConstrainedInt] 

54 AnyOrderedDict = OrderedDict[Any, Any] 

55 Number = Union[int, float, Decimal] 

56 StrBytes = Union[str, bytes] 

57 

58 

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

72 

73 

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

78 

79 

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

91 

92 

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

100 

101 

102BOOL_FALSE = {0, '0', 'off', 'f', 'false', 'n', 'no'} 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

103BOOL_TRUE = {1, '1', 'on', 't', 'true', 'y', 'yes'} 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

104 

105 

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

121 

122 

123# matches the default limit cpython, see https://github.com/python/cpython/pull/96500 

124max_str_int = 4_300 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

125 

126 

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

130 

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

139 

140 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

141 return int(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

142 except (TypeError, ValueError, OverflowError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

143 raise errors.IntegerError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

144 

145 

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

150 

151 

152def float_validator(v: Any) -> float: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

153 if isinstance(v, float): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

154 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

155 

156 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

157 return float(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

158 except (TypeError, ValueError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

159 raise errors.FloatError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

160 

161 

162def strict_float_validator(v: Any) -> float: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

163 if isinstance(v, float): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

164 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

165 raise errors.FloatError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

166 

167 

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

172 

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

176 

177 

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

185 

186 

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

193 

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

198 

199 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

200 

201 

202def constant_validator(v: 'Any', field: 'ModelField') -> 'Any': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

203 """Validate ``const`` fields. 

204 

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

211 

212 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

213 

214 

215def anystr_length_validator(v: 'StrBytes', config: 'BaseConfig') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

216 v_len = len(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

217 

218 min_length = config.min_anystr_length 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

219 if v_len < min_length: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

220 raise errors.AnyStrMinLengthError(limit_value=min_length) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

221 

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

225 

226 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

227 

228 

229def anystr_strip_whitespace(v: 'StrBytes') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

230 return v.strip() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

231 

232 

233def anystr_upper(v: 'StrBytes') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

234 return v.upper() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

235 

236 

237def anystr_lower(v: 'StrBytes') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

238 return v.lower() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

239 

240 

241def ordered_dict_validator(v: Any) -> 'AnyOrderedDict': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

242 if isinstance(v, OrderedDict): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

243 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

244 

245 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

246 return OrderedDict(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

247 except (TypeError, ValueError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

248 raise errors.DictError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

249 

250 

251def dict_validator(v: Any) -> Dict[Any, Any]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

252 if isinstance(v, dict): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

253 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

254 

255 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

256 return dict(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

257 except (TypeError, ValueError): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

258 raise errors.DictError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

259 

260 

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

268 

269 

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

277 

278 

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

286 

287 

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

295 

296 

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

304 

305 

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

313 

314 

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

328 

329 if not isinstance(v, UUID): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

330 raise errors.UUIDError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

331 

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

335 

336 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

337 

338 

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

344 

345 v = str(v).strip() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

346 

347 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

348 v = Decimal(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

349 except DecimalException: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

350 raise errors.DecimalError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

351 

352 if not v.is_finite(): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

353 raise errors.DecimalIsNotFiniteError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

354 

355 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

356 

357 

358def hashable_validator(v: Any) -> Hashable: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

359 if isinstance(v, Hashable): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

360 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

361 

362 raise errors.HashableError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

363 

364 

365def ip_v4_address_validator(v: Any) -> IPv4Address: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

366 if isinstance(v, IPv4Address): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

367 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

368 

369 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

370 return IPv4Address(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

371 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

372 raise errors.IPv4AddressError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

373 

374 

375def ip_v6_address_validator(v: Any) -> IPv6Address: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

376 if isinstance(v, IPv6Address): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

377 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

378 

379 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

380 return IPv6Address(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

381 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

382 raise errors.IPv6AddressError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

383 

384 

385def ip_v4_network_validator(v: Any) -> IPv4Network: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

386 """ 

387 Assume IPv4Network initialised with a default ``strict`` argument 

388 

389 See more: 

390 https://docs.python.org/library/ipaddress.html#ipaddress.IPv4Network 

391 """ 

392 if isinstance(v, IPv4Network): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

393 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

394 

395 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

396 return IPv4Network(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

397 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

398 raise errors.IPv4NetworkError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

399 

400 

401def ip_v6_network_validator(v: Any) -> IPv6Network: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

402 """ 

403 Assume IPv6Network initialised with a default ``strict`` argument 

404 

405 See more: 

406 https://docs.python.org/library/ipaddress.html#ipaddress.IPv6Network 

407 """ 

408 if isinstance(v, IPv6Network): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

409 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

410 

411 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

412 return IPv6Network(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

413 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

414 raise errors.IPv6NetworkError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

415 

416 

417def ip_v4_interface_validator(v: Any) -> IPv4Interface: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

418 if isinstance(v, IPv4Interface): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

419 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

420 

421 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

422 return IPv4Interface(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

423 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

424 raise errors.IPv4InterfaceError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

425 

426 

427def ip_v6_interface_validator(v: Any) -> IPv6Interface: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

428 if isinstance(v, IPv6Interface): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

429 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

430 

431 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

432 return IPv6Interface(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

433 except ValueError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

434 raise errors.IPv6InterfaceError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

435 

436 

437def path_validator(v: Any) -> Path: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

438 if isinstance(v, Path): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

439 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

440 

441 try: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

442 return Path(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

443 except TypeError: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

444 raise errors.PathError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

445 

446 

447def path_exists_validator(v: Any) -> Path: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

448 if not v.exists(): 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

449 raise errors.PathNotExistsError(path=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

450 

451 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

452 

453 

454def callable_validator(v: Any) -> AnyCallable: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

455 """ 

456 Perform a simple check if the value is callable. 

457 

458 Note: complete matching of argument type hints and return types is not performed 

459 """ 

460 if callable(v): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

461 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

462 

463 raise errors.CallableError(value=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

464 

465 

466def enum_validator(v: Any) -> Enum: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

467 if isinstance(v, Enum): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

468 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

469 

470 raise errors.EnumError(value=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

471 

472 

473def int_enum_validator(v: Any) -> IntEnum: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

474 if isinstance(v, IntEnum): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

475 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

476 

477 raise errors.IntEnumError(value=v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

478 

479 

480def make_literal_validator(type_: Any) -> Callable[[Any], Any]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

481 permitted_choices = all_literal_values(type_) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

482 

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

487 

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

493 

494 return literal_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

495 

496 

497def constr_length_validator(v: 'StrBytes', field: 'ModelField', config: 'BaseConfig') -> 'StrBytes': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

498 v_len = len(v) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

499 

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

503 

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

507 

508 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

509 

510 

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

515 

516 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

517 

518 

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

523 

524 return v 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

525 

526 

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

532 

533 

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

544 

545 

546T = TypeVar('T') 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

547 

548 

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

554 

555 return arbitrary_type_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

556 

557 

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

563 

564 return class_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

565 

566 

567def any_class_validator(v: Any) -> Type[T]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

568 if isinstance(v, type): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

569 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

570 raise errors.ClassError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

571 

572 

573def none_validator(v: Any) -> 'Literal[None]': 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

574 if v is None: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

575 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

576 raise errors.NotNoneError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

577 

578 

579def pattern_validator(v: Any) -> Pattern[str]: 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

580 if isinstance(v, Pattern): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

581 return v 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

582 

583 str_value = str_validator(v) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

584 

585 try: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

586 return re.compile(str_value) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

587 except re.error: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

588 raise errors.PatternError() 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

589 

590 

591NamedTupleT = TypeVar('NamedTupleT', bound=NamedTuple) 1JKabcdefghijLMFGHIklmnopqrstPQRSTUuNOvwxyzABCDE

592 

593 

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

598 

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

605 

606 def namedtuple_validator(values: Tuple[Any, ...]) -> NamedTupleT: 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

607 annotations = NamedTupleModel.__annotations__ 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

608 

609 if len(values) > len(annotations): 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

610 raise errors.ListMaxLengthError(limit_value=len(annotations)) 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

611 

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

615 

616 return namedtuple_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

617 

618 

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

623 

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

630 

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

633 

634 return typeddict_validator 1JKabcdefghijLMFGHIklmnopqrstuNOvwxyzABCDE

635 

636 

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

642 

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

645 

646 

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] 

696 

697 

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

702 

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

708 

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

740 

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

748 

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

761 

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