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	rt|| jk r| jdkr|| dg7 }n|| dg7 }| j	d k	rt|| 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	rt|D ]R}| j D ]@\}}	t||rr|	|| |}|t||7 }|| qrqd| jr|D ]&}| j|| |}|t||7 }qn&|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 qn| j}|||}|t	||7 }q>| j
d k	rt|| 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	rt|| jkr|| dg7 }| jd k	rt| j	|s|| dg7 }| j
d k	rt|| 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,