B
    4d(                 @   s   d dl mZmZmZ d dlmZ d dlZd dlZd dlZd dl	Z	e	j
dkrXd dlmZ nd dlZG dd deZG dd	 d	Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Ze e fddZdd Zdd Zd d! ZdS )"    )MappingMutableMappingSequence)urlsplitN)   	   )	resourcesc               @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )URIDictz8
    Dictionary which uses normalized URIs as keys.
    c             C   s   t | S )N)r   geturl)selfuri r   ^/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/jsonschema/_utils.py	normalize   s    zURIDict.normalizec             O   s   t  | _| jj|| d S )N)dictstoreupdate)r   argskwargsr   r   r   __init__   s    zURIDict.__init__c             C   s   | j | | S )N)r   r   )r   r   r   r   r   __getitem__   s    zURIDict.__getitem__c             C   s   || j | |< d S )N)r   r   )r   r   valuer   r   r   __setitem__   s    zURIDict.__setitem__c             C   s   | j | |= d S )N)r   r   )r   r   r   r   r   __delitem__!   s    zURIDict.__delitem__c             C   s
   t | jS )N)iterr   )r   r   r   r   __iter__$   s    zURIDict.__iter__c             C   s
   t | jS )N)lenr   )r   r   r   r   __len__'   s    zURIDict.__len__c             C   s
   t | jS )N)reprr   )r   r   r   r   __repr__*   s    zURIDict.__repr__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r   r	      s   r	   c               @   s   e Zd ZdZdd ZdS )UnsetzG
    An as-of-yet unset attribute or unprovided default parameter.
    c             C   s   dS )Nz<unset>r   )r   r   r   r   r   3   s    zUnset.__repr__N)r    r!   r"   r#   r   r   r   r   r   r$   .   s   r$   c             C   s.   t td|  d}|jdd}t|S )zC
    Load a schema from ./schemas/``name``.json and return it.
    zschemas/z.jsonzutf-8)encoding)r   files__package__joinpath	read_textjsonloads)namepathdatar   r   r   load_schema7   s    r/   c             C   s(   |s| S |  dd dd |D  dS )aA  
    Construct a single string containing indexing operations for the indices.

    For example for a container ``bar``, [1, 2, "foo"] -> bar[1][2]["foo"]

    Arguments:

        container (str):

            A word to use for the thing being indexed

        indices (sequence):

            The indices to format.
    [z][c             s   s   | ]}t |V  qd S )N)r   ).0indexr   r   r   	<genexpr>T   s    z"format_as_index.<locals>.<genexpr>])join)	containerindicesr   r   r   format_as_indexA   s    r8   c             c   sP   | di }d| di }x,| D ]$}||kr$|rBt||rBq$|V  q$W dS )z
    Return the set of additional properties for the given ``instance``.

    Weeds out properties that should have been validated by ``properties`` and
    / or ``patternProperties``.

    Assumes ``instance`` is dict-like already.
    
properties|patternPropertiesN)getr5   research)instanceschemar9   patternspropertyr   r   r   find_additional_propertiesW   s    

rC   c             C   s2   t | dkrd}nd}ddd t| D |fS )z@
    Create an error message for extra items or properties.
       waswerez, c             s   s   | ]}t |V  qd S )N)r   )r1   extrar   r   r   r3   s   s    zextras_msg.<locals>.<genexpr>)r   r5   sorted)extrasverbr   r   r   
extras_msgj   s    rK   c             C   s   t | tr| gS | S )z]
    Wrap ``thing`` in a list if it's a single str.

    Otherwise, return it unchanged.
    )
isinstancestr)thingr   r   r   ensure_listv   s    
rO   c                s.   t | t  krdS t fdd|  D S )zI
    Check if two mappings are equal using the semantics of `equal`.
    Fc             3   s(   | ] \}}| kot | | V  qd S )N)equal)r1   keyr   )twor   r   r3      s   z!_mapping_equal.<locals>.<genexpr>)r   allitems)onerR   r   )rR   r   _mapping_equal   s
    
rV   c             C   s,   t | t |krdS tdd t| |D S )zJ
    Check if two sequences are equal using the semantics of `equal`.
    Fc             s   s   | ]\}}t ||V  qd S )N)rP   )r1   ijr   r   r   r3      s    z"_sequence_equal.<locals>.<genexpr>)r   rS   zip)rU   rR   r   r   r   _sequence_equal   s    rZ   c             C   sh   t | tst |tr| |kS t | tr:t |tr:t| |S t | trXt |trXt| |S t| t|kS )z
    Check if two things are equal evading some Python type hierarchy semantics.

    Specifically in JSON Schema, evade `bool` inheriting from `int`,
    recursing into sequences to do the same.
    )rL   rM   r   rZ   r   rV   unbool)rU   rR   r   r   r   rP      s    

rP   c             C   s   | dkr|S | dkr|S | S )zH
    A hack to make True and 1 and False and 0 unique for ``uniq``.
    TFr   )elementtruefalser   r   r   r[      s
    r[   c          	   C   s   yJt dd | D }t|dd}x$t||D ]\}}t||r.dS q.W W nX ttfk
r   g }x:| D ]2}t|}x|D ]}t||rzdS qzW || qhW Y nX dS )z
    Check if all of a container's elements are unique.

    Tries to rely on the container being recursively sortable, or otherwise
    falls back on (slow) brute force.
    c             s   s   | ]}t |V  qd S )N)r[   )r1   rW   r   r   r   r3      s    zuniq.<locals>.<genexpr>rD   NFT)	rH   	itertoolsislicerY   rP   NotImplementedError	TypeErrorr[   append)r6   sortZslicedrW   rX   seener   r   r   uniq   s    



rg   c             C   s  |  |drg S g }d|kr.ttdt|S d|krx| j|d \}}| j| z|t| ||7 }W d| j  X d|kr|ttdt|d 7 }d|kr
| j	|d d
|r|t| ||d 7 }d	|kr|t| ||d	 7 }nd
|kr
|t| ||d
 7 }xRdD ]J}||krx8t|D ],\}}| j	|| d
|r(|| q(W qW xRdD ]J}||krdx8|| D ],}	t| ||	}
|
s||t| ||	7 }q|W qdW |S )z
    Get all indexes of items that get evaluated under the current schema

    Covers all keywords related to unevaluatedItems: items, prefixItems, if,
    then, else, contains, unevaluatedItems, allOf, oneOf, anyOf
    booleanrT   r   z$refNZprefixItemsif)r@   thenelse)containsZunevaluatedItems)allOfoneOfanyOf)is_typelistranger   resolverresolve
push_scope%find_evaluated_item_indexes_by_schema	pop_scopeevolveis_valid	enumeraterc   descend)	validatorr?   r@   Zevaluated_indexesscoperesolvedkeywordkv	subschemaerrsr   r   r   rv      sJ    





rv   c             C   s  |  |drg S g }d|kr^| j|d \}}| j| z|t| ||7 }W d| j  X xdD ]}||krd|  || drx8| D ],\}}| j|| d||ir|	| qW |  || drdx@||  D ]0\}}	||kr| j|	d|| r|	| qW qdW d|krxf| D ]Z\}}xN|d  D ]>\}
}t
|
|r:| j|d d||ir:|	| q:W q$W d|krx8|d  D ](\}}	||krq|t| ||	7 }qW xRd	D ]J}||krx8|| D ],}	t| ||	}|s|t| ||	7 }qW qW d
|kr| j|d
 d|rp|t| ||d
 7 }d|kr|t| ||d 7 }nd|kr|t| ||d 7 }|S )a  
    Get all keys of items that get evaluated under the current schema

    Covers all keywords related to unevaluatedProperties: properties,
    additionalProperties, unevaluatedProperties, patternProperties,
    dependentSchemas, allOf, oneOf, anyOf, if, then, else
    rh   z$refN)r9   ZadditionalPropertiesZunevaluatedProperties)r@   objectr;   ZdependentSchemas)rm   rn   ro   ri   rj   rk   )rp   rs   rt   ru   &find_evaluated_property_keys_by_schemarw   rT   rx   ry   rc   r=   r>   rq   r{   )r|   r?   r@   Zevaluated_keysr}   r~   r   rB   r   r   pattern_r   r   r   r   r     sl    










r   )collections.abcr   r   r   urllib.parser   r_   r*   r=   sysversion_info	importlibr   Zimportlib_resourcesr	   r$   r/   r8   rC   rK   rO   rV   rZ   rP   r   r[   rg   rv   r   r   r   r   r   <module>   s,   
	
	=