U
    >]0                     @   s   d dl Z d dlZd dlZd dlZd dlmZmZmZ G dd deZG dd de	Z
dd Z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e	 e	 fddZdd ZdS )    N)MutableMapping	str_typesurlsplitc                   @   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   Zgeturlselfuri r
   3/usr/lib/python3/dist-packages/jsonschema/_utils.py	normalize   s    zURIDict.normalizec                 O   s   t  | _| jj|| d S r   )dictstoreupdate)r   argskwargsr
   r
   r   __init__   s    zURIDict.__init__c                 C   s   | j | | S r   r   r   r   r
   r
   r   __getitem__   s    zURIDict.__getitem__c                 C   s   || j | |< d S r   r   )r   r	   valuer
   r
   r   __setitem__   s    zURIDict.__setitem__c                 C   s   | j | |= d S r   r   r   r
   r
   r   __delitem__   s    zURIDict.__delitem__c                 C   s
   t | jS r   )iterr   r   r
   r
   r   __iter__   s    zURIDict.__iter__c                 C   s
   t | jS r   )lenr   r   r
   r
   r   __len__!   s    zURIDict.__len__c                 C   s
   t | jS r   )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   -   s    zUnset.__repr__N)r   r    r!   r"   r   r
   r
   r
   r   r#   (   s   r#   c                 C   s"   t dd| }t|dS )zC
    Load a schema from ./schemas/``name``.json and return it.
    Z
jsonschemazschemas/{0}.jsonzutf-8)pkgutilget_dataformatjsonloadsdecode)namedatar
   r
   r   load_schema1   s    r,      c                    s   d  fdd|  D S )z>
    A dumb version of `textwrap.indent` from Python 3.3.
    
c                 3   s   | ]}d d   | V  qdS )    Nr
   ).0linetimesr
   r   	<genexpr>?   s     zindent.<locals>.<genexpr>)join
splitlines)stringr4   r
   r3   r   indent:   s    r9   c                 C   s    | sdS dd dd | D  S )z
    Construct a single string containing indexing operations for the indices.

    For example, [1, 2, "foo"] -> [1][2]["foo"]

    Arguments:

        indices (sequence):

            The indices to format.
     z[%s]z][c                 s   s   | ]}t |V  qd S r   r   )r1   indexr
   r
   r   r5   Q   s     z"format_as_index.<locals>.<genexpr>)r6   )indicesr
   r
   r   format_as_indexB   s    r>   c                 c   sL   | di }d| di }| D ]$}||kr"|r@t||r@q"|V  q"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|ZpatternPropertiesN)getr6   research)instanceZschemar?   Zpatternspropertyr
   r
   r   find_additional_propertiesT   s    
rF   c                 C   s.   t | dkrd}nd}ddd | D |fS )z@
    Create an error message for extra items or properties.
    r-   ZwasZwere, c                 s   s   | ]}t |V  qd S r   r;   )r1   Zextrar
   r
   r   r5   p   s     zextras_msg.<locals>.<genexpr>)r   r6   )ZextrasZverbr
   r
   r   
extras_msgg   s    rH   c              	   C   sZ   g }|D ]>}z| t|d  W q tk
rD   | t| Y qX qd| d|f S )a+  
    Create an error message for a failure to match the given types.

    If the ``instance`` is an object and contains a ``name`` property, it will
    be considered to be a description of that object and used as its type.

    Otherwise the message is simply the reprs of the given ``types``.
    r*   z%r is not of type %srG   )appendr   	Exceptionr6   )rD   typesZreprstyper
   r
   r   	types_msgs   s    
rM   c                 C   sL   t  }t| ts| f} | D ](}t|tr8|t| q|| qt|S )z
    isinstance() can accept a bunch of really annoying different types:
        * a single type
        * a tuple of types
        * an arbitrary nested tree of tuples

    Return a flattened tuple of the given argument.
    )set
isinstancetupler   flattenadd)Zsuitable_for_isinstancerK   thingr
   r
   r   rQ      s    


rQ   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.
    )rO   r   )rS   r
   r
   r   ensure_list   s    
rT   c                 C   s   t | t |kS )zQ
    Check if two things are equal, but evade booleans and ints being equal.
    unbool)ZoneZtwor
   r
   r   equal   s    rW   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trueZfalser
   r
   r   rV      s
    rV   c                 C   s   z t tdd | D t | kW S  tk
r   zJtdd | D }t|dd}t||D ]\}}||kr\ W Y dS q\W nJ ttfk
r   g }| D ](}t|}||kr Y Y dS |	| qY nX Y nX dS )z
    Check if all of a container's elements are unique.

    Successively tries first to rely that the elements are hashable, then
    falls back on them being sortable, and finally falls back on brute
    force.
    c                 s   s   | ]}t |V  qd S r   rU   r1   ir
   r
   r   r5      s     zuniq.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r   rU   rZ   r
   r
   r   r5      s     r-   NFT)
r   rN   	TypeErrorsorted	itertoolsislicezipNotImplementedErrorrV   rI   )Z	containersortZslicedr[   jseener
   r
   r   uniq   s"    	 
rf   )r-   )r^   r'   r$   rB   Zjsonschema.compatr   r   r   r   objectr#   r,   r9   r>   rF   rH   rM   rQ   rT   rW   rV   rf   r
   r
   r
   r   <module>   s"   		
