U
    Â½„bpA  ã                   @   sV  d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	Z	edddgƒZ
d	d
„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"eƒZG d#d$„ d$eƒZG d%d&„ d&eƒZG d'd(„ d(eƒZG d)d*„ d*eƒZdS )+é    )Ú
namedtuple)Ú
text_typesÚnumeric_types)Úvalidate_format)ÚuniqNÚErrorÚtextÚindexc                    s   ‡ fdd„| D ƒS )Nc                    s    g | ]}t |jˆ g|j ƒ‘qS © )r   r   r	   )Ú.0Úerror©Úkeyr
   ú6/tmp/pip-unpacked-wheel-dl0xefvz/coreschema/schemas.pyÚ
<listcomp>   s   ÿzpush_index.<locals>.<listcomp>r
   )Úerrorsr   r
   r   r   Ú
push_index   s    
þr   c                   @   sJ   e Zd Zi Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚSchemaÚ Nc                 C   s   || _ || _|| _d S ©N)ÚtitleÚdescriptionÚdefault)Úselfr   r   r   r
   r
   r   Ú__init__!   s    zSchema.__init__c                 C   s"   | j | }| j}t|jf |Žg ƒS r   )r   Ú__dict__r   Úformat)r   ÚcodeZerror_stringÚparamsr
   r
   r   Ú
make_error&   s    
zSchema.make_errorc                 C   s<   t | tƒr| j}n| g}t |tƒr*|j}n|g}t|| ƒS r   )Ú
isinstanceÚUnionÚchildren©r   ÚotherZself_childrenZother_childrenr
   r
   r   Ú__or__+   s    

zSchema.__or__c                 C   s<   t | tƒr| j}n| g}t |tƒr*|j}n|g}t|| ƒS r   )r    ÚIntersectionr"   r#   r
   r
   r   Ú__and__8   s    

zSchema.__and__c                 C   s   t | |gƒS r   )ÚExclusiveUnion©r   r$   r
   r
   r   Ú__xor__E   s    zSchema.__xor__c                 C   s   t | ƒS r   )ÚNot)r   r
   r
   r   Ú
__invert__H   s    zSchema.__invert__c                 C   s   | j |j ko| j|jkS r   )Ú	__class__r   r)   r
   r
   r   Ú__eq__K   s    
þzSchema.__eq__)r   r   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r%   r'   r*   r,   r.   r
   r
   r
   r   r      s   
r   c                       s<   e Zd ZddddddddœZd‡ fdd„	Zddd„Z‡  ZS )ÚObjectzMust be an object.zObject keys must be strings.úMust not be empty.zThis field is required.z3Must have no more than {max_properties} properties.z/Must have at least {min_properties} properties.zInvalid property.)ÚtypeÚinvalid_keyÚemptyÚrequiredÚmax_propertiesÚmin_propertiesÚinvalid_propertyNTc                    s~   t t| ƒjf |Ž t|tƒr&tƒ | _n
|| _d}|| _|p<g | _|| _	|| _
|| _|| _d | _|d k	rzdd„ | ¡ D ƒ| _d S )NTc                 S   s   i | ]\}}t  |¡|“qS r
   )ÚreÚcompile)r   r   Úvaluer
   r
   r   Ú
<dictcomp>r   s   ÿ z#Object.__init__.<locals>.<dictcomp>)Úsuperr2   r   r    ÚboolÚAnythingÚadditional_properties_schemaÚ
propertiesr7   r8   r9   Úpattern_propertiesÚadditional_propertiesÚpattern_properties_regexÚitems)r   rC   r7   r8   r9   rD   rE   Úkwargs©r-   r
   r   r   ]   s     


ýzObject.__init__c           
      C   s  t |tƒs|  d¡gS g }tdd„ | ¡ D ƒƒr@||  d¡g7 }| jd k	rx| jD ]&}||krP|  d¡g}|t||ƒ7 }qP| jd k	r¼t|ƒ| jk r¼| jdkr¬||  d¡g7 }n||  d¡g7 }| j	d k	rät|ƒ| j	krä||  d	¡g7 }t
| ¡ ƒ}| jd k	�rP|t
| j ¡ ƒ8 }| j ¡ D ]6\}}||k�r.�q| || |¡}|t||ƒ7 }�q| jd k	�r¸t|ƒD ]R}| j ¡ D ]@\}}	t ||¡�rr|	 || |¡}|t||ƒ7 }| |¡ �qr�qd| j�rî|D ]&}| j || |¡}|t||ƒ7 }�qÄn&|D ] }|  d
¡g}|t||ƒ7 }�qò|S )Nr4   c                 s   s   | ]}t |tƒ V  qd S r   )r    r   )r   r   r
   r
   r   Ú	<genexpr>}   s     z"Object.validate.<locals>.<genexpr>r5   r7   é   r6   r9   r8   r:   )r    Údictr   ÚanyÚkeysr7   r   r9   Úlenr8   ÚsetrC   rG   ÚvalidaterD   ÚlistrF   r;   ÚsearchÚdiscardrE   rB   )
r   r=   Úcontextr   r   Úerror_itemsZremaining_keysZproperty_itemÚpatternÚschemar
   r
   r   rQ   x   sR    






zObject.validate)NNNNNT)N©r/   r0   r1   r   r   rQ   Ú__classcell__r
   r
   rI   r   r2   R   s   ù
r2   c                       s8   e Zd ZddddddœZd‡ fd
d„	Zddd„Z‡  ZS )ÚArrayzMust be an array.r3   z)Must have no more than {max_items} items.z%Must have at least {min_items} items.z!Must not contain duplicate items.)r4   r6   Ú	max_itemsÚ	min_itemsÚuniqueNFTc                    sp   t t| ƒjf |Ž |d kr tƒ }t|tƒrN|dkrN|d ksF|t|ƒkrNt|ƒ}|| _|| _|| _	|| _
|| _d S )NF)r?   r[   r   rA   r    rR   rO   rG   r\   r]   Úunique_itemsÚadditional_items)r   rG   r\   r]   r_   r`   rH   rI   r
   r   r   ·   s    zArray.__init__c           	      C   s.  t |tƒs|  d¡gS g }| jd k	r˜| j}t | jtƒ}t|ƒD ]X\}}|r||t| jƒk rd| j| }nt | jtƒrv q˜n| j}| ||¡}|t	||ƒ7 }q>| j
d k	rÜt|ƒ| j
k rÜ| j
dkrÌ||  d¡g7 }n||  d¡g7 }| jd k	�rt|ƒ| jk�r||  d¡g7 }| j�r*t|ƒ�s*||  d¡g7 }|S )Nr4   rK   r6   r]   r\   r^   )r    rR   r   rG   Ú	enumeraterO   r`   r@   rQ   r   r]   r\   r_   r   )	r   r=   rU   r   Zchild_schemaZis_listÚidxÚitemrV   r
   r
   r   rQ   È   s6    




zArray.validate)NNNFT)NrY   r
   r
   rI   r   r[   ®   s   ûr[   c                       s>   e Zd ZdZdddddddœZd‡ fd
d„	Zddd„Z‡  ZS )ÚNumberFzMust be a number.ú+Must be greater than or equal to {minimum}.úMust be greater than {minimum}.ú(Must be less than or equal to {maximum}.úMust be less than {maximum}.ú$Must be a multiple of {multiple_of}.©r4   ÚminimumÚexclusive_minimumÚmaximumÚexclusive_maximumÚmultiple_ofNc                    s4   t t| ƒjf |Ž || _|| _|| _|| _|| _d S r   )r?   rd   r   rk   rm   rl   rn   ro   )r   rk   rm   rl   rn   ro   rH   rI   r
   r   r   ù   s    zNumber.__init__c                 C   s4  t |tƒr|  d¡gS t |tƒs,|  d¡gS | jrPt |tƒrP| ¡ sP|  d¡gS g }| jd k	rš| jr€|| jkrš||  d¡g7 }n|| jk rš||  d¡g7 }| j	d k	rà| j
rÆ|| j	krà||  d¡g7 }n|| j	krà||  d¡g7 }| jd k	�r0t | jtƒ�rt|ƒ| j  ¡  }n
|| j }|�r0||  d¡g7 }|S )Nr4   rl   rk   rn   rm   ro   )r    r@   r   r   Úinteger_onlyÚfloatÚ
is_integerrk   rl   rm   rn   ro   )r   r=   rU   r   Úfailedr
   r
   r   rQ     s4    








zNumber.validate)NNFFN)N)r/   r0   r1   rp   r   r   rQ   rZ   r
   r
   rI   r   rd   î   s   ú	rd   c                   @   s"   e Zd ZdddddddœZdZd	S )
ÚIntegerzMust be an integer.re   rf   rg   rh   ri   rj   TN)r/   r0   r1   r   rp   r
   r
   r
   r   rt   #  s   úrt   c                       s:   e Zd ZdddddddœZd‡ fd	d
„	Zddd„Z‡  ZS )ÚStringzMust be a string.zMust not be blank.z/Must have no more than {max_length} characters.z+Must have at least {min_length} characters.z#Must match the pattern /{pattern}/.zMust be a valid {format}.)r4   ÚblankÚ
max_lengthÚ
min_lengthrW   r   Nc                    sJ   t t| ƒjf |Ž || _|| _|| _|| _d | _| jd k	rFt 	|¡| _d S r   )
r?   ru   r   rw   rx   rW   r   Úpattern_regexr;   r<   )r   rw   rx   rW   r   rH   rI   r
   r   r   9  s    
zString.__init__c                 C   sØ   t |tƒs|  d¡gS g }| jd k	r^t|ƒ| jk r^| jdkrN||  d¡g7 }n||  d¡g7 }| jd k	r†t|ƒ| jkr†||  d¡g7 }| jd k	r®t | j	|¡s®||  d¡g7 }| j
d k	rÔt|| j
ƒsÔ||  d¡g7 }|S )Nr4   rK   rv   rx   rw   rW   r   )r    r   r   rx   rO   rw   rW   r;   rS   ry   r   r   ©r   r=   rU   r   r
   r
   r   rQ   D  s$    





zString.validate)NNNN)NrY   r
   r
   rI   r   ru   /  s   ú	ru   c                   @   s   e Zd ZddiZddd„ZdS )ÚBooleanr4   zMust be a boolean.Nc                 C   s   t |tƒs|  d¡gS g S ©Nr4   )r    r@   r   ©r   r=   rU   r
   r
   r   rQ   `  s    
zBoolean.validate)N©r/   r0   r1   r   rQ   r
   r
   r
   r   r{   [  s    ÿr{   c                   @   s   e Zd ZddiZddd„ZdS )ÚNullr4   zMust be null.Nc                 C   s   |d k	r|   d¡gS g S r|   )r   r}   r
   r
   r   rQ   k  s    zNull.validate)Nr~   r
   r
   r
   r   r   f  s    ÿr   c                       s0   e Zd ZdddœZ‡ fdd„Zd	dd„Z‡  ZS )
ÚEnumzMust be one of {enum}.zMust be {exact}.)ÚenumÚexactc                    s6   t t| ƒjf |Ž || _t|ƒdkr2t|d ƒ| _d S )NrK   r   )r?   r€   r   r�   rO   Úreprr‚   )r   r�   rH   rI   r
   r   r   w  s    zEnum.__init__Nc                 C   s4   || j kr0t| j ƒdkr$|  d¡gS |  d¡gS g S )NrK   r‚   r�   )r�   rO   r   r}   r
   r
   r   rQ   ~  s
    
zEnum.validate)NrY   r
   r
   rI   r   r€   q  s
   þr€   c                   @   s6   e Zd ZddiZeeeeee	e
dƒf Zddd„ZdS )rA   r4   zMust be a valid primitive type.Nc                 C   sb   t || jƒs|  d¡gS g }t |tƒr>tƒ }|| ||¡7 }n t |tƒr^tƒ }|| ||¡7 }|S r|   )r    Útypesr   rR   r[   rQ   rL   r2   )r   r=   rU   r   rX   r
   r
   r   rQ   Œ  s    

zAnything.validate)N)r/   r0   r1   r   r   rL   rR   Úintrq   r@   r4   r„   rQ   r
   r
   r
   r   rA   †  s
    ÿrA   c                       s.   e Zd ZddiZ‡ fdd„Zddd„Z‡  ZS )	r!   ÚmatchúMust match one of the options.c                    s   t t| ƒjf |Ž || _d S r   )r?   r!   r   r"   ©r   r"   rH   rI   r
   r   r   ¡  s    zUnion.__init__Nc                 C   s0   | j D ]}| ||¡g krg   S q|  d¡gS )Nr†   ©r"   rQ   r   )r   r=   rU   Úchildr
   r
   r   rQ   ¦  s    

zUnion.validate)NrY   r
   r
   rI   r   r!   œ  s
    ÿr!   c                       s&   e Zd Z‡ fdd„Zddd„Z‡  ZS )r&   c                    s   t t| ƒjf |Ž || _d S r   )r?   r&   r   r"   rˆ   rI   r
   r   r   ®  s    zIntersection.__init__Nc                 C   s&   g }| j D ]}| | ||¡¡ q
|S r   )r"   ÚextendrQ   )r   r=   rU   r   rŠ   r
   r
   r   rQ   ²  s    
zIntersection.validate)N)r/   r0   r1   r   rQ   rZ   r
   r
   rI   r   r&   ­  s   r&   c                       s0   e Zd ZdddœZ‡ fdd„Zd	dd„Z‡  ZS )
r(   r‡   z#Must match only one of the options.)r†   Úmatch_only_onec                    s   t t| ƒjf |Ž || _d S r   )r?   r(   r   r"   rˆ   rI   r
   r   r   ¿  s    zExclusiveUnion.__init__Nc                 C   sP   d}| j D ]}| ||¡g kr
|d7 }q
|s8|  d¡gS |dkrL|  d¡gS g S )Nr   rK   r†   rŒ   r‰   )r   r=   rU   ÚmatchesrŠ   r
   r
   r   rQ   Ä  s    

zExclusiveUnion.validate)NrY   r
   r
   rI   r   r(   ¹  s
   þr(   c                       s.   e Zd ZddiZ‡ fdd„Zddd„Z‡  ZS )	r+   Úmust_not_matchzMust not match the option.c                    s   t t| ƒjf |Ž || _d S r   )r?   r+   r   rŠ   )r   rŠ   rH   rI   r
   r   r   Õ  s    zNot.__init__Nc                 C   s"   g }| j  ||¡rg S |  d¡gS )NrŽ   )rŠ   rQ   r   rz   r
   r
   r   rQ   Ù  s    zNot.validate)NrY   r
   r
   rI   r   r+   Ð  s
    ÿr+   c                   @   s&   e Zd Zdd„ Zdd„ Zddd„ZdS )	ÚRefc                 C   s
   || _ d S r   )Úref_name)r   r�   r
   r
   r   r   ã  s    zRef.__init__c                 C   s:   t |tƒst‚d|kst‚| j|d ks,t‚|d | j S ©NÚrefs)r    rL   ÚAssertionErrorr�   )r   rU   r
   r
   r   Údereferenceæ  s    zRef.dereferenceNc                 C   s   |   |¡}| ||¡S r   )r”   rQ   )r   r=   rU   rX   r
   r
   r   rQ   ì  s    
zRef.validate)N)r/   r0   r1   r   r”   rQ   r
   r
   r
   r   r�   â  s   r�   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚRefSpacec                 C   s&   ||kst ‚|| _|| _|| | _d S r   )r“   r’   ÚrootÚroot_validator)r   r’   r–   r
   r
   r   r   ò  s    zRefSpace.__init__c                 C   s   d| j i}| j ||¡S r‘   )r’   r—   rQ   r}   r
   r
   r   rQ   ø  s    
zRefSpace.validateN)r/   r0   r1   r   rQ   r
   r
   r
   r   r•   ñ  s   r•   )Úcollectionsr   Zcoreschema.compatr   r   Zcoreschema.formatsr   Zcoreschema.utilsr   r;   r   r   Úobjectr   r2   r[   rd   rt   ru   r{   r   r€   rA   r!   r&   r(   r+   r�   r•   r
   r
   r
   r   Ú<module>   s,   4\@5,