B
    ª0H[o!  ã               @   sf   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S )é    N)ÚOrderedDictc               @   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 )Ú
OrderedSetze
    A set which keeps the ordering of the inserted items.
    Currently backs onto OrderedDict.
    Nc             C   s   t  |p
d¡| _d S )N© )r   ÚfromkeysÚdict)ÚselfÚiterabler   r   ú_C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\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|   |¡ 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d/‡ 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d0dd„Zd1‡ fdd„	Zd2dd„Z‡ fdd„Zd3dd„Zd4d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 )5Ú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.
    r   c                s   t ƒ  |¡ d S )N)Úsuperr
   )r   Zkey_to_list_mapping)Ú	__class__r   r	   r
   A   s    zMultiValueDict.__init__c                s   d| j jtƒ  ¡ f S )Nz<%s: %s>)r   r   r   Ú__repr__)r   )r   r   r	   r   D   s    zMultiValueDict.__repr__c                sP   yt ƒ  |¡}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!   G   s    zMultiValueDict.__getitem__c                s   t ƒ  ||g¡ d S )N)r   Ú__setitem__)r   r#   Úvalue)r   r   r	   r%   U   s    zMultiValueDict.__setitem__c             C   s   |   dd„ |  ¡ D ƒ¡S )Nc             S   s    g | ]\}}||d d … f‘qS )Nr   )Ú.0ÚkÚvr   r   r	   ú
<listcomp>Z   s   z+MultiValueDict.__copy__.<locals>.<listcomp>)r   Úlists)r   r   r   r	   Ú__copy__X   s    zMultiValueDict.__copy__c          	   C   sN   |   ¡ }||t| ƒ< x4t | ¡D ]&\}}t |t ||¡t ||¡¡ q W |S )N)r   Úidr   Úitemsr%   ÚcopyÚdeepcopy)r   ÚmemoÚresultr#   r&   r   r   r	   Ú__deepcopy__^   s    zMultiValueDict.__deepcopy__c                s$   ˆ j  ¡ }‡ fdd„ˆ D ƒ|d< |S )Nc                s   i | ]}ˆ   |¡|“qS r   )Ú_getlist)r'   r(   )r   r   r	   ú
<dictcomp>h   s    z/MultiValueDict.__getstate__.<locals>.<dictcomp>Ú_data)Ú__dict__r/   )r   Úobj_dictr   )r   r	   Ú__getstate__f   s    
zMultiValueDict.__getstate__c             C   s>   |  di ¡}x | ¡ D ]\}}|  ||¡ qW | j |¡ d S )Nr6   )Úpopr.   Úsetlistr7   Úupdate)r   r8   Údatar(   r)   r   r   r	   Ú__setstate__k   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	   Úgetq   s    zMultiValueDict.getFc                sR   yt ƒ  |¡}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	   r4   ~   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   )r4   )r   r#   r?   r   r   r	   Úgetlist�   s    zMultiValueDict.getlistc                s   t ƒ  ||¡ 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 }|   ||¡ |  |¡S )N)r;   r4   )r   r#   Zdefault_listr   r   r	   Úsetlistdefault¡   s
    zMultiValueDict.setlistdefaultc             C   s   |   |¡ |¡ 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ƒ  ¡ ƒ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   | ¡S )z%Return a shallow copy of this object.)r/   )r   r   r   r	   r/   ¿   s    zMultiValueDict.copyc             O   sÌ   t |ƒdkrtdt |ƒ ƒ‚|r¢|d }t|tƒrZxn| ¡ D ]\}}|  |¡ |¡ q<W nHy*x$| ¡ D ]\}}|  |¡ |¡ qfW W n tk
r    t	dƒ‚Y nX x$| ¡ D ]\}}|  |¡ |¡ q¬W dS )z.Extend rather than replace existing key lists.é   z+update expected at most 1 arguments, got %dr   zCMultiValueDict.update() takes either a MultiValueDict or dictionaryN)
r   Ú	TypeErrorÚ
isinstancer   r+   rG   Úextendr.   rH   Ú
ValueError)r   ÚargsÚkwargsÚ
other_dictr#   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	   r5   ×   s    z'MultiValueDict.dict.<locals>.<dictcomp>r   )r   r   )r   r	   r   Õ   s    zMultiValueDict.dict)r   )N)NF)N)N)N)r   r   r   r   r
   r   r!   r%   r,   r3   r9   r>   rA   r4   rE   r;   rF   rG   rI   r.   r+   rD   r/   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__rT   )ÚclsrT   rO   rP   r   r   r   r	   rV   ç   s    zImmutableList.__new__c             O   s"   t | jtƒr| j‚n
t| jƒ‚d S )N)rL   rT   Ú	ExceptionÚAttributeError)r   ZwargsrP   r   r   r	   Úcomplainì   s    zImmutableList.complainN)r   r   r   r   rV   rZ   Ú__delitem__Z__delslice__Ú__iadd__Ú__imul__r%   Z__setslice__rH   rM   Úinsertr:   r   ÚsortÚreverser   r   r   r	   rS   Ú   s    rS   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 ƒ  |¡ || _|| _d S )N)r   r
   ÚfuncÚprefix)r   r=   rb   rc   )r   r   r	   r
     s    zDictWrapper.__init__c                sF   |  | j¡r$d}|t| jƒd… }nd}tƒ  |¡}|rB|  |¡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.
        TNF)Ú
startswithrc   r   r   r!   rb   )r   r#   Zuse_funcr&   )r   r   r	   r!     s    
zDictWrapper.__getitem__)r   r   r   r   r
   r!   rR   r   r   )r   r	   ra     s   ra   )r/   Úcollectionsr   r   r   r   r   r   rU   rS   ra   r   r   r   r	   Ú<module>   s   " 0(