a
    Lcòf.(  ã                   @   sv   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
G dd„ deƒZdS )é    N)ÚMappingc                   @   sb   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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   úX/home/httpd/docs/test/DocsMgr/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
   t | jƒS r   )Úreversedr   r   r   r   r	   Ú__reversed__   s    zOrderedSet.__reversed__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__c                 C   s,   | j rtt| j ƒƒnd}| jj› d|› d�S )NÚ ú(ú))r   ÚreprÚlistÚ	__class__Ú__qualname__©r   Údatar   r   r	   Ú__repr__(   s    zOrderedSet.__repr__)N)Ú__name__Ú
__module__r#   Ú__doc__r
   r   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©r"   r   r	   r
   H   s    zMultiValueDict.__init__c                    s   d| j jtƒ  ¡ f S )Nz<%s: %s>)r"   r'   r,   r&   r   r-   r   r	   r&   K   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/   N   s    
zMultiValueDict.__getitem__c                    s   t ƒ  ||g¡ d S r   ©r,   Ú__setitem__©r   r2   Úvaluer-   r   r	   r5   \   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>`   ó    z+MultiValueDict.__copy__.<locals>.<listcomp>)r"   Úlistsr   r   r   r	   Ú__copy___   s    zMultiValueDict.__copy__c              	   C   sJ   |   ¡ }||t| ƒ< t | ¡D ]&\}}t |t ||¡t ||¡¡ q|S r   )r"   Úidr   Úitemsr5   ÚcopyÚdeepcopy)r   ÚmemoÚresultr2   r7   r   r   r	   Ú__deepcopy__b   s    ÿzMultiValueDict.__deepcopy__c                    s    i ˆ j ¥d‡ fdd„ˆ D ƒi¥S )NÚ_datac                    s   i | ]}|ˆ   |¡“qS r   ©Ú_getlist)r9   r:   r   r   r	   Ú
<dictcomp>l   r=   z/MultiValueDict.__getstate__.<locals>.<dictcomp>)Ú__dict__r   r   r   r	   Ú__getstate__k   s    zMultiValueDict.__getstate__c                 C   s:   |  di ¡}| ¡ D ]\}}|  ||¡ q| j |¡ d S )NrG   )ÚpoprA   ÚsetlistrK   Úupdate)r   Zobj_dictr%   r:   r;   r   r   r	   Ú__setstate__n   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   r2   ÚdefaultÚvalr   r   r	   Úgett   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   r!   )r   r2   rQ   Ú
force_listÚvaluesr-   r   r	   rI   �   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)rT   rH   ©r   r2   rQ   r   r   r	   Úgetlist“   s    zMultiValueDict.getlistc                    s   t ƒ  ||¡ d S r   r4   r1   r-   r   r	   rN   š   s    zMultiValueDict.setlistc                 C   s   || vr|| |< | | S r   r   rV   r   r   r	   Ú
setdefault�   s    zMultiValueDict.setdefaultc                 C   s*   || vr |d u rg }|   ||¡ |  |¡S r   )rN   rI   )r   r2   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)rY   Úappendr6   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   r2   r   r   r	   rA   ±   s    zMultiValueDict.itemsc                    s   t tƒ  ¡ ƒS )zYield (key, list) pairs.)r   r,   rA   r   r-   r   r	   r>   ¹   s    zMultiValueDict.listsc                 c   s   | D ]}| | V  qdS )z'Yield the last value on every key list.Nr   r\   r   r   r	   rU   ½   s    zMultiValueDict.valuesc                 C   s
   t   | ¡S )z%Return a shallow copy of this object.)rB   r   r   r   r	   rB   Â   s    zMultiValueDict.copyc                 O   s¬   t |ƒdkrtdt |ƒ ƒ‚|r†|d }t|tƒrV| ¡ D ]\}}|  |¡ |¡ q:n0t|tƒrh| ¡ }|D ]\}}|  |¡ 	|¡ ql| ¡ D ]\}}|  |¡ 	|¡ qŽdS )z.Extend rather than replace existing key lists.é   z*update expected at most 1 argument, got %dr   N)
r   Ú	TypeErrorÚ
isinstancer+   r>   rY   Úextendr   rA   rZ   )r   ÚargsÚkwargsÚargr2   Z
value_listr7   r   r   r	   rO   Æ   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   )r9   r2   r   r   r	   rJ   Ù   r=   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/   r5   r?   rF   rL   rP   rS   rI   rW   rN   rX   rY   r[   rA   r>   rU   rB   rO   r   Ú__classcell__r   r   r-   r	   r+   1   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__rf   )Úclsrf   ra   rb   r   r   r   r	   rh   é   s    zImmutableList.__new__c                 O   s   t | jƒ‚d S r   )ÚAttributeErrorrf   )r   ra   rb   r   r   r	   Úcomplainî   s    zImmutableList.complainN)r'   r(   r#   r)   rh   rk   Ú__delitem__Z__delslice__Ú__iadd__Ú__imul__r5   Z__setslice__rZ   r`   ÚinsertrM   r   ÚsortÚreverser   r   r   r	   re   Ü   s    re   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   r%   rs   rt   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)Ú
startswithrt   r   r,   r/   rs   )r   r2   Zuse_funcr7   r-   r   r	   r/     s    
zDictWrapper.__getitem__)r'   r(   r#   r)   r
   r/   rd   r   r   r-   r	   rr     s   	rr   c                   @   sT   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
e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   s   dd„ |   |¡D ƒ| _d S )Nc                 S   s   i | ]\}}|  ¡ ||f“qS r   ©Úlowerr8   r   r   r	   rJ   2  r=   z3CaseInsensitiveMapping.__init__.<locals>.<dictcomp>)Ú_unpack_itemsÚ_storer$   r   r   r	   r
   1  s    zCaseInsensitiveMapping.__init__c                 C   s   | j | ¡  d S )Nr]   )rz   rx   r\   r   r   r	   r/   4  s    z"CaseInsensitiveMapping.__getitem__c                 C   s
   t | jƒS r   )r   rz   r   r   r   r	   r   7  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   rw   r8   r   r   r	   rJ   ;  s   z1CaseInsensitiveMapping.__eq__.<locals>.<dictcomp>c                 S   s   i | ]\}}|  ¡ |“qS r   rw   r8   r   r   r	   rJ   =  r=   )r_   r   rA   )r   Úotherr   r   r	   Ú__eq__:  s
    ÿþzCaseInsensitiveMapping.__eq__c                 C   s   dd„ | j  ¡ D ƒS )Nc                 s   s   | ]\}}|V  qd S r   r   )r9   Zoriginal_keyr7   r   r   r	   Ú	<genexpr>@  r=   z2CaseInsensitiveMapping.__iter__.<locals>.<genexpr>)rz   rU   r   r   r   r	   r   ?  s    zCaseInsensitiveMapping.__iter__c                 C   s   t dd„ | j ¡ D ƒƒS )Nc                 S   s   i | ]\}}||“qS r   r   )r9   r2   r7   r   r   r	   rJ   C  r=   z3CaseInsensitiveMapping.__repr__.<locals>.<dictcomp>)r    rz   rU   r   r   r   r	   r&   B  s    zCaseInsensitiveMapping.__repr__c                 C   s   | S r   r   r   r   r   r	   rB   E  s    zCaseInsensitiveMapping.copyc                 c   sz   t | ttfƒr |  ¡ E d H  d S t| ƒD ]L\}}t|ƒdkrPtd |t|ƒ¡ƒ‚t |d tƒsntd|d  ƒ‚|V  q(d S )Né   zDdictionary update sequence element #{} has length {}; 2 is required.r   z0Element key %r invalid, only strings are allowed)	r_   r   r   rA   Ú	enumerater   Ú
ValueErrorÚformatÚstr)r%   ÚiÚelemr   r   r	   ry   H  s    ÿÿ
ÿz$CaseInsensitiveMapping._unpack_itemsN)r'   r(   r#   r)   r
   r/   r   r|   r   r&   rB   Ústaticmethodry   r   r   r   r	   rv     s   rv   )rB   Úcollections.abcr   r   r   r*   r   r+   rg   re   rr   rv   r   r   r   r	   Ú<module>   s   ( ,%