a
    xd'                     @   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 |p
d| _ d S )N )dictfromkeys)selfiterabler   r   S/var/www/html/Ranjet/env/lib/python3.9/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 r   r   r   r   r   r	   remove   s    zOrderedSet.removec                 C   s&   z|  | W n ty    Y n0 d S r   )r   KeyErrorr   r   r   r	   discard   s    zOrderedSet.discardc                 C   s
   t | jS r   )iterr   r   r   r   r	   __iter__   s    zOrderedSet.__iter__c                 C   s
   || j v S r   r   r   r   r   r	   __contains__   s    zOrderedSet.__contains__c                 C   s
   t | jS r   )boolr   r   r   r   r	   __bool__   s    zOrderedSet.__bool__c                 C   s
   t | jS r   )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 r   )superr
   )r   Zkey_to_list_mapping	__class__r   r	   r
   @   s    zMultiValueDict.__init__c                    s   d| j jt  f S )Nz<%s: %s>)r#   r   r!   __repr__r   r"   r   r	   r$   C   s    zMultiValueDict.__repr__c                    sR   zt  |}W n ty*   t|Y n0 z
|d W S  tyL   g  Y S 0 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  ||g d S r   r!   __setitem__r   r)   valuer"   r   r	   r,   T   s    zMultiValueDict.__setitem__c                 C   s   |  dd |  D S )Nc                 S   s    g | ]\}}||d d  fqS r   r   .0kvr   r   r	   
<listcomp>X   s   z+MultiValueDict.__copy__.<locals>.<listcomp>)r#   listsr   r   r   r	   __copy__W   s    
zMultiValueDict.__copy__c              	   C   sJ   |   }||t| < t| D ]&\}}t|t||t|| q|S r   )r#   idr   itemsr,   copydeepcopy)r   memoresultr)   r.   r   r   r	   __deepcopy__]   s    
zMultiValueDict.__deepcopy__c                    s    i  j d fdd D iS )N_datac                    s   i | ]}|  |qS r   _getlist)r0   r1   r   r   r	   
<dictcomp>f       z/MultiValueDict.__getstate__.<locals>.<dictcomp>)__dict__r   r   r   r	   __getstate__e   s    zMultiValueDict.__getstate__c                 C   s:   | di }| D ]\}}| || q| j| d S )Nr=   )popr7   setlistrB   update)r   Zobj_dictdatar1   r2   r   r   r	   __setstate__h   s    zMultiValueDict.__setstate__Nc                 C   s4   z| | }W n t y"   | Y S 0 |g kr0|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                    sX   zt  |}W n& ty6   |du r.g  Y S | Y S 0 |rP|durLt|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)   rI   
force_listvaluesr"   r   r	   r?   {   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)rM   r>   r   r)   rI   r   r   r	   getlist   s    zMultiValueDict.getlistc                    s   t  || d S r   r+   r(   r"   r   r	   rE      s    zMultiValueDict.setlistc                 C   s   || vr|| |< | | S r   r   rO   r   r   r	   
setdefault   s    zMultiValueDict.setdefaultc                 C   s*   || vr |d u rg }|  || | |S r   )rE   r?   )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)rR   appendr-   r   r   r	   
appendlist   s    zMultiValueDict.appendlistc                 c   s   | D ]}|| | fV  q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	   r7      s    zMultiValueDict.itemsc                    s   t t  S )zYield (key, list) pairs.)r   r!   r7   r   r"   r   r	   r4      s    zMultiValueDict.listsc                 c   s   | D ]}| | V  qdS )z'Yield the last value on every key list.Nr   rU   r   r   r	   rN      s    zMultiValueDict.valuesc                 C   s
   t  | S )z%Return a shallow copy of this object.)r8   r   r   r   r	   r8      s    zMultiValueDict.copyc                 O   s   t |dkrtdt | |r|d }t|trV| D ]\}}| || q:nBz&| D ]\}}| || q`W n ty   t	dY n0 | D ]\}}| || qdS )z.Extend rather than replace existing key lists.   z*update expected at most 1 argument, got %dr   zCMultiValueDict.update() takes either a MultiValueDict or dictionaryN)
r   	TypeError
isinstancer    r4   rR   extendr7   rS   
ValueError)r   argskwargs
other_dictr)   Z
value_listr.   r   r   r	   rF      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   )r0   r)   r   r   r	   r@      rA   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,   r5   r<   rC   rH   rK   r?   rP   rE   rQ   rR   rT   r7   r4   rN   r8   rF   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| g|R i |}||_|S r   )tuple__new__r`   )clsr`   r[   r\   r   r   r   r	   rb      s    zImmutableList.__new__c                 O   s"   t | jtr| jn
t| jd S r   )rX   r`   	ExceptionAttributeError)r   Zwargsr\   r   r   r	   complain   s    zImmutableList.complainN)r   r   r   r   rb   rf   __delitem__Z__delslice____iadd____imul__r,   Z__setslice__rS   rY   insertrD   r   sortreverser   r   r   r	   r_      s    r_   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 r   )r!   r
   funcprefix)r   rG   rn   ro   r"   r   r	   r
     s    zDictWrapper.__init__c                    s@   | | j}|r"|t| jd }t |}|r<| |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)
startswithro   r   r!   r&   rn   )r   r)   Zuse_funcr.   r"   r   r	   r&     s    
zDictWrapper.__getitem__)r   r   r   r   r
   r&   r^   r   r   r"   r	   rm      s   rm   c                 c   s^   t | D ]P\}}t|dkr0td|t|t|d tsNtd|d  t|V  qd S )N   zDdictionary update sequence element #{} has length {}; 2 is required.r   z0Element key %r invalid, only strings are allowed)	enumerater   rZ   formatrX   strra   )rG   ielemr   r   r	   !_destruct_iterable_mapping_values  s    rw   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 | D | _d S )Nc                 S   s   i | ]\}}||qS r   r   r/   r   r   r	   r@   <  rA   z3CaseInsensitiveMapping.__init__.<locals>.<dictcomp>c                 S   s   i | ]\}}|  ||fqS r   lowerr/   r   r   r	   r@   =  rA   )rX   r   rw   r7   _store)r   rG   r   r   r	   r
   :  s    
zCaseInsensitiveMapping.__init__c                 C   s   | j |  d S )NrV   )r{   rz   rU   r   r   r	   r&   ?  s    z"CaseInsensitiveMapping.__getitem__c                 C   s
   t | jS r   )r   r{   r   r   r   r	   r   B  s    zCaseInsensitiveMapping.__len__c                 C   s.   t |to,dd |  D dd | D kS )Nc                 S   s   i | ]\}}|  |qS r   ry   r/   r   r   r	   r@   F  s   z1CaseInsensitiveMapping.__eq__.<locals>.<dictcomp>c                 S   s   i | ]\}}|  |qS r   ry   r/   r   r   r	   r@   H  s   )rX   r   r7   )r   otherr   r   r	   __eq__E  s    zCaseInsensitiveMapping.__eq__c                 C   s   dd | j  D S )Nc                 s   s   | ]\}}|V  qd S r   r   )r0   Zoriginal_keyr.   r   r   r	   	<genexpr>M  rA   z2CaseInsensitiveMapping.__iter__.<locals>.<genexpr>)r{   rN   r   r   r   r	   r   L  s    zCaseInsensitiveMapping.__iter__c                 C   s   t dd | j D S )Nc                 S   s   i | ]\}}||qS r   r   )r0   r)   r.   r   r   r	   r@   P  rA   z3CaseInsensitiveMapping.__repr__.<locals>.<dictcomp>)reprr{   rN   r   r   r   r	   r$   O  s    zCaseInsensitiveMapping.__repr__c                 C   s   | S r   r   r   r   r   r	   r8   R  s    zCaseInsensitiveMapping.copyN)r   r   r   r   r
   r&   r   r}   r   r$   r8   r   r   r   r	   rx   (  s   rx   )r8   collections.abcr   r   r   r   r   r    ra   r_   rm   rw   rx   r   r   r   r	   <module>   s   ! .(