
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    `                     @   s  d Z ddlmZ ddlmZ ddlmZ ddlmZmZ ddlZddl	m
Z
 ddlmZ dd	lmZmZmZmZmZmZmZmZ dd
lmZmZmZmZ ddlmZmZmZ e Z dd Z!G dd de"Z#G dd de"Z$G dd de%Z&dZ'G dd de(Z)e)de&fi Z*dS )a
  
    Extensible validation for Python dictionaries.
    This module implements Cerberus Validator class

    :copyright: 2012-2016 by Nicola Iarocci.
    :license: ISC, see LICENSE for more details.

    Full documentation is available at http://python-cerberus.org
    )absolute_import)literal_eval)copy)datedatetimeN)warn)errors)
_int_types	_str_type	ContainerHashableIterableMappingSequenceSized)schema_registryrules_set_registryDefinitionSchemaSchemaError)drop_item_from_tuplereadonly_classpropertyTypeDefinitionc                 C   s   dd }|}| |_ |S )Nc                 S   s   t dd S )NzcDummy method called. Its purpose is to hold justvalidation constraints for a rule in its docstring.)RuntimeError)self
constraintfieldvalue r   C/opt/alt/python38/lib/python3.8/site-packages/cerberus/validator.pydummy*   s    z(dummy_for_rule_validation.<locals>.dummy)__doc__)Zrule_constraintsr   fr   r   r   dummy_for_rule_validation)   s    r"   c                   @   s   e Zd ZdZdS )DocumentErrorzBRaised when the target document is missing or has the wrong formatN__name__
__module____qualname__r    r   r   r   r   r#   6   s   r#   c                   @   s   e Zd ZdZdS )_SchemaRuleTypeErrorzw
    Raised when a schema (list) validation encounters a mapping.
    Not supposed to be used outside this module.
    Nr$   r   r   r   r   r(   <   s   r(   c                       sJ  e Zd ZdZdZdZedeefdede	fdede
fefedefded	efded
efdedeefdedefdedefefedeefe	fedefdedefddZe Z fddZedd Zdd Zedd Zdd ZdddZdd  Zd!d" Zd#d$ Zd%d& Z d'd( Z!e"d)d* Z#e#j$d+d* Z#e"d,d- Z%e%j$d.d- Z%e"d/d0 Z&e"d1d2 Z'e'j$d3d2 Z'e"d4d5 Z(e"d6d7 Z)e)j$d8d7 Z)e"d9d: Z*e*j$d;d: Z*e"d<d= Z+e+j$d>d= Z+e"d?d@ Z,e"dAdB Z-e"dCdD Z.e"dEdF Z/e/j$dGdF Z/e"dHdI Z0e"dJdK Z1e1j$dLdK Z1e"dMdN Z2e2j$dOdN Z2e3dPdQ Z4ddRdSZ5dTdU Z6ddWdXZ7dYdZ Z8d[d\ Z9d]d^ Z:d_d` Z;dadb Z<dcdd Z=dedf Z>dgdh Z?didj Z@edkdl ZAedmdn ZBdodp ZCdqdr ZDdsdt ZEdudv ZFdwdx ZGdydz ZHd{d| ZIdd~dZJeJZKdd ZLdd ZMdd ZNeOdZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd ZbeOdZcdd Zddd Zedd Zfdd Zgdd ZheOdZieOdZjdd Zkdd Zldd Zmdd Zndd Zodd Zp  ZqS )BareValidatora	  
    Validator class. Normalizes and/or validates any mapping against a
    validation-schema which is provided as an argument at class instantiation
    or upon calling the :meth:`~cerberus.Validator.validate`,
    :meth:`~cerberus.Validator.validated` or
    :meth:`~cerberus.Validator.normalized` method. An instance itself is
    callable and executes a validation.

    All instantiation parameters are optional.

    There are the introspective properties :attr:`types`, :attr:`validators`,
    :attr:`coercers`, :attr:`default_setters`, :attr:`rules`,
    :attr:`normalization_rules` and :attr:`validation_rules`.

    The attributes reflecting the available rules are assembled considering
    constraints that are defined in the docstrings of rules' methods and is
    effectively used as validation schema for :attr:`schema`.

    :param schema: See :attr:`~cerberus.Validator.schema`.
                   Defaults to :obj:`None`.
    :type schema: any :term:`mapping`
    :param ignore_none_values: See :attr:`~cerberus.Validator.ignore_none_values`.
                               Defaults to ``False``.
    :type ignore_none_values: :class:`bool`
    :param allow_unknown: See :attr:`~cerberus.Validator.allow_unknown`.
                          Defaults to ``False``.
    :type allow_unknown: :class:`bool` or any :term:`mapping`
    :param require_all: See :attr:`~cerberus.Validator.require_all`.
                        Defaults to ``False``.
    :type require_all: :class:`bool`
    :param purge_unknown: See :attr:`~cerberus.Validator.purge_unknown`.
                          Defaults to to ``False``.
    :type purge_unknown: :class:`bool`
    :param purge_readonly: Removes all fields that are defined as ``readonly`` in the
                           normalization phase.
    :type purge_readonly: :class:`bool`
    :param error_handler: The error handler that formats the result of
                          :attr:`~cerberus.Validator.errors`.
                          When given as two-value tuple with an error-handler
                          class and a dictionary, the latter is passed to the
                          initialization of the error handler.
                          Default: :class:`~cerberus.errors.BasicErrorHandler`.
    :type error_handler: class or instance based on
                         :class:`~cerberus.errors.BaseErrorHandler` or
                         :class:`tuple`
    )nullable)r*   readonlytypeemptybinaryr   boolean	containerr   r   dictfloatintegerlistnumbersetstring)r.   r/   r0   r   r   r1   r2   r3   r4   r5   r6   r7   c                    s   d| _ t | _d| _t | _t | _d| _	d| _
d| _| || _| || |dd| _|dd| _|dd| _g | _tt|   dS )a4  
        The arguments will be treated as with this signature:

        __init__(self, schema=None, ignore_none_values=False,
                 allow_unknown=False, require_all=False,
                 purge_unknown=False, purge_readonly=False,
                 error_handler=errors.BasicErrorHandler)
        Nr   Fschemaallow_unknownrequire_all)documentr   	ErrorList_errorsrecent_errorDocumentErrorTreedocument_error_treeSchemaErrorTreeschema_error_treedocument_pathschema_pathupdate"_BareValidator__init_error_handlererror_handler_BareValidator__store_configgetr8   r9   r:   _remaining_rulessuperr)   __init__)r   argskwargs	__class__r   r   rL      s    



zBareValidator.__init__c                 C   sb   |  dtj}t|tr"|\}}ni }t|trFt|tjrF|f |S t|tjrV|S tdd S )NrG   zInvalid error_handler.)	popr   ZBasicErrorHandler
isinstancetupler,   
issubclassZBaseErrorHandlerr   )rN   rG   Z	eh_configr   r   r   Z__init_error_handler   s    

 
z"BareValidator.__init_error_handlerc                 C   sN   d}t |dt| D ]*\}}||kr6td| q|| ||< q|| _dS )z.Assign args to kwargs and store configuration.)r8   ignore_none_valuesr9   r:   purge_unknownpurge_readonlyNz.__init__ got multiple values for argument '%s')	enumeratelen	TypeError_config)r   rM   rN   	signatureipr   r   r   Z__store_config   s    zBareValidator.__store_configc                 C   s   | j   dS )z'Purge the cache of known valid schemas.N)_valid_schemasclearclsr   r   r   clear_caches   s    zBareValidator.clear_cachesc              	   G   s  t |dkr\| j|d  | j  |d D ](}| j| | j| | j| q.n:t |dkrt	|d t
r| |d tj|d  nt |dkr|d }|d j}|d j}|dd }| j|f }| j}|tjjkr|dk	r|||f7 }|sd}	n^| | | j| }
|dkr4|
|d}	n0|dkr\|
|| j}	||
krdd}n|
| }	| j|}t|||||	||| _| | jg dS )	a  
        Creates and adds one or multiple errors.

        :param args: Accepts different argument's signatures.

                     *1. Bulk addition of errors:*

                     - :term:`iterable` of
                       :class:`~cerberus.errors.ValidationError`-instances

                     The errors will be added to
                     :attr:`~cerberus.Validator._errors`.

                     *2. Custom error:*

                     - the invalid field's name

                     - the error message

                     A custom error containing the message will be created and
                     added to :attr:`~cerberus.Validator._errors`.
                     There will however be fewer information contained in the
                     error (no reference to the violated rule and its
                     constraint).

                     *3. Defined error:*

                     - the invalid field's name

                     - the error-reference, see :mod:`cerberus.errors`

                     - arbitrary, supplemental information about the error

                     A :class:`~cerberus.errors.ValidationError` instance will
                     be created and added to
                     :attr:`~cerberus.Validator._errors`.
           r      Nr*   FrequiredZ__require_all__)rY   r=   extendsortr@   addrB   rG   emitrR   r
   _errorr   ZCUSTOMcoderulerC   rD   UNKNOWN_FIELD_resolve_rules_set_resolve_schemar8   rI   r:   r;   ZValidationErrorr>   )r   rM   errorr   rl   rm   inforC   rD   r   	rules_setr   r   r   r   rk      sR    &





      zBareValidator._errorNc                 K   s   | j  }|| | jsRd|d< t|d< | j|d< | j|d< | j|d< | j|d< | j	f |}|dkrp| j
|_
nt|ts|f}| j
| |_
|dkr| j|_nt|ts|f}| j| |_|S )	a@  
        Creates a new instance of Validator-(sub-)class. All initial parameters of the
        parent are passed to the initialization, unless a parameter is given as an
        explicit *keyword*-parameter.

        :param document_crumb: Extends the
                               :attr:`~cerberus.Validator.document_path`
                               of the child-validator.
        :type document_crumb: :class:`tuple` or :term:`hashable`
        :param schema_crumb: Extends the
                             :attr:`~cerberus.Validator.schema_path`
                             of the child-validator.
        :type schema_crumb: :class:`tuple` or hashable
        :param kwargs: Overriding keyword-arguments for initialization.
        :type kwargs: :class:`dict`

        :return: an instance of ``self.__class__``
        Tis_childrG   root_allow_unknownroot_require_allroot_documentroot_schemaN)r[   r   rE   rt   toy_error_handlerr9   r:   r;   r8   rP   rC   rR   rS   rD   )r   document_crumbschema_crumbrN   Zchild_configZchild_validatorr   r   r   _get_child_validatorE  s*    









z"BareValidator._get_child_validatorc                 C   s<   d ||dd}t| |d }|d kr8td |||S )Nz_{0}_{1} _z/There's no handler for '{}' in the '{}' domain.)formatreplacegetattrr   )r   domainrm   Z
methodnameresultr   r   r   Z__get_rule_handlert  s     z BareValidator.__get_rule_handlerc                 C   s   t | j}t | j}|D ]b}t|ddD ]}t|j|| |_q(t|ddD ]}t|j|| |_qL|jr| |j|| qdS )a{  
        Removes nodes by index from an errorpath, relatively to the basepaths of self.

        :param errors: A list of :class:`errors.ValidationError` instances.
        :param dp_items: A list of integers, pointing at the nodes to drop from
                         the :attr:`document_path`.
        :param sp_items: Alike ``dp_items``, but for :attr:`schema_path`.
        T)reverseN)rY   rC   rD   sortedr   Zchild_errors_drop_nodes_from_errorpaths)r   r=   Zdp_itemsZsp_itemsZdp_basedepthZsp_basedepthrq   r]   r   r   r   r   ~  s    	

  z)BareValidator._drop_nodes_from_errorpathsc                 C   sn   | dr.|dd }| dr&| jn| j}n| j}|d}|D ]}||krT dS ||i }qB|d |fS )a  
        Searches for a field as defined by path. This method is used by the
        ``dependency`` evaluation logic.

        :param path: Path elements are separated by a ``.``. A leading ``^``
                     indicates that the path relates to the document root,
                     otherwise it relates to the currently evaluated document,
                     which is possibly a subdocument.
                     The sequence ``^^`` at the start will be interpreted as a
                     literal ``^``.
        :type path: :class:`str`
        :returns: Either the found field name and its value or :obj:`None` for
                  both.
        :rtype: A two-value :class:`tuple`.
        ^rd   N.)NN)
startswithr;   rw   splitrI   )r   pathcontextpartspartr   r   r   _lookup_field  s    

zBareValidator._lookup_fieldc                 C   s(   t |tr|S t |tr$| j|S d S N)rR   r   r
   r   rI   )r   rs   r   r   r   ro     s
    

z BareValidator._resolve_rules_setc                 C   s(   t |tr|S t |tr$| j|S d S r   )rR   r   r
   r   rI   r   r8   r   r   r   rp     s
    

zBareValidator._resolve_schemac                 C   s   | j ddS )a2  
        If ``True`` unknown fields that are not defined in the schema will be ignored.
        If a mapping with a validation schema is given, any undefined field will be
        validated against its rules. Also see :ref:`allowing-the-unknown`.
        Type: :class:`bool` or any :term:`mapping`
        r9   Fr[   rI   r   r   r   r   r9     s    zBareValidator.allow_unknownc                 C   s0   | j s"t|ttfs"t| d|i || jd< d S )Nr9   )rt   rR   boolr   r[   r   r   r   r   r   r9     s    c                 C   s   | j ddS )zw
        If ``True`` known fields that are defined in the schema will be required.
        Type: :class:`bool`
        r:   Fr   r   r   r   r   r:     s    zBareValidator.require_allc                 C   s   || j d< d S )Nr:   r[   r   r   r   r   r:     s    c                 C   s   |  | jS )z
        The errors of the last processing formatted by the handler that is bound to
        :attr:`~cerberus.Validator.error_handler`.
        )rG   r=   r   r   r   r   r     s    zBareValidator.errorsc                 C   s   | j ddS )zm
        Whether to not process :obj:`None`-values in a document or not.
        Type: :class:`bool`
        rU   Fr   r   r   r   r   rU     s    z BareValidator.ignore_none_valuesc                 C   s   || j d< d S )NrU   r   r   r   r   r   rU     s    c                 C   s   | j ddS )z
        ``True`` for child-validators obtained with
        :meth:`~cerberus.Validator._get_child_validator`.
        Type: :class:`bool`
        rt   Fr   r   r   r   r   rt     s    zBareValidator.is_childc                 C   s   | j ddS )z/``True`` if the document is already normalized._is_normalizedFr   r   r   r   r   r     s    zBareValidator._is_normalizedc                 C   s   || j d< d S )Nr   r   r   r   r   r   r     s    c                 C   s   | j ddS )z
        If ``True``, unknown fields will be deleted from the document unless a
        validation is called with disabled normalization. Also see
        :ref:`purging-unknown-fields`.
        Type: :class:`bool`
        rV   Fr   r   r   r   r   rV     s    zBareValidator.purge_unknownc                 C   s   || j d< d S )NrV   r   r   r   r   r   rV     s    c                 C   s   | j ddS )z
        If ``True``, fields declared as readonly will be deleted from the document
        unless a validation is called with disabled normalization.
        Type: :class:`bool`
        rW   Fr   r   r   r   r   rW     s    zBareValidator.purge_readonlyc                 C   s   || j d< d S )NrW   r   r   r   r   r   rW     s    c                 C   s   | j d| jS )z
        The :attr:`~cerberus.Validator.allow_unknown` attribute of the first level
        ancestor of a child validator.
        ru   )r[   rI   r9   r   r   r   r   ru      s    z BareValidator.root_allow_unknownc                 C   s   | j d| jS )z
        The :attr:`~cerberus.Validator.require_all` attribute of the first level
        ancestor of a child validator.
        rv   )r[   rI   r:   r   r   r   r   rv   (  s    zBareValidator.root_require_allc                 C   s   | j d| jS )z~
        The :attr:`~cerberus.Validator.document` attribute of the first level ancestor
        of a child validator.
        rw   )r[   rI   r;   r   r   r   r   rw   0  s    zBareValidator.root_documentc                 C   s   | j dtS )zj
        The registry that holds referenced rules sets.
        Type: :class:`~cerberus.Registry`
        r   )r[   rI   r   r   r   r   r   r   8  s    z BareValidator.rules_set_registryc                 C   s   || j d< d S )Nr   r   r   registryr   r   r   r   @  s    c                 C   s   | j d| jS )z|
        The :attr:`~cerberus.Validator.schema` attribute of the first level ancestor of
        a child validator.
        rx   )r[   rI   r8   r   r   r   r   rx   D  s    zBareValidator.root_schemac                 C   s   | j S )z
        The validation schema of a validator. When a schema is passed to a method, it
        replaces this attribute.
        Type: any :term:`mapping` or :obj:`None`
        )_schemar   r   r   r   r8   L  s    zBareValidator.schemac                 C   s8   |d krd | _ n$| js t|tr(|| _ nt| || _ d S r   )r   rt   rR   r   r   r   r   r   r8   U  s
    c                 C   s   | j dtS )zg
        The registry that holds referenced schemas.
        Type: :class:`~cerberus.Registry`
        r   )r[   rI   r   r   r   r   r   r   ^  s    zBareValidator.schema_registryc                 C   s   || j d< d S )Nr   r   r   r   r   r   r   f  s    c                 C   s4   t | jt | j@ }|r$td|  t| j| j S )zi
        The constraints that can be used for the 'type' rule.
        Type: A tuple of strings.
        zcThese types are defined both with a method and in the'types_mapping' property of this validator: %s)r6   types_mapping_types_from_methodsr   rS   )rb   Zredundant_typesr   r   r   typesl  s    zBareValidator.typesc                 C   s   t  | _d | _t  | _t  | _t|| _	| j
s:d| _|d k	rPt| || _n(| jd krxt| jtrni | _n
tt j|d krtt jt|tstt j|| j|  d S )NF)r   r<   r=   r>   r?   r@   rA   rB   r   r;   rt   r   r   r8   rR   r9   r   r   r   ZSCHEMA_ERROR_MISSINGr#   ZDOCUMENT_MISSINGZDOCUMENT_FORMATr   rG   start)r   r;   r8   r   r   r   Z__init_processing}  s$    







zBareValidator.__init_processingc              	   G   s@   |r6|D ]*}z| j | W q tk
r0   Y qX qng | _ dS )z
        Drops rules from the queue of the rules that still need to be evaluated for the
        currently processed field. If no arguments are given, the whole queue is
        emptied.
        N)rJ   remove
ValueError)r   rulesrm   r   r   r   _drop_remaining_rules  s    
z#BareValidator._drop_remaining_rulesFc                 C   s@   |  || | | j| j | j|  | jr6|s6dS | jS dS )a   
        Returns the document normalized according to the specified rules of a schema.

        :param document: The document to normalize.
        :type document: any :term:`mapping`
        :param schema: The validation schema. Defaults to :obj:`None`. If not
                       provided here, the schema must have been provided at
                       class instantiation.
        :type schema: any :term:`mapping`
        :param always_return_document: Return the document, even if an error
                                       occurred. Defaults to: ``False``.
        :type always_return_document: :class:`bool`
        :return: A normalized copy of the provided mapping or :obj:`None` if an
                 error occurred during normalization.
        N)_BareValidator__init_processing!_BareValidator__normalize_mappingr;   r8   rG   endr=   )r   r;   r8   always_return_documentr   r   r   
normalized  s    
zBareValidator.normalizedc                 C   s   t |tr| |}| }|D ]}| || ||< q | || | jr\| js\| || | j	rn| 
|| | || | || | || | || d| _|S )NT)rR   r
   rp   r   ro   '_BareValidator__normalize_rename_fieldsrV   r9   _normalize_purge_unknownrW   (_BareValidator__normalize_purge_readonly(_BareValidator__validate_readonly_fields(_BareValidator__normalize_default_fields_normalize_coerce$_BareValidator__normalize_containersr   r   mappingr8   r   r   r   r   Z__normalize_mapping  s     

z!BareValidator.__normalize_mappingc              
   C   s   t j}|D ]}||krRd|| krR| || d ||| || dd|||< q
t| jtr
d| jkr
| | jd ||| | jdd|||< q
dS )
        {'oneof': [
            {'type': 'callable'},
            {'type': 'list',
             'schema': {'oneof': [{'type': 'callable'},
                                  {'type': 'string'}]}},
            {'type': 'string'}
        ]}
        coercer*   FN)r   COERCION_FAILED _BareValidator__normalize_coercerI   rR   r9   r   )r   r   r8   rq   r   r   r   r   r     s*    


zBareValidator._normalize_coercec           	   
   C   s   t |tr| d|}nLt |trd|}|D ]4}| |||||}tj| j| j	|f kr* q`q*|S z
||W S  t
k
r } z*|r|d ks| ||t| | W Y S d }~X Y nX d S )NZnormalize_coerce)rR   r
    _BareValidator__get_rule_handlerr   r   r   r   r@   fetch_errors_fromrC   	Exceptionrk   str)	r   	processorr   r   r*   rq   r   r^   er   r   r   Z__normalize_coerce  s(    



z BareValidator.__normalize_coercec              	   C   s   |D ]}t ||d}t|| trd|krD| |||| d  d|krb| |||| d  |t d@ szt| jtrz| ||| W q tk
r   Y qX qt|| t	rqqt|| t
rd|kr| ||| qd|kr| ||| qd S )Nr   	keysrulesvaluesrules)r9   rV   r8   r8   items)r6   rI   rR   r   /_BareValidator__normalize_mapping_per_keysrules1_BareValidator__normalize_mapping_per_valuesrulesr9   ,_BareValidator__normalize_mapping_per_schemar(   r
   r   -_BareValidator__normalize_sequence_per_schema,_BareValidator__normalize_sequence_per_items)r   r   r8   r   r   r   r   r   Z__normalize_containers  s>      
  

z$BareValidator.__normalize_containersc           	         s
  t  fdd|| D }t dd || D }| j||df|d}|j|dd}|jrx| |jg dd	g | |j |D ]}||| krq||| || krtd
jddd | j	|f D |d || | || || < q||| | || || < || |= q|d S )Nc                 3   s   | ]}| fV  qd S r   r   .0kproperty_rulesr   r   	<genexpr>+  s     zBBareValidator.__normalize_mapping_per_keysrules.<locals>.<genexpr>c                 s   s   | ]}||fV  qd S r   r   r   r   r   r   r   ,  s     r   rz   r{   r8   Tr   re      zHNormalizing keys of {path}: {key} already exists, its value is replaced.r   c                 s   s   | ]}t |V  qd S r   )r   r   xr   r   r   r   ;  s     )r   key)
r1   r|   r   r=   r   rk   r   r   joinrC   )	r   r   r   r   r8   r;   	validatorr   r   r   r   r   Z!__normalize_mapping_per_keysrules*  s0      z/BareValidator.__normalize_mapping_per_keysrulesc                    sl   t  fdd|| D }| j||df|d}|j|| dd||< |jrh| |jg dg | |j d S )Nc                 3   s   | ]}| fV  qd S r   r   r   value_rulesr   r   r   E  s     zDBareValidator.__normalize_mapping_per_valuesrules.<locals>.<genexpr>r   r   Tr   re   )r1   r|   r   r=   r   rk   )r   r   r   r   r8   r   r   r   r   Z#__normalize_mapping_per_valuesrulesD  s       
z1BareValidator.__normalize_mapping_per_valuesrulesc              
   C   s   | |i }|s"t| jtr"| j}| j||df| di | d| j| d| j| d| jd}t|| }|j|| dd}||||< |j	r| 
|j	 d S )Nr8   r9   rV   r:   )rz   r{   r8   r9   rV   r:   Tr   )rI   rR   r9   r   r|   rV   r:   r,   r   r=   rk   )r   r   r   r8   r   r   
value_typeZresult_valuer   r   r   Z__normalize_mapping_per_schemaP  s     
z,BareValidator.__normalize_mapping_per_schemac                    s   t  fddtt|  D t dd t|  D }| j  dfd}t|  }|j|dd}|| | < |jr| 	|jg dg | 
|j d S )	Nc                 3   s   | ]}|  d  fV  qdS )r8   Nr   r   r   r8   r   r   r   d  s     z@BareValidator.__normalize_sequence_per_schema.<locals>.<genexpr>c                 s   s   | ]\}}||fV  qd S r   r   r   r   vr   r   r   r   f  s     r8   r   Tr   re   )r1   rangerY   rX   r|   r,   r   valuesr=   r   rk   )r   r   r   r8   r;   r   r   r   r   r   r   Z__normalize_sequence_per_schemab  s      z-BareValidator.__normalize_sequence_per_schemac           
      C   s   || d ||  }}t |t |kr*d S tdd t|D }tdd t|D }| j||df|d}t|| }|j|dd}	||	 ||< |jr| |jg dg | 	|j d S )	Nr   c                 s   s   | ]\}}||fV  qd S r   r   r   r   r   r   r   u  s     z?BareValidator.__normalize_sequence_per_items.<locals>.<genexpr>c                 s   s   | ]\}}||fV  qd S r   r   r   r   r   r   r   v  s     r   Tr   re   )
rY   r1   rX   r|   r,   r   r   r=   r   rk   )
r   r   r   r8   r   r   r;   r   r   r   r   r   r   Z__normalize_sequence_per_itemsq  s       z,BareValidator.__normalize_sequence_per_itemsc                    s&    fdd| D D ]}|  | q| S )Nc                    s$   g | ]}  |i  d dr|qS )r+   FrI   r   r8   r   r   
<listcomp>  s      z<BareValidator.__normalize_purge_readonly.<locals>.<listcomp>rQ   r   r8   r   r   r   r   Z__normalize_purge_readonly  s    z(BareValidator.__normalize_purge_readonlyc                    s&    fdd| D D ]}|  | q| S ){'type': 'boolean'}c                    s   g | ]}| kr|qS r   r   r   r   r   r   r     s      z:BareValidator._normalize_purge_unknown.<locals>.<listcomp>r   r   r   r   r   r     s    z&BareValidator._normalize_purge_unknownc                 C   sb   t |D ]T}||kr2| ||| | ||| qt| jtrd| jkr| ||| ji| q|S )Nrename_handler)rS   _normalize_rename_normalize_rename_handlerrR   r9   r   r   r   r   r   Z__normalize_rename_fields  s    
  z'BareValidator.__normalize_rename_fieldsc                 C   s*   d|| kr&|| ||| d < ||= dS )z{'type': 'hashable'}renameNr   r   r   r   r   r     s    zBareValidator._normalize_renamec                 C   sJ   d|| krdS |  || d ||dtj}||krF|| ||< ||= dS )r   r   NF)r   r   ZRENAMING_FAILED)r   r   r8   r   new_namer   r   r   r     s    

    z'BareValidator._normalize_rename_handlerc                    s:    fddD D ]} | d | |  qd S )Nc                 3   s.   | ]&}| kr | d r|V  qdS )r+   N)ro   rI   r   r   r8   r   r   r   r     s    z;BareValidator.__validate_readonly_fields.<locals>.<genexpr>r+   )_validate_readonlyr   r   r   r   Z__validate_readonly_fields  s    
z(BareValidator.__validate_readonly_fieldsc           
   
      s2   fddD }zfdd|D }W n t k
rB   tY nX |D ]}|  | qHt }fdd|D }|r.|d}z|  | W nR tk
r   || Y n6 tk
r } z| 	|t
jt| W 5 d }~X Y nX tt|}	|	|kr"|D ]}| 	|t
jd qq.qt||	 qtd S )Nc                    s4   g | ],}| ks, | d kr|  dds|qS )Nr*   Fr   r   r   r8   r   r   r     s
   z<BareValidator.__normalize_default_fields.<locals>.<listcomp>c                    s   g | ]}d  | kr|qS )defaultr   r   r   r   r   r     s      c                    s   g | ]}d  | kr|qS )default_setterr   r   r   r   r   r     s     r   z)Circular dependencies of default setters.)rZ   r(   _normalize_defaultr6   rQ   _normalize_default_setterKeyErrorappendr   rk   r   ZSETTING_DEFAULT_FAILEDr   hashrS   ri   )
r   r   r8   Zempty_fieldsZfields_with_defaultr   Zknown_fields_statesZfields_with_default_setterr   Zfields_processing_stater   r   r   Z__normalize_default_fields  s>    



&
z(BareValidator.__normalize_default_fieldsc                 C   s   || d ||< dS )z{'nullable': True}r   Nr   r   r   r   r   r     s    z BareValidator._normalize_defaultc                 C   s>   d|| kr:|| d }t |tr.| d|}||||< dS )zi
        {'oneof': [
            {'type': 'callable'},
            {'type': 'string'}
        ]}
        r   Znormalize_default_setterN)rR   r
   r   )r   r   r8   r   setterr   r   r   r     s
    
z'BareValidator._normalize_default_setterTc                 C   s   || _ t | _| || |r.| | j| j | jD ]F}| jrN| j| dkrNq4| j|}|dk	rp| 	|| q4| 
| q4| j s| | j | j|  t| j S )aO  
        Normalizes and validates a mapping against a validation-schema of defined rules.

        :param document: The document to normalize.
        :type document: any :term:`mapping`
        :param schema: The validation schema. Defaults to :obj:`None`. If not
                       provided here, the schema must have been provided at
                       class instantiation.
        :type schema: any :term:`mapping`
        :param update: If ``True``, required fields won't be checked.
        :type update: :class:`bool`
        :param normalize: If ``True``, normalize the document before validation.
        :type normalize: :class:`bool`

        :return: ``True`` if validation succeeds, otherwise ``False``. Check
                 the :func:`errors` property for a list of processing errors.
        :rtype: :class:`bool`
        N)rE   r6   _unrequired_by_excludesr   r   r;   r8   rU   rI   $_BareValidator__validate_definitions'_BareValidator__validate_unknown_fields(_BareValidator__validate_required_fieldsrG   r   r   r=   )r   r;   r8   rE   	normalizer   definitionsr   r   r   validate  s     
zBareValidator.validatec                 O   s0   | dd}| j|| | jr&|s&dS | jS dS )z
        Wrapper around :meth:`~cerberus.Validator.validate` that returns the normalized
        and validated document or :obj:`None` if validation failed.
        r   FN)rQ   r   r=   r;   )r   rM   rN   r   r   r   r   	validated'  s
    
zBareValidator.validatedc                 C   sr   | j r`| j| }t| j ttfrn| jr*dnd}| j||| j id}|||iddsn| |j n| |t	j
 d S )Nr9   Z__allow_unknown__)r{   r8   Fr   )r9   r;   rR   r   r
   rt   r|   rk   r=   r   rn   )r   r   r   r{   r   r   r   r   Z__validate_unknown_fields3  s    
 z'BareValidator.__validate_unknown_fieldsc                    s    fdd}   j  fddjD fddjD  fdd D  _jrjd}z||}|rW qW qv tk
r   Y qY qvX qv  d	S )
z3Validate a field's value against its defined rules.c                    s     d| }| | d S )Nr   )r   rI   )rm   r   )r   r   r   r   r   r   validate_ruleE  s    z;BareValidator.__validate_definitions.<locals>.validate_rulec                    s"   g | ]}| ks|j kr|qS r   )mandatory_validationsr   )r   r   r   r   r   L  s    
z8BareValidator.__validate_definitions.<locals>.<listcomp>c                 3   s   | ]}| kr|V  qd S r   r   r   )rules_queuer   r   r   Q  s     z7BareValidator.__validate_definitions.<locals>.<genexpr>c                 3   s,   | ]$}| kr|j kr|d kr|V  qdS ))r9   r:   metarf   N)normalization_rulesr   )r   r   r   r   r   T  s
   
r   N)	ro   r;   priority_validationsrg   r   rJ   rQ   r(   r   )r   r   r   r   rm   r   r   )r   r   r   r   r   r   Z__validate_definitionsB  s,    

z$BareValidator.__validate_definitionsz {'oneof': [{'type': 'boolean'},
                       {'type': ['dict', 'string'],
                        'check_with': 'bulk_schema'}]} c                    s\   t |tr@t |ts@t fdd|D }|rX| |tj| n| krX| |tj| dS )z{'type': 'container'}c                 3   s   | ]}| kr|V  qd S r   r   r   allowed_valuesr   r   r   u  s      z2BareValidator._validate_allowed.<locals>.<genexpr>N)rR   r   r
   rS   rk   r   ZUNALLOWED_VALUESZUNALLOWED_VALUE)r   r   r   r   Z	unallowedr   r   r   _validate_allowedr  s    zBareValidator._validate_allowedc                 C   s   t |trRz| d|}W n* tk
rD   | d|}tdt Y nX ||| n2t |trv|D ]}| ||| q`n|||| j dS )r   
check_withr   ziThe 'validator' rule was renamed to 'check_with'. Please update your schema and method names accordingly.N)	rR   r
   r   r   r   DeprecationWarningr   _validate_check_withrk   )r   Zchecksr   r   Zvalue_checkerr   r   r   r   r  |  s    



z"BareValidator._validate_check_withc                 C   sZ   t |tsdS t |tr"t |tr.t|f}nt|}|t| }|rV| |tj| dS )z{'empty': False }N)rR   r   r
   r6   rk   r   ZMISSING_MEMBERS)r   Zexpected_valuesr   r   Zmissing_valuesr   r   r   _validate_contains  s    
 z BareValidator._validate_containsc                 C   sn   t |tst |ttfs|f}t |tr6| || nt |trL| || | j| j	|df dk	rjdS dS )zD{'type': ('dict', 'hashable', 'list'), 'check_with': 'dependencies'}dependenciesNT)
rR   r
   r   r   r   ._BareValidator__validate_dependencies_sequence-_BareValidator__validate_dependencies_mappingr@   Zfetch_node_fromrD   )r   r  r   r   r   r   r   _validate_dependencies  s      

z$BareValidator._validate_dependenciesc           	      C   s   d}i }|  D ]P\}}t|tr,t|tr2|g}| |\}}||krR|d7 }q|||i q|t|kr~| |tj	| d S )Nr   rd   )
r   rR   r   r
   r   rE   rY   rk   r   ZDEPENDENCIES_FIELD_VALUE)	r   r  r   Zvalidated_dependencies_counter
error_infoZdependency_nameZdependency_valuesZwanted_fieldZwanted_field_valuer   r   r   Z__validate_dependencies_mapping  s     
z-BareValidator.__validate_dependencies_mappingc                 C   s0   |D ]&}|  |d d kr| |tj| qd S )Nr   )r   rk   r   ZDEPENDENCIES_FIELD)r   r  r   Z
dependencyr   r   r   Z __validate_dependencies_sequence  s    z.BareValidator.__validate_dependencies_sequencec              	   C   sB   t |tr>t|dkr>| ddddddd |s>| |tj d	S )
r   r   allowed	forbiddenr   	minlength	maxlengthregexr  N)rR   r   rY   r   rk   r   ZEMPTY_NOT_ALLOWED)r   r-   r   r   r   r   r   _validate_empty  s    	zBareValidator._validate_emptyc                    s   t |tr|g} j| d jr0 j| |D ].}| jkr4 j| d jr4 j| q4t fdd|D rddd |D } 	|t
j| dS )z>{'type': ('hashable', 'list'), 'schema': {'type': 'hashable'}}rf   c                 3   s   | ]}| j kV  qd S r   r;   )r   excluded_fieldr   r   r   r     s     z3BareValidator._validate_excludes.<locals>.<genexpr>z, c                 s   s   | ]}d  |V  qdS )z'{0}'N)r   r   r   r   r   r   r     s    N)rR   r   r8   rI   r:   r   ri   anyr   rk   r   ZEXCLUDES_FIELD)r   Zexcluded_fieldsr   r   r  Zexclusion_strr   r   r   _validate_excludes  s    
 
z BareValidator._validate_excludesc                 C   sZ   t |tr>t |ts>t|t|@ }|rV| |tjt| n||krV| |tj| dS )z{'type': 'list'}N)	rR   r   r
   r6   rk   r   ZFORBIDDEN_VALUESr4   ZFORBIDDEN_VALUE)r   Zforbidden_valuesr   r   r  r   r   r   _validate_forbidden  s    z!BareValidator._validate_forbiddenc                 C   s   t |t |kr,| |tjt |t | n^tdd t|D }| j||df|d}|tdd t|D | jdds| |tj|j	 dS )	z'{'type': 'list', 'check_with': 'items'}c                 s   s   | ]\}}||fV  qd S r   r   )r   r]   
definitionr   r   r   r     s    z0BareValidator._validate_items.<locals>.<genexpr>r   r   c                 s   s   | ]\}}||fV  qd S r   r   )r   r]   r   r   r   r   r     s     FrE   r   N)
rY   rk   r   ZITEMS_LENGTHr1   rX   r|   rE   Z	BAD_ITEMSr=   )r   r   r   r   r8   r   r   r   r   _validate_items  s     zBareValidator._validate_itemsc                 C   s   d}t  }t|D ]\}}|| i}	dD ]4}
|
|	| kr,|
| j| kr,| j| |
 |	| |
< q,d|	| kr|| j|	| d< | j|||f|	dd}|| j| jddr|d7 }q| 	|j
g d	g ||j
 q||fS )
zl
        Validates value against all definitions and logs errors according to the
        operator.
        r   )r9   r,   r9   T)r{   r8   r9   Fr  rd      )r   r<   rX   r   r8   r9   r|   r;   rE   r   r=   rg   )r   operatorr   r   r   Zvalid_counterr=   r]   r  r8   rm   r   r   r   r   Z__validate_logical  s&      
z BareValidator.__validate_logicalc                 C   s8   |  d|||\}}|dk r4| |tj||t| dS )z${'type': 'list', 'logical': 'anyof'}Zanyofrd   N) _BareValidator__validate_logicalrk   r   ZANYOFrY   r   r   r   r   Zvalidsr=   r   r   r   _validate_anyof2  s    zBareValidator._validate_anyofc                 C   s<   |  d|||\}}|t|k r8| |tj||t| dS )z${'type': 'list', 'logical': 'allof'}ZallofN)r  rY   rk   r   ZALLOFr  r   r   r   _validate_allof8  s    zBareValidator._validate_allofc                 C   s8   |  d|||\}}|dkr4| |tj||t| dS )z%{'type': 'list', 'logical': 'noneof'}Znoneofr   N)r  rk   r   ZNONEOFrY   r  r   r   r   _validate_noneof>  s    zBareValidator._validate_noneofc                 C   s8   |  d|||\}}|dkr4| |tj||t| dS )z${'type': 'list', 'logical': 'oneof'}oneofrd   N)r  rk   r   ZONEOFrY   r  r   r   r   _validate_oneofD  s    zBareValidator._validate_oneofc                 C   s4   z||kr|  |tj W n tk
r.   Y nX dS z{'nullable': False }N)rk   r   Z	MAX_VALUErZ   )r   Z	max_valuer   r   r   r   r   _validate_maxJ  s
    zBareValidator._validate_maxc                 C   s4   z||k r|  |tj W n tk
r.   Y nX dS r#  )rk   r   Z	MIN_VALUErZ   )r   Z	min_valuer   r   r   r   r   _validate_minR  s
    zBareValidator._validate_minc                 C   s.   t |tr*t||kr*| |tjt| dS z{'type': 'integer'}N)rR   r   rY   rk   r   Z
MAX_LENGTH)r   
max_lengthr   r   r   r   r   _validate_maxlengthZ  s    z!BareValidator._validate_maxlength c                 C   s.   t |tr*t||k r*| |tjt| dS r&  )rR   r   rY   rk   r   Z
MIN_LENGTH)r   Z
min_lengthr   r   r   r   r   _validate_minlengtha  s    z!BareValidator._validate_minlengthc                 C   s@   |dkr<|s|  |tj | dddddddd	d
dddd dS )r   Nr  r-   r  r   r   minmaxr  r  r  r8   r,   r   )rk   r   ZNOT_NULLABLEr   )r   r*   r   r   r   r   r   _validate_nullablef  s$    z BareValidator._validate_nullablec                    s|   t |trx| j||dft fdd| D d}|tdd | D ddsx| |jg dd	g | |tj	|j d
S )
        {'type': ['dict', 'string'],
         'check_with': 'bulk_schema',
         'forbidden': ['rename', 'rename_handler']}
        r   c                 3   s   | ]}| fV  qd S r   r   r   r   r   r   r     s     z4BareValidator._validate_keysrules.<locals>.<genexpr>r   c                 s   s   | ]}||fV  qd S r   r   r   r   r   r   r     s     Fr   re   r   N)
rR   r   r|   r1   keysr   r=   rk   r   Z	KEYSRULES)r   r8   r   r   r   r   r   r   _validate_keysrules{  s    
z!BareValidator._validate_keysrulesc                 C   sH   |rD| j s| |tj tj| j| j|f k}| j rD|rD|   dS )r   N)r   rk   r   ZREADONLY_FIELDr@   r   rC   r   )r   r+   r   r   Z	has_errorr   r   r   r     s    

z BareValidator._validate_readonlyc                 C   sF   t |tsdS |ds |d7 }t|}||sB| |tj dS )z{'type': 'string'}N$)	rR   r
   endswithrecompilematchrk   r   ZREGEX_MISMATCH)r   patternr   r   Zre_objr   r   r   _validate_regex  s    



zBareValidator._validate_regexz {'type': 'boolean'} c                    s   z t fddj D }W n0 tk
rP   jrJjd dkrJtn Y nX |j8 }|t  fdd D  }|D ]}|t	j
 q|jrt  fdd D }j|rֈj| D ]}|t	j
 qdS )zy
        Validates that required fields are not missing.

        :param document: The document being validated.
        c                 3   s.   | ]&\}}  |d  jdkr|V  qdS )rf   TN)ro   rI   r:   )r   r   r  r   r   r   r     s
   z;BareValidator.__validate_required_fields.<locals>.<genexpr>r   r8   c                 3   s&   | ]}  |d k	sjs|V  qd S r   )rI   rU   r  r;   r   r   r   r     s    c                 3   s    | ]}  |d k	r|V  qd S r   r   r  r  r   r   r     s      N)r6   r8   r   AttributeErrorrt   rD   r(   r   rk   r   ZREQUIRED_FIELD
isdisjoint)r   r;   rf   missingr   fieldsr   r8  r   Z__validate_required_fields  s&    

z(BareValidator.__validate_required_fieldsc                 C   sL   |dkrdS t |tr0t |ts0| ||| nt |trH| ||| dS )z
        {'type': ['dict', 'string'],
         'anyof': [{'check_with': 'schema'},
                   {'check_with': 'bulk_schema'}]}
        N)rR   r   r
   (_BareValidator__validate_schema_sequencer   '_BareValidator__validate_schema_mapping)r   r8   r   r   r   r   r   _validate_schema  s    
zBareValidator._validate_schemac                 C   s   |  |}| j| d| j}| j| d| j}| j||df|||d}z&||| jddsn| |tj	|j
 W n$ tk
r   | |tj  Y nX d S )Nr9   r:   r8   )rz   r{   r8   r9   r:   Fr  )rp   r8   rI   r9   r:   r|   rE   rk   r   ZMAPPING_SCHEMAr=   r(   ZBAD_TYPE_FOR_SCHEMA)r   r   r8   r   r9   r:   r   r   r   r   Z__validate_schema_mapping  s     
z'BareValidator.__validate_schema_mappingc                    s   t  fddtt|D  | j||df | jd}|t dd t|D | jdd |jr| |jg dg | 	|t
j|j d S )	Nc                 3   s   | ]}| fV  qd S r   r   )r   r]   r   r   r   r     s     z;BareValidator.__validate_schema_sequence.<locals>.<genexpr>r8   )rz   r{   r8   r9   c                 s   s   | ]\}}||fV  qd S r   r   )r   r]   r   r   r   r   r     s     Fr  re   )r1   r   rY   r|   r9   rX   rE   r=   r   rk   r   ZSEQUENCE_SCHEMA)r   r   r8   r   r   r   r   r   Z__validate_schema_sequence  s    z(BareValidator.__validate_schema_sequencec           	      C   s   |sdS t |tr|fn|}|D ]R}| j|}|dk	rTt ||joPt ||j }n| d|}||}|r  dS q | |tj	 | 
  dS )zM
        {'type': ['string', 'list'],
         'check_with': 'type'}
        NZvalidate_type)rR   r
   r   rI   Zincluded_typesZexcluded_typesr   rk   r   ZBAD_TYPEr   )	r   Z	data_typer   r   r   Z_typeZtype_definitionZmatchedZtype_handlerr   r   r   _validate_type   s$     	zBareValidator._validate_typec                    sr   |df}t |trn| j||t fdd|D d}||| jdd |jrn| |jg dg | |tj	|j dS )	r.  r   c                 3   s   | ]}| fV  qd S r   r   r   r   r   r   r   -  s     z6BareValidator._validate_valuesrules.<locals>.<genexpr>r   Fr  re   N)
rR   r   r|   r1   rE   r=   r   rk   r   ZVALUESRULES)r   r8   r   r   r{   r   r   r   r   _validate_valuesrules"  s    
z#BareValidator._validate_valuesrules)NN)N)NF)NFT)rr%   r&   r'   r    r   r   r   bytes	bytearrayr   r   r
   r   r   r   r2   r	   r   r6   r   r_   rL   staticmethodrF   rH   classmethodrc   rk   r|   r   r   r   ro   rp   propertyr9   r   r:   r   rU   rt   r   rV   rW   ru   rv   rw   r   rx   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __call__r   r   r   r"   Z_validate_allow_unknownr  r  r  r	  r  r  r  r  r  r  r  r  r  r   r"  r$  r%  r(  _validate_metar*  r-  r0  r   r7  Z_validate_requiredZ_validate_require_allr   r?  r>  r=  r@  rA  __classcell__r   r   rO   r   r)   E   s  /3

Q
/
	
	









	















!

+
**


$"r)   z7The rule's arguments are validated against this schema:c                       s4   e Zd ZdZ fddZ fddZdd Z  ZS )InspectedValidatorzMetaclass for all validatorsc                    s>   d|d kr(|d  d|d d ji tt| j| f| S )Nr    re   rd   r   )rE   r    rK   rJ  __new__)rb   rM   rO   r   r   rK  ;  s    zInspectedValidator.__new__c                    s   fdd}t t j|  di   _ _|dD ]@}|dr^  j|tdd  f7  _q2 d|  j|< q2 jrtdt	 t
dd	 |d
D t
dd	 |dD   _ jd
 d } j |d d d d d< |d d< dd	  jD D ]}d j| d< qddi    _ _ _|dD ]n}|drV  j|tdd  f7  _n>|dr  j|tdd  f7  _n d|  j|< q(dD ]:} j| d } j |d d d d d< |d d< q j jd d d d< i  _ j j  j j d S )Nc                    s   t  fddtD S )Nc                 3   s4   | ],}| d   d  r|t d d V  qdS )r~   re   N)r   rY   r   prefixr   r   r   B  s   zNInspectedValidator.__init__.<locals>.attributes_with_prefix.<locals>.<genexpr>)rS   dirrL  ra   rL  r   attributes_with_prefixA  s    z;InspectedValidator.__init__.<locals>.attributes_with_prefixr   r   type_Z
_validate_z}Methods for type testing are deprecated, use TypeDefinition and the 'types_mapping'-property of a Validator-instance instead.c                 s   s   | ]
}|V  qd S r   r   r   r   r   r   r   ^  s     z.InspectedValidator.__init__.<locals>.<genexpr>r  r   r!  rd   r8   r  re   c                 s   s   | ]}|d kr|V  qdS )r*   Nr   r   r   r   r   r   d  s      Trf   r   Zcoerce_Zdefault_setter_Z_normalize_)r   r   r   )rK   rJ  rL   r   Zvalidation_rulesr   rY   $_InspectedValidator__get_rule_schemar   r  rS   Zcheckersr   ZcoercersZdefault_settersr   r   rE   )rb   rM   rO  	attributer   rm   rO   ra   r   rL   @  sP    
&*zInspectedValidator.__init__c                 C   s   t | |j}|d kri }n@t|kr0|td }zt| }W n tk
rX   i }Y nX |s~|dkr~td|ddd   |S )Nrd   rH  z>No validation schema is defined for the arguments of rule '%s'r~   re   r   )r   r    RULE_SCHEMA_SEPARATORr   r   stripr   r   )rb   method_nameZ	docstringr   r   r   r   Z__get_rule_schema}  s     
z$InspectedValidator.__get_rule_schema)r%   r&   r'   r    rK  rL   rQ  rI  r   r   rO   r   rJ  8  s   =rJ  	Validator)+r    
__future__r   astr   r   r   r   r3  warningsr   Zcerberusr   Zcerberus.platformr	   r
   r   r   r   r   r   r   Zcerberus.schemar   r   r   r   Zcerberus.utilsr   r   r   ZToyErrorHandlerry   r"   r   r#   r(   objectr)   rS  r,   rJ  rV  r   r   r   r   <module>   s:   
(
	           {Z