o
    Q`e:                     @   s<  d dl Z d dlZd dlmZ d dlmZ ddlmZmZ e Z	e j
dkr(ejZndd ZG d	d
 d
eZeZdd Zedd gaG dd dZG dd dZG dd deeZG dd deZG dd deeZG dd deZG dd dZG dd dZG dd deejZG d d! d!eejZG d"d# d#eejZdS )$    N)array)abc   )MultiMappingMutableMultiMapping)   	   c                 C      | S N )clsr   r   7lib/python3.10/site-packages/multidict/_multidict_py.pyGenericAlias      r   c                   @   s   e Zd ZdZdZdS )istrzCase insensitive str.TN)__name__
__module____qualname____doc__Z__is_istr__r   r   r   r   r      s    r   c                 C   s   t | ts	td| jjS )Nz&Parameter should be multidict or proxy)
isinstance_Base	TypeError_impl_version)Zmdr   r   r   
getversion   s   
r   Qc                   @   s8   e Zd ZdZdd Zdd Zejjdkrdd Z	d	S d	S )
_Impl)_itemsr   c                 C   s   g | _ |   d S r
   )r   incr_versionselfr   r   r   __init__(   s   z_Impl.__init__c                 C   s"   t }|d  d7  < |d | _ d S Nr   r   )r   )r    vr   r   r   r   ,   s   z_Impl.incr_versionpypyc                 C      t | t| j S r
   )object
__sizeof__sys	getsizeofr   r   r   r   r   r'   4      z_Impl.__sizeof__N)
r   r   r   	__slots__r!   r   r(   implementationnamer'   r   r   r   r   r   %   s    r   c                   @   s   e Zd Zdd ZefddZefdd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dd ZeeZd	S )r   c                 C      |S r
   r   r    keyr   r   r   _title9   r   z_Base._titlec                    sD   |  |  fdd| jjD }|r|S |s|tur|S td| )z-Return a list of all values matching the key.c                    s   g | ]\}}}| kr|qS r   r   ).0ikr#   identityr   r   
<listcomp>?   s    z _Base.getall.<locals>.<listcomp>Key not found: %rr1   r   r   _markerKeyError)r    r0   defaultresr   r5   r   getall<   s   
z_Base.getallc                 C   sF   |  |}| jjD ]\}}}||kr|  S q	|tur|S td| )zwGet first value matching the key.

        Raises KeyError if the key is not found and no default is provided.
        r8   r9   r    r0   r<   r6   r3   r4   r#   r   r   r   getoneF   s   
z_Base.getonec                 C   s
   |  |S r
   r@   r/   r   r   r   __getitem__U      
z_Base.__getitem__Nc                 C   s   |  ||S )zGet first value matching the key.

        If the key is not found, returns the default (or None if no default is provided)
        rA   )r    r0   r<   r   r   r   getX   s   z	_Base.getc                 C      t |  S r
   )iterkeysr   r   r   r   __iter___      z_Base.__iter__c                 C      t | jjS r
   lenr   r   r   r   r   r   __len__b   rI   z_Base.__len__c                 C   
   t | jS )z+Return a new view of the dictionary's keys.)	_KeysViewr   r   r   r   r   rG   e      
z
_Base.keysc                 C   rN   )zAReturn a new view of the dictionary's items *(key, value) pairs).)
_ItemsViewr   r   r   r   r   itemsi   rP   z_Base.itemsc                 C   rN   )z-Return a new view of the dictionary's values.)_ValuesViewr   r   r   r   r   valuesm   rP   z_Base.valuesc                 C   s   t |tjstS t |tr<| jj}|jj}t|t|krdS t||D ]\\}}}\}}}||ks6||kr9 dS q$dS t| jjt|krHdS | 	 D ]\}	}
|
|	t}|
|kr] dS qLdS )NFT)r   r   MappingNotImplementedr   r   r   rL   ziprR   rD   r:   )r    otherZlftZrhtZi1Zk2Zv1Zi2Zv2r4   r#   Znvr   r   r   __eq__q   s(   
z_Base.__eq__c                 C   s0   |  |}| jjD ]\}}}||kr dS q	dS )NTF)r1   r   r   )r    r0   r6   r3   r4   r#   r   r   r   __contains__   s   
z_Base.__contains__c                 C   s(   d dd |  D }d| jj|S )N, c                 s   s     | ]\}}d  ||V  qdS )z
'{}': {!r}N)format)r2   r4   r#   r   r   r   	<genexpr>   s    z!_Base.__repr__.<locals>.<genexpr>z<{}({})>)joinrR   r\   	__class__r   )r    bodyr   r   r   __repr__   s   z_Base.__repr__r
   )r   r   r   r1   r:   r>   r@   rB   rD   rH   rM   rG   rR   rT   rY   rZ   ra   classmethodr   __class_getitem__r   r   r   r   r   8   s    

r   c                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	MultiDictProxyz'Read-only proxy for MultiDict instance.c                 C   ,   t |ttfstdt||j| _d S )Nz:ctor requires MultiDict or MultiDictProxy instance, not {})r   	MultiDictre   r   r\   typer   r    argr   r   r   r!         
zMultiDictProxy.__init__c                 C   s   t d| jj)Nzcan't pickle {} objects)r   r\   r_   r   r   r   r   r   
__reduce__   s   zMultiDictProxy.__reduce__c                 C   rE   zReturn a copy of itself.)rg   rR   r   r   r   r   copy      zMultiDictProxy.copyN)r   r   r   r   r!   rl   rn   r   r   r   r   re      
    	re   c                   @   rd   )	CIMultiDictProxyz)Read-only proxy for CIMultiDict instance.c                 C   rf   )Nz>ctor requires CIMultiDict or CIMultiDictProxy instance, not {})r   CIMultiDictrq   r   r\   rh   r   ri   r   r   r   r!      rk   zCIMultiDictProxy.__init__c                 C      |  S r
   titler/   r   r   r   r1         zCIMultiDictProxy._titlec                 C   rE   rm   )rr   rR   r   r   r   r   rn      ro   zCIMultiDictProxy.copyN)r   r   r   r   r!   r1   rn   r   r   r   r   rq      rp   rq   c                   @   s   e Zd ZdZdd Zejjdkrdd Zdd Z	d	d
 Z
dd Zdd Zdd ZeZdd Zdd Zdd Zdd Zdd Zdd Zd,ddZefd d!ZeZefd"d#Zd$d% Zd&d' Zd(d) Zd*d+ ZdS )-rg   z/Dictionary with the support for duplicate keys.c                 O   s"   t  | _| ||| jj| j d S r
   )r   r   _extendr_   r   _extend_itemsr    argskwargsr   r   r   r!      s   zMultiDict.__init__r$   c                 C   r%   r
   )r&   r'   r(   r)   r   r   r   r   r   r'      r*   zMultiDict.__sizeof__c                 C   s   | j t|  ffS r
   )r_   listrR   r   r   r   r   rl      s   zMultiDict.__reduce__c                 C   r.   r
   r   r/   r   r   r   r1      r   zMultiDict._titlec                 C   s   t |tr|S td)Nz8MultiDict keys should be either str or subclasses of str)r   strr   r/   r   r   r   _key   s
   
zMultiDict._keyc                 C   s2   |  |}| jj|| ||f | j  d S r
   )r1   r   r   appendr~   r   )r    r0   valuer6   r   r   r   add   s   
zMultiDict.addc                 C   s   | j }||  S rm   )r_   rR   )r    r   r   r   r   rn      s   zMultiDict.copyc                 O      |  ||d| j dS )zhExtend current MultiDict with more values.

        This method must be used instead of update.
        extendN)rw   rx   ry   r   r   r   r      s   zMultiDict.extendc                    s   t |dkrtd|t ||rl|d }t|d ttfr&|s&|jj}n@t|dr/|	 }|r>t
|}|t
|	  g }|D ]#}t |dksQtd|| |d  |d |d f qB|| d S | fdd|	 D  d S )	Nr   z1{} takes at most 1 positional argument ({} given)r   rR      z3{} takes either dict or list of (key, value) tuplesc                    s&   g | ]\}}  | ||fqS r   )r1   r~   )r2   r0   r   r   r   r   r7     s    z%MultiDict._extend.<locals>.<listcomp>)rL   r   r\   r   rg   re   r   r   hasattrrR   r|   r   r   r1   r~   )r    rz   r{   r-   methodrj   rR   itemr   r   r   rw      s8   

*
zMultiDict._extendc                 C   s    |D ]\}}}|  || qd S r
   )r   )r    rR   r6   r0   r   r   r   r   rx     s   zMultiDict._extend_itemsc                 C   s   | j j  | j   dS )z Remove all items from MultiDict.N)r   r   clearr   r   r   r   r   r     s   zMultiDict.clearc                 C   s   |  || d S r
   )_replace)r    r0   r   r   r   r   __setitem__  s   zMultiDict.__setitem__c                 C   sd   |  |}| jj}d}tt|d ddD ]}|| d |kr$||= d}q|s+t|| j  d S )NFr   r   T)r1   r   r   rangerL   r;   r   )r    r0   r6   rR   foundr3   r   r   r   __delitem__  s   
zMultiDict.__delitem__Nc                 C   s>   |  |}| jjD ]\}}}||kr|  S q	| || |S )zAReturn value for key, set value to default if key is not present.)r1   r   r   r   r?   r   r   r   
setdefault&  s   
zMultiDict.setdefaultc                 C   st   |  |}tt| jjD ]"}| jj| d |kr/| jj| d }| jj|= | j  |  S q|tu r8t||S )zRemove specified key and return the corresponding value.

        If key is not found, d is returned if given, otherwise
        KeyError is raised.

        r   r   )r1   r   rL   r   r   r   r:   r;   )r    r0   r<   r6   r3   r   r   r   r   popone/  s   


zMultiDict.poponec                 C   s   d}|  |}g }tt| jjd ddD ]!}| jj| }|d |kr6||d  | jj|= | j  d}q|sC|tu rAt||S |	  |S )zRemove all occurrences of key and return the list of corresponding
        values.

        If key is not found, default is returned if given, otherwise
        KeyError is raised.

        Fr   r   r   r   T)
r1   r   rL   r   r   r   r   r:   r;   reverse)r    r0   r<   r   r6   retr3   r   r   r   r   popallD  s"   


zMultiDict.popallc                 C   s8   | j jr| j jd}| j   |d |d fS td)z1Remove and return an arbitrary (key, value) pair.r   r   r   zempty multidict)r   r   popr   r;   )r    r3   r   r   r   popitem_  s
   
zMultiDict.popitemc                 O   r   )z>Update the dictionary from *other*, overwriting existing keys.updateN)rw   _update_itemsry   r   r   r   r   h  s   zMultiDict.updatec           
      C   s  |sd S i }|D ]F\}}}| |d}t|t| jjD ]}| jj| }|d |kr;|d ||< |||f| jj|<  nq| jj|||f t| jj||< qd}|t| jjk r| jj| }|d }| |}	|	d u rq|d7 }qQ||	kr{| jj|= n|d7 }|t| jjk sY| j  d S r"   )rD   r   rL   r   r   r   r   )
r    rR   Z	used_keysr6   r0   r   startr3   r   posr   r   r   r   l  s8   
zMultiDict._update_itemsc                 C   s   |  |}| |}| jj}tt|D ]}|| }|d |kr0|||f||< |}| j   nq| jj|||f | j  d S |d }|t|k rf|| }|d |krZ||= n|d7 }|t|k sLd S d S r"   )r~   r1   r   r   r   rL   r   r   )r    r0   r   r6   rR   r3   r   Zrgtr   r   r   r     s*   



zMultiDict._replacer
   )r   r   r   r   r!   r(   r,   r-   r'   rl   r1   r~   r   rn   __copy__r   rw   rx   r   r   r   r   r:   r   r   r   r   r   r   r   r   r   r   r   rg      s2    "
		 rg   c                   @   s   e Zd ZdZdd ZdS )rr   z@Dictionary with the support for duplicate case-insensitive keys.c                 C   rs   r
   rt   r/   r   r   r   r1     rv   zCIMultiDict._titleN)r   r   r   r   r1   r   r   r   r   rr     s    rr   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )_Iter_size_iterc                 C   s   || _ || _d S r
   r   )r    sizeiteratorr   r   r   r!     s   
z_Iter.__init__c                 C   r	   r
   r   r   r   r   r   rH     r   z_Iter.__iter__c                 C   rN   r
   )nextr   r   r   r   r   __next__  rC   z_Iter.__next__c                 C   s   | j S r
   )r   r   r   r   r   __length_hint__  s   z_Iter.__length_hint__N)r   r   r   r+   r!   rH   r   r   r   r   r   r   r     s    r   c                   @   s   e Zd Zdd Zdd ZdS )	_ViewBasec                 C   s
   || _ d S r
   )r   )r    implr   r   r   r!     rC   z_ViewBase.__init__c                 C   rJ   r
   rK   r   r   r   r   rM     rI   z_ViewBase.__len__N)r   r   r   r!   rM   r   r   r   r   r     s    r   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
rQ   c                 C   s^   t |tst |tsJ t|dksJ | jjD ]\}}}|d |kr,|d |kr, dS qdS )Nr   r   r   TF)r   tupler|   rL   r   r   )r    r   r3   r4   r#   r   r   r   rZ     s   z_ItemsView.__contains__c                 C      t t| | | jjS r
   r   rL   r   r   r   r   r   r   r   rH        z_ItemsView.__iter__c                 c   s8    | j jD ]\}}}|| j jkrtd||fV  qd S )N#Dictionary changed during iterationr   r   r   RuntimeError)r    versionr3   r4   r#   r   r   r   r     s   z_ItemsView._iterc                 C   sF   g }| j jD ]}|d|d |d  qd|}d| jj|S )Nz
{!r}: {!r}r   r   r[   {}({})r   r   r   r\   r^   r_   r   r    Zlstr   r`   r   r   r   ra     s
   
z_ItemsView.__repr__Nr   r   r   rZ   rH   r   ra   r   r   r   r   rQ     s
    rQ   c                   @   r   )
rS   c                 C   $   | j jD ]}|d |kr dS qdS )Nr   TFr   r   )r    r   r   r   r   r   rZ     
   z_ValuesView.__contains__c                 C   r   r
   r   r   r   r   r   rH     r   z_ValuesView.__iter__c                 c   2    | j jD ]}|| j jkrtd|d V  qd S )Nr   r   r   r    r   r   r   r   r   r        z_ValuesView._iterc                 C   @   g }| j jD ]}|d|d  qd|}d| jj|S )N{!r}r   r[   r   r   r   r   r   r   ra     
   
z_ValuesView.__repr__Nr   r   r   r   r   rS     
    rS   c                   @   r   )
rO   c                 C   r   )Nr   TFr   )r    r0   r   r   r   r   rZ     r   z_KeysView.__contains__c                 C   r   r
   r   r   r   r   r   rH     r   z_KeysView.__iter__c                 c   r   )Nr   r   r   r   r   r   r   r     r   z_KeysView._iterc                 C   r   )Nr   r   r[   r   r   r   r   r   r   ra   
  r   z_KeysView.__repr__Nr   r   r   r   r   rO     r   rO   )r(   typesr   collectionsr   _abcr   r   r&   r:   version_infor   r}   r   Zupstrr   r   r   r   re   rq   rg   rr   r   r   	ItemsViewrQ   
ValuesViewrS   KeysViewrO   r   r   r   r   <module>   s2    
[ n