a Pͣ_,@sdZddlmZmZmZddlZddlmZmZm Z m Z ddl m Z gdZ e dd d d Gd d d eZd dZe dd d dGdddeZd,ddZe dd d d GdddeZddZe dd d d GdddeZddZe dd d d GdddeZddZe ddd d Gd d!d!eZd"d#Ze dd d d Gd$d%d%eZd-d&d'Ze dd d d Gd(d)d)eZd.d*d+ZdS)/z Commonly useful validators. )absolute_importdivisionprint_functionN) _AndValidatorand_attribattrs)NotCallableError) r deep_iterable deep_mappingin_ instance_of is_callable matches_reoptionalprovidesFT)reprslotshashc@s"eZdZeZddZddZdS)_InstanceOfValidatorcCs4t||js0tdj|j|j|j|d||j|dS)P We use a callable class to be able to change the ``__repr__``. z?'{name}' must be {type!r} (got {value!r} that is a {actual!r}).)nametypeactualvalueN) isinstancer TypeErrorformatr __class__selfinstattrrr$3/usr/lib/python3.9/site-packages/attr/validators.py__call__s z_InstanceOfValidator.__call__cCsdj|jdS)Nz)r)rrr!r$r$r%__repr__0sz_InstanceOfValidator.__repr__N)__name__ __module__ __qualname__rrr&r)r$r$r$r%rsrcCst|S)a A validator that raises a `TypeError` if the initializer is called with a wrong type for this particular attribute (checks are performed using `isinstance` therefore it's also valid to pass a tuple of types). :param type: The type to check for. :type type: type or tuple of types :raises TypeError: With a human readable error message, the attribute (of type `attr.Attribute`), the expected type, and the value it got. )rr'r$r$r%r6s r)rfrozenrc@s.eZdZeZeZeZddZddZdS)_MatchesReValidatorcCs0||s,tdj|j|jj|d||j|dS)rz7'{name}' must match regex {regex!r} ({value!r} doesn't))rregexrN) match_func ValueErrorrrr/patternr r$r$r%r&Ls  z_MatchesReValidator.__call__cCsdj|jdS)Nz,)r/)rr/r(r$r$r%r)[sz_MatchesReValidator.__repr__N) r*r+r,rr/flagsr0r&r)r$r$r$r%r.Fs r.cCsttdd}|dtjtjf}||vrJtddtddt|Dft||}|tjurh|j}n6|tjurz|j}n$|r|j }ntd ||}|j}t |||S)a} A validator that raises `ValueError` if the initializer is called with a string that doesn't match *regex*. :param str regex: a regex string to match against :param int flags: flags that will be passed to the underlying re function (default 0) :param callable func: which underlying `re` function to call (options are `re.fullmatch`, `re.search`, `re.match`, default is ``None`` which means either `re.fullmatch` or an emulation of it on Python 2). For performance reasons, they won't be used directly but on a pre-`re.compile`\ ed pattern. .. versionadded:: 19.2.0 fullmatchNz'func' must be one of %s.z, css|]}|r|jpdVqdS)NoneN)r*).0er$r$r% xszmatches_re..z(?:{})\Z) getattrresearchmatchr1joinsortedsetcompiler4rr.)r/r3funcr4Z valid_funcsr2r0r$r$r%ras.    rc@s"eZdZeZddZddZdS)_ProvidesValidatorcCs0|j|s,tdj|j|j|d||j|dS)rz<'{name}' must provide {interface!r} which {value!r} doesn't.)r interfacerN)rCZ providedByrrrr r$r$r%r&s  z_ProvidesValidator.__call__cCsdj|jdS)Nz0rC)rrCr(r$r$r%r)sz_ProvidesValidator.__repr__N)r*r+r,rrCr&r)r$r$r$r%rBsrBcCst|S)a( A validator that raises a `TypeError` if the initializer is called with an object that does not provide the requested *interface* (checks are performed using ``interface.providedBy(value)`` (see `zope.interface `_). :param interface: The interface to check for. :type interface: ``zope.interface.Interface`` :raises TypeError: With a human readable error message, the attribute (of type `attr.Attribute`), the expected interface, and the value it got. )rBrDr$r$r%rsrc@s"eZdZeZddZddZdS)_OptionalValidatorcCs|dur dS||||dS)N validatorr r$r$r%r&sz_OptionalValidator.__call__cCsdjt|jdS)Nz')Zwhat)rrrGr(r$r$r%r)sz_OptionalValidator.__repr__N)r*r+r,rrGr&r)r$r$r$r%rEsrEcCst|trtt|St|S)a A validator that makes an attribute optional. An optional attribute is one which can be set to ``None`` in addition to satisfying the requirements of the sub-validator. :param validator: A validator (or a list of validators) that is used for non-``None`` values. :type validator: callable or `list` of callables. .. versionadded:: 15.1.0 .. versionchanged:: 17.1.0 *validator* can be a list of validators. )rlistrErrFr$r$r%rs  rc@s"eZdZeZddZddZdS) _InValidatorcCsFz||jv}Wnty$d}Yn0|sBtdj|j|j|ddS)NFz/'{name}' must be in {options!r} (got {value!r}))roptionsr)rJrr1rr)r!r"r#rZ in_optionsr$r$r%r&s   z_InValidator.__call__cCsdj|jdS)Nz(rJ)rrJr(r$r$r%r)sz_InValidator.__repr__N)r*r+r,rrJr&r)r$r$r$r%rIs rIcCst|S)a A validator that raises a `ValueError` if the initializer is called with a value that does not belong in the options provided. The check is performed using ``value in options``. :param options: Allowed options. :type options: list, tuple, `enum.Enum`, ... :raises ValueError: With a human readable error message, the attribute (of type `attr.Attribute`), the expected options, and the value it got. .. versionadded:: 17.1.0 )rIrKr$r$r%r sr c@seZdZddZddZdS)_IsCallableValidatorcCs,t|s(d}t|j|j||jd|ddS)rz?'{name}' must be callable (got {value!r} that is a {actual!r}).)rrr)msgrN)callabler rrr)r!r"r#rmessager$r$r%r&s z_IsCallableValidator.__call__cCsdS)Nzr$r(r$r$r%r)sz_IsCallableValidator.__repr__N)r*r+r,r&r)r$r$r$r%rLsrLcCstS)aw A validator that raises a `attr.exceptions.NotCallableError` if the initializer is called with a value for this particular attribute that is not callable. .. versionadded:: 19.1.0 :raises `attr.exceptions.NotCallableError`: With a human readable error message containing the attribute (`attr.Attribute`) name, and the value it got. )rLr$r$r$r%rs rc@s:eZdZeedZedeedZddZddZ dS) _DeepIterablerFNdefaultrGcCs4|jdur|||||D]}||||qdSrN)iterable_validatormember_validator)r!r"r#rmemberr$r$r%r&/s z_DeepIterable.__call__cCs,|jdurdn dj|jd}dj||jdS)Nz {iterable!r})iterablezJ)iterable_identifierrV)rTrrU)r!rYr$r$r%r)9s z_DeepIterable.__repr__) r*r+r,rrrUrrTr&r)r$r$r$r%rP(s    rPcCs t||S)a1 A validator that performs deep validation of an iterable. :param member_validator: Validator to apply to iterable members :param iterable_validator: Validator to apply to iterable itself (optional) .. versionadded:: 19.1.0 :raises TypeError: if any sub-validators fail )rP)rUrTr$r$r%r Hs r c@sFeZdZeedZeedZedeedZddZ ddZ dS) _DeepMappingrFNrQcCsF|jdur|||||D]$}|||||||||qdSrS)mapping_validator key_validatorvalue_validator)r!r"r#rkeyr$r$r%r&]s  z_DeepMapping.__call__cCsdj|j|jdS)NzA)r^r)rr\r]r(r$r$r%r)hsz_DeepMapping.__repr__) r*r+r,rrr\r]rr[r&r)r$r$r$r%rZWs    rZcCs t|||S)a} A validator that performs deep validation of a dictionary. :param key_validator: Validator to apply to dictionary keys :param value_validator: Validator to apply to dictionary values :param mapping_validator: Validator to apply to top-level mapping attribute (optional) .. versionadded:: 19.1.0 :raises TypeError: if any sub-validators fail )rZ)r\r]r[r$r$r%r ns r )rN)N)N)__doc__Z __future__rrrr:_makerrrr exceptionsr __all__objectrrr.rrBrrErrIr rLrrPr rZr r$r$r$r%s:    -