3
g&                 @   s~   d dl Z d dlmZ G d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
dd ZG dd deZdS )    N)Mappingc               @   sR   e Zd Z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dS )
OrderedSetz?
    A set which keeps the ordering of the inserted items.
    Nc             C   s   t j|p
f | _ d S )N)dictfromkeys)selfiterable r   Y/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/utils/datastructures.py__init__
   s    zOrderedSet.__init__c             C   s   d | j |< d S )N)r   )r   itemr   r   r	   add   s    zOrderedSet.addc             C   s   | j |= d S )N)r   )r   r   r   r   r	   remove   s    zOrderedSet.removec             C   s(   y| j | W n tk
r"   Y nX d S )N)r   KeyError)r   r   r   r   r	   discard   s    zOrderedSet.discardc             C   s
   t | jS )N)iterr   )r   r   r   r	   __iter__   s    zOrderedSet.__iter__c             C   s
   || j kS )N)r   )r   r   r   r   r	   __contains__   s    zOrderedSet.__contains__c             C   s
   t | jS )N)boolr   )r   r   r   r	   __bool__   s    zOrderedSet.__bool__c             C   s
   t | jS )N)lenr   )r   r   r   r	   __len__"   s    zOrderedSet.__len__)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S )MultiValueDictKeyErrorN)r   r   r   r   r   r   r	   r   &   s   r   c                   s   e Zd ZdZf f fdd	Z fddZ fddZ fdd	Zd
d Zdd Z	dd Z
dd Zd.ddZd/ fdd	Zd0ddZ fddZd1ddZd2ddZd d! Zd"d# Z fd$d%Zd&d' Zd(d) Zd*d+ Zd,d- Z  ZS )3MultiValueDicta  
    A subclass of dictionary customized to handle multiple values for the
    same key.

    >>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']})
    >>> d['name']
    'Simon'
    >>> d.getlist('name')
    ['Adrian', 'Simon']
    >>> d.getlist('doesnotexist')
    []
    >>> d.getlist('doesnotexist', ['Adrian', 'Simon'])
    ['Adrian', 'Simon']
    >>> d.get('lastname', 'nonexistent')
    'nonexistent'
    >>> d.setlist('lastname', ['Holovaty', 'Willison'])

    This class exists to solve the irritating problem raised by cgi.parse_qs,
    which returns a list for every key, even though most Web forms submit
    single name-value pairs.
    c                s   t  j| d S )N)superr
   )r   Zkey_to_list_mapping)	__class__r   r	   r
   @   s    zMultiValueDict.__init__c                s   d| j jt j f S )Nz<%s: %s>)r   r   r   __repr__)r   )r   r   r	   r   C   s    zMultiValueDict.__repr__c                sP   yt  j|}W n tk
r,   t|Y nX y|d S  tk
rJ   g S X dS )z|
        Return the last data value for this key, or [] if it's an empty list;
        raise KeyError if not found.
           N)r   __getitem__r   r   
IndexError)r   keylist_)r   r   r	   r"   F   s    zMultiValueDict.__getitem__c                s   t  j||g d S )N)r   __setitem__)r   r$   value)r   r   r	   r&   T   s    zMultiValueDict.__setitem__c             C   s   | j dd | j D S )Nc             S   s    g | ]\}}||d d  fqS )Nr   ).0kvr   r   r	   
<listcomp>Y   s   z+MultiValueDict.__copy__.<locals>.<listcomp>)r   lists)r   r   r   r	   __copy__W   s    zMultiValueDict.__copy__c             C   sN   | j  }||t| < x4tj| D ]&\}}tj|tj||tj|| q W |S )N)r   idr   itemsr&   copydeepcopy)r   memoresultr$   r'   r   r   r	   __deepcopy__]   s    zMultiValueDict.__deepcopy__c                s    j d fdd D iS )N_datac                s   i | ]} j ||qS r   )_getlist)r(   r)   )r   r   r	   
<dictcomp>f   s    z/MultiValueDict.__getstate__.<locals>.<dictcomp>)__dict__)r   r   )r   r	   __getstate__e   s    zMultiValueDict.__getstate__c             C   s>   |j di }x |j D ]\}}| j|| qW | jj| d S )Nr5   )popr/   setlistr8   update)r   Zobj_dictdatar)   r*   r   r   r	   __setstate__h   s    zMultiValueDict.__setstate__Nc             C   s2   y| | }W n t k
r    |S X |g kr.|S |S )z
        Return the last data value for the passed key. If key doesn't exist
        or value is an empty list, return `default`.
        )r   )r   r$   defaultvalr   r   r	   getn   s    zMultiValueDict.getFc                sR   yt  j|}W n  tk
r0   |dkr,g S |S X |rJ|dk	rFt|nd}|S dS )z
        Return a list of values for the key.

        Used internally to manipulate values list. If force_list is True,
        return a new copy of values.
        N)r   r"   r   list)r   r$   r?   
force_listvalues)r   r   r	   r6   {   s    zMultiValueDict._getlistc             C   s   | j ||ddS )zn
        Return the list of values for the key. If key doesn't exist, return a
        default value.
        T)rC   )r6   )r   r$   r?   r   r   r	   getlist   s    zMultiValueDict.getlistc                s   t  j|| d S )N)r   r&   )r   r$   r%   )r   r   r	   r;      s    zMultiValueDict.setlistc             C   s   || kr|| |< | | S )Nr   )r   r$   r?   r   r   r	   
setdefault   s    zMultiValueDict.setdefaultc             C   s*   || kr |d krg }| j || | j|S )N)r;   r6   )r   r$   Zdefault_listr   r   r	   setlistdefault   s
    zMultiValueDict.setlistdefaultc             C   s   | j |j| dS )z8Append an item to the internal list associated with key.N)rG   append)r   r$   r'   r   r   r	   
appendlist   s    zMultiValueDict.appendlistc             c   s    x| D ]}|| | fV  qW dS )zu
        Yield (key, value) pairs, where value is the last item in the list
        associated with the key.
        Nr   )r   r$   r   r   r	   r/      s    
zMultiValueDict.itemsc                s   t t j S )zYield (key, list) pairs.)r   r   r/   )r   )r   r   r	   r,      s    zMultiValueDict.listsc             c   s   x| D ]}| | V  qW dS )z'Yield the last value on every key list.Nr   )r   r$   r   r   r	   rD      s    
zMultiValueDict.valuesc             C   s
   t j | S )z%Return a shallow copy of this object.)r0   )r   r   r   r	   r0      s    zMultiValueDict.copyc             O   s   t |dkrtdt | |r|d }t|trZxZ|j D ]\}}| j|j| q<W n4t|trl|j }x |D ]\}}| j|j	| qrW x$|j D ]\}}| j|j	| qW dS )z.Extend rather than replace existing key lists.r    z*update expected at most 1 argument, got %dr   N)
r   	TypeError
isinstancer   r,   rG   extendr   r/   rH   )r   argskwargsargr$   Z
value_listr'   r   r   r	   r<      s    

zMultiValueDict.updatec                s    fdd D S )z5Return current object as a dict with singular values.c                s   i | ]} | |qS r   r   )r(   r$   )r   r   r	   r7      s    z'MultiValueDict.dict.<locals>.<dictcomp>r   )r   r   )r   r	   r      s    zMultiValueDict.dict)N)NF)N)N)N)r   r   r   r   r
   r   r"   r&   r-   r4   r9   r>   rA   r6   rE   r;   rF   rG   rI   r/   r,   rD   r0   r<   r   __classcell__r   r   )r   r	   r   *   s,   



	r   c               @   sZ   e Zd ZdZddddZdd ZeZeZeZeZ	eZ
eZeZeZeZeZeZeZeZdS )	ImmutableLista0  
    A tuple-like object that raises useful errors when it is asked to mutate.

    Example::

        >>> a = ImmutableList(range(5), warning="You cannot mutate this.")
        >>> a[3] = '4'
        Traceback (most recent call last):
            ...
        AttributeError: You cannot mutate this.
    z"ImmutableList object is immutable.)warningc            O   s   t j| f||}||_|S )N)tuple__new__rR   )clsrR   rM   rN   r   r   r   r	   rT      s    zImmutableList.__new__c             O   s   t | jd S )N)AttributeErrorrR   )r   rM   rN   r   r   r	   complain   s    zImmutableList.complainN)r   r   r   r   rT   rW   __delitem__Z__delslice____iadd____imul__r&   Z__setslice__rH   rL   insertr:   r   sortreverser   r   r   r	   rQ      s    rQ   c                   s,   e Zd ZdZ fddZ fddZ  ZS )DictWrapperaG  
    Wrap accesses to a dictionary so that certain values (those starting with
    the specified prefix) are passed through a function before being returned.
    The prefix is removed before looking up the real value.

    Used by the SQL construction code to ensure that values are correctly
    quoted before being used.
    c                s   t  j| || _|| _d S )N)r   r
   funcprefix)r   r=   r_   r`   )r   r   r	   r
     s    zDictWrapper.__init__c                s@   |j | j}|r"|t| jd }t j|}|r<| j|S |S )z
        Retrieve the real value after stripping the prefix string (if
        present). If the prefix is present, pass the value through self.func
        before returning, otherwise return the raw value.
        N)
startswithr`   r   r   r"   r_   )r   r$   Zuse_funcr'   )r   r   r	   r"   	  s    
zDictWrapper.__getitem__)r   r   r   r   r
   r"   rP   r   r   )r   r	   r^      s   r^   c             c   sb   x\t | D ]P\}}t|dkr2tdj|t|t|d tsPtd|d  t|V  q
W d S )N   zDdictionary update sequence element #{} has length {}; 2 is required.r   z0Element key %r invalid, only strings are allowed)	enumerater   
ValueErrorformatrK   strrS   )r=   ielemr   r   r	   !_destruct_iterable_mapping_values  s    ri   c               @   sH   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S )CaseInsensitiveMappinga  
    Mapping allowing case-insensitive key lookups. Original case of keys is
    preserved for iteration and string representation.

    Example::

        >>> ci_map = CaseInsensitiveMapping({'name': 'Jane'})
        >>> ci_map['Name']
        Jane
        >>> ci_map['NAME']
        Jane
        >>> ci_map['name']
        Jane
        >>> ci_map  # original case preserved
        {'name': 'Jane'}
    c             C   s4   t |tsdd t|D }dd |j D | _d S )Nc             S   s   i | ]\}}||qS r   r   )r(   r)   r*   r   r   r	   r7   8  s    z3CaseInsensitiveMapping.__init__.<locals>.<dictcomp>c             S   s   i | ]\}}||f|j  qS r   )lower)r(   r)   r*   r   r   r	   r7   9  s    )rK   r   ri   r/   _store)r   r=   r   r   r	   r
   6  s    
zCaseInsensitiveMapping.__init__c             C   s   | j |j  d S )Nr    )rl   rk   )r   r$   r   r   r	   r"   ;  s    z"CaseInsensitiveMapping.__getitem__c             C   s
   t | jS )N)r   rl   )r   r   r   r	   r   >  s    zCaseInsensitiveMapping.__len__c             C   s.   t |to,dd | j D dd |j D kS )Nc             S   s   i | ]\}}||j  qS r   )rk   )r(   r)   r*   r   r   r	   r7   B  s   z1CaseInsensitiveMapping.__eq__.<locals>.<dictcomp>c             S   s   i | ]\}}||j  qS r   )rk   )r(   r)   r*   r   r   r	   r7   D  s   )rK   r   r/   )r   otherr   r   r	   __eq__A  s    
zCaseInsensitiveMapping.__eq__c             C   s   dd | j j D S )Nc             s   s   | ]\}}|V  qd S )Nr   )r(   Zoriginal_keyr'   r   r   r	   	<genexpr>I  s    z2CaseInsensitiveMapping.__iter__.<locals>.<genexpr>)rl   rD   )r   r   r   r	   r   H  s    zCaseInsensitiveMapping.__iter__c             C   s   t dd | jj D S )Nc             S   s   i | ]\}}||qS r   r   )r(   r$   r'   r   r   r	   r7   L  s    z3CaseInsensitiveMapping.__repr__.<locals>.<dictcomp>)reprrl   rD   )r   r   r   r	   r   K  s    zCaseInsensitiveMapping.__repr__c             C   s   | S )Nr   )r   r   r   r	   r0   N  s    zCaseInsensitiveMapping.copyN)r   r   r   r   r
   r"   r   rn   r   r   r0   r   r   r   r	   rj   $  s   rj   )r0   collections.abcr   r   r   r   r   r   rS   rQ   r^   ri   rj   r   r   r   r	   <module>   s   ! -%