B
    `y6                 @   s   d Z ddlZddlZddlmZmZmZmZmZ ddddgZ	G dd deZ
e ZG d	d de
ZG d
d de
ZG dd deZdd ZdS )zI
Gives a multi-value dictionary object (MultiDict) plus several wrappers
    N)MutableMappingPY2
iteritems_itervalues_
url_encode	MultiDictNestedMultiDictNoVarsGetDictc               @   s  e Zd ZdZdd Zedd Ze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eZdd Zdd Zd9dd Zd!d" Zd#d$ Zd%d& Zd:d'd(Zd)d* Zd+d, Zd-d. Zerd/d0 ZneZeZd1d2 Zerd3d4 Z neZ d5d6 Z!erd7d8 Z"ne!Z"dS );r   z
        An ordered dictionary that can have multiple values for each key.
        Adds the methods getall, getone, mixed and extend and add to the normal
        dictionary interface.
    c             O   s   t |dkrtd|rlt|d dr8t|d  }n,t|d drXt|d  }nt|d }|| _ng | _|r| j|  d S )N   z9MultiDict can only be called with one positional argumentr   	iteritemsitems)len	TypeErrorhasattrlistr   r   _itemsextend)selfargskwr    r   W/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/webob/multidict.py__init__   s    zMultiDict.__init__c             C   s,   t |tstd| j|f |  }||_|S )z@
        Create a dict that is a view on the given list
        z8%s.view_list(obj) takes only actual list objects, not %r)
isinstancer   r   __name__r   )clslstobjr   r   r   	view_list,   s    
zMultiDict.view_listc                s   |  }x|j pdD ]}|jdd |jdd}tjtjd}tsd dkrVdd }qp fd	d}n fd
d}|jr||j|_|	|j
| q|j}||krts|d}|| |}ts|d}|	|j
|| qW |S )z@
        Create a dict from a cgi.FieldStorage instance
        r   charsetutf8zContent-Transfer-EncodingN)base64zquoted-printablec             S   s   | S )Nr   )br   r   r   <lambda>I       z-MultiDict.from_fieldstorage.<locals>.<lambda>c                s   |  d S )Nr!   )encodedecode)r#   )r    r   r   r$   K   r%   c                s
   |   S )N)r'   )r#   )r    r   r   r$   M   r%   )r   type_optionsgetheadersbinascii
a2b_base64a2b_qpr   filenameaddnamevaluer&   r'   )r   fsr   fieldZtransfer_encodingZsupported_transfer_encodingr'   r1   r   )r    r   from_fieldstorage9   s.    



zMultiDict.from_fieldstoragec             C   s0   x"t | jD ]\}}||kr|S qW t|d S )N)reversedr   KeyError)r   keykvr   r   r   __getitem__^   s    zMultiDict.__getitem__c             C   s4   y
| |= W n t k
r   Y nX | j||f d S )N)r6   r   append)r   r7   r1   r   r   r   __setitem__d   s
    
zMultiDict.__setitem__c             C   s   | j ||f dS )zL
        Add the key and value, not overwriting any previous value.
        N)r   r;   )r   r7   r1   r   r   r   r/   k   s    zMultiDict.addc                s    fdd| j D S )zU
        Return a list of all values matching the key (may be an empty list)
        c                s   g | ]\}}| kr|qS r   r   ).0r8   r9   )r7   r   r   
<listcomp>u   s    z$MultiDict.getall.<locals>.<listcomp>)r   )r   r7   r   )r7   r   getallq   s    zMultiDict.getallc             C   s>   |  |}|std| t|dkr6td||f |d S )zk
        Get one value matching the key, raising a KeyError if multiple
        values were found.
        zKey not found: %rr   zMultiple values match %r: %rr   )r?   r6   r   )r   r7   r9   r   r   r   getonew   s    
zMultiDict.getonec             C   sd   i }i }xV|   D ]J\}}||krT||kr:|| | q\|| |g||< d||< q|||< qW |S )a$  
        Returns a dictionary where the values are either single
        values, or a list of values when a key/value appears more than
        once in this dictionary.  This is similar to the kind of
        dictionary often used to represent the variables in a web
        request.
        N)r   r;   )r   resultZmultir7   r1   r   r   r   mixed   s    
zMultiDict.mixedc             C   s0   i }x&|   D ]\}}||g | qW |S )zZ
        Returns a dictionary where each key is associated with a list of values.
        )r   
setdefaultr;   )r   rr7   valr   r   r   dict_of_lists   s    zMultiDict.dict_of_listsc             C   sR   | j }d}x6tt|d ddD ]}|| d |kr ||= d}q W |sNt|d S )NFr   r   T)r   ranger   r6   )r   r7   r   foundir   r   r   __delitem__   s    zMultiDict.__delitem__c             C   s$   x| j D ]\}}||krdS qW dS )NTF)r   )r   r7   r8   r9   r   r   r   __contains__   s    zMultiDict.__contains__c             C   s   | j d d = d S )N)r   )r   r   r   r   clear   s    zMultiDict.clearc             C   s
   |  | S )N)	__class__)r   r   r   r   copy   s    zMultiDict.copyNc             C   s4   x| j D ]\}}||kr|S qW | j ||f |S )N)r   r;   )r   r7   defaultr8   r9   r   r   r   rC      s
    zMultiDict.setdefaultc             G   s   t |dkr$tdtdt |  xBtt | jD ]0}| j| d |kr4| j| d }| j|= |S q4W |rt|d S t|d S )Nr   z(pop expected at most 2 arguments, got %sr   )r   r   reprrH   r   r6   )r   r7   r   rJ   r9   r   r   r   pop   s    zMultiDict.popc             C   s
   | j  S )N)r   rR   )r   r   r   r   popitem   s    zMultiDict.popitemc             O   sJ   |r4|d }t |t t|kr4d}tj|tdd tj| f|| d S )Nr   zbBehavior of MultiDict.update() has changed and overwrites duplicate keys. Consider using .extend()   )
stacklevel)r   dictwarningswarnUserWarningr   update)r   r   r   r   msgr   r   r   rZ      s    zMultiDict.updatec             K   s   |d kr
npt |dr&| j|  nTt |drXxH| D ]}| j||| f q:W n"x |D ]\}}| j||f q^W |r| | d S )Nr   keys)r   r   r   r   r\   r;   rZ   )r   otherkwargsr8   r9   r   r   r   r      s    

zMultiDict.extendc             C   s*   t djt|  }d| jjd|f S )Nz(%r, %r)z%s([%s])z, )map__mod___hide_passwdr   rN   r   join)r   r   r   r   r   __repr__   s    zMultiDict.__repr__c             C   s
   t | jS )N)r   r   )r   r   r   r   __len__   s    zMultiDict.__len__c             c   s   x| j D ]\}}|V  qW d S )N)r   )r   r8   r9   r   r   r   iterkeys   s    zMultiDict.iterkeysc             C   s   dd | j D S )Nc             S   s   g | ]\}}|qS r   r   )r=   r8   r9   r   r   r   r>      s    z"MultiDict.keys.<locals>.<listcomp>)r   )r   r   r   r   r\      s    zMultiDict.keysc             C   s
   t | jS )N)iterr   )r   r   r   r   r     s    zMultiDict.iteritemsc             C   s   | j d d  S )N)r   )r   r   r   r   r     s    zMultiDict.itemsc             c   s   x| j D ]\}}|V  qW d S )N)r   )r   r8   r9   r   r   r   
itervalues  s    zMultiDict.itervaluesc             C   s   dd | j D S )Nc             S   s   g | ]\}}|qS r   r   )r=   r8   r9   r   r   r   r>     s    z$MultiDict.values.<locals>.<listcomp>)r   )r   r   r   r   values  s    zMultiDict.values)N)N)#r   
__module____qualname____doc__r   classmethodr   r4   r:   r<   r/   r?   r@   rB   rF   rK   rL   has_keyrM   rO   rC   rR   rS   rZ   r   rc   rd   re   r   r\   __iter__r   r   rg   rh   r   r   r   r   r      sH   %	





c               @   sv   e Zd Zdd Zdd Zdd Zdd Z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S )r
   c             C   s   || _ t| | d S )N)envr   r   )r   dataro   r   r   r   r     s    zGetDict.__init__c                sB   dd   fdd|   D }t|}|| jd< | |f| jd< d S )Nc             S   s
   |  dS )Nr!   )r&   )tr   r   r   r$      r%   z#GetDict.on_change.<locals>.<lambda>c                s    g | ]\}} | |fqS r   r   )r=   r8   r9   )er   r   r>   !  s    z%GetDict.on_change.<locals>.<listcomp>QUERY_STRINGzwebob._parsed_query_vars)r   r   ro   )r   rp   qsr   )rr   r   	on_change  s
    
zGetDict.on_changec             C   s   t | || |   d S )N)r   r<   ru   )r   r7   r1   r   r   r   r<   %  s    zGetDict.__setitem__c             C   s   t | || |   d S )N)r   r/   ru   )r   r7   r1   r   r   r   r/   (  s    zGetDict.addc             C   s   t | | |   d S )N)r   rK   ru   )r   r7   r   r   r   rK   +  s    zGetDict.__delitem__c             C   s   t |  |   d S )N)r   rM   ru   )r   r   r   r   rM   .  s    
zGetDict.clearNc             C   s   t | ||}|   |S )N)r   rC   ru   )r   r7   rP   rA   r   r   r   rC   1  s    zGetDict.setdefaultc             G   s   t j| |f| }|   |S )N)r   rR   ru   )r   r7   r   rA   r   r   r   rR   5  s    zGetDict.popc             C   s   t | }|   |S )N)r   rS   ru   )r   rA   r   r   r   rS   9  s    
zGetDict.popitemc             O   s   t j| f|| |   d S )N)r   rZ   ru   )r   r   r^   r   r   r   rZ   =  s    zGetDict.updatec             O   s   t j| f|| |   d S )N)r   r   ru   )r   r   r^   r   r   r   r   @  s    zGetDict.extendc             C   s"   t djt|  }dd| S )Nz(%r, %r)z	GET([%s])z, )r_   r`   ra   r   rb   )r   r   r   r   r   rc   C  s    zGetDict.__repr__c             C   s   t | S )N)r   )r   r   r   r   rO   G  s    zGetDict.copy)N)r   ri   rj   r   ru   r<   r/   rK   rM   rC   rR   rS   rZ   r   rc   rO   r   r   r   r   r
     s   
c               @   s   e Zd ZdZdd Zdd Zdd ZeZeZeZ	eZ
eZeZeZeZdd	 Zd
d Zdd ZeZdd Zdd Zdd Zerdd ZneZdd Zerdd ZneZdd ZeZerdd ZneZdS )r   zM
    Wraps several MultiDict objects, treating it as one large MultiDict
    c             G   s
   || _ d S )N)dicts)r   rv   r   r   r   r   P  s    zNestedMultiDict.__init__c             C   s4   x&| j D ]}||t}|tk	r|S qW t|d S )N)rv   r)   _dummyr6   )r   r7   dr1   r   r   r   r:   S  s
    zNestedMultiDict.__getitem__c             O   s   t dd S )Nz%NestedMultiDict objects are read-only)r6   )r   r   r   r   r   r   	_readonlyZ  s    zNestedMultiDict._readonlyc             C   s(   g }x| j D ]}||| qW |S )N)rv   r   r?   )r   r7   rA   rx   r   r   r   r?   e  s    zNestedMultiDict.getallc             C   s   t | S )N)r   )r   r   r   r   rO   p  s    zNestedMultiDict.copyc             C   s    x| j D ]}||krdS qW dS )NTF)rv   )r   r7   rx   r   r   r   rL   s  s    zNestedMultiDict.__contains__c             C   s$   d}x| j D ]}|t|7 }qW |S )Nr   )rv   r   )r   r9   rx   r   r   r   rd   {  s    zNestedMultiDict.__len__c             C   s   x| j D ]}|rdS qW dS )NTF)rv   )r   rx   r   r   r   __nonzero__  s    zNestedMultiDict.__nonzero__c             c   s,   x&| j D ]}xt|D ]
}|V  qW qW d S )N)rv   r   )r   rx   itemr   r   r   r     s    zNestedMultiDict.iteritemsc             C   s   t |  S )N)r   r   )r   r   r   r   r     s    zNestedMultiDict.itemsc             c   s,   x&| j D ]}xt|D ]
}|V  qW qW d S )N)rv   r   )r   rx   r1   r   r   r   rg     s    zNestedMultiDict.itervaluesc             C   s   t |  S )N)r   rg   )r   r   r   r   rh     s    zNestedMultiDict.valuesc             c   s(   x"| j D ]}x|D ]
}|V  qW qW d S )N)rv   )r   rx   r7   r   r   r   rn     s    
zNestedMultiDict.__iter__c             C   s   t |  S )N)r   re   )r   r   r   r   r\     s    zNestedMultiDict.keysN)r   ri   rj   rk   r   r:   ry   r<   r/   rK   rM   rC   rR   rS   rZ   r?   rO   rL   rm   rd   rz   r   r   r   rg   rh   rn   re   r\   r   r   r   r   r   K  s>   


c               @   s   e Zd ZdZd!ddZdd Zdd ZeZeZeZ	d	d
 Z
e
Ze
Ze
Zd"ddZdd Zdd Zdd ZeZdd ZeZdd Zdd Zdd Zdd Zerdd Zdd  ZeZeZeZeZneZeZeZeZ dS )#r	   zd
    Represents no variables; used when no variables
    are applicable.

    This is read-only
    Nc             C   s   |pd| _ d S )NzN/A)reason)r   r|   r   r   r   r     s    zNoVars.__init__c             C   s   t d|| jf d S )NzNo key %r: %s)r6   r|   )r   r7   r   r   r   r:     s    zNoVars.__getitem__c             O   s   t d| j d S )NzCannot add variables: %s)r6   r|   )r   r   r   r   r   r   r<     s    zNoVars.__setitem__c             O   s   t d| j d S )NzNo keys to delete: %s)r6   r|   )r   r   r   r   r   r   rK     s    zNoVars.__delitem__c             C   s   |S )Nr   )r   r7   rP   r   r   r   r)     s    z
NoVars.getc             C   s   g S )Nr   )r   r7   r   r   r   r?     s    zNoVars.getallc             C   s   | | S )Nr   )r   r7   r   r   r   r@     s    zNoVars.getonec             C   s   i S )Nr   )r   r   r   r   rB     s    zNoVars.mixedc             C   s   dS )NFr   )r   r7   r   r   r   rL     s    zNoVars.__contains__c             C   s   | S )Nr   )r   r   r   r   rO     s    zNoVars.copyc             C   s   d| j j| jf S )Nz<%s: %s>)rN   r   r|   )r   r   r   r   rc     s    zNoVars.__repr__c             C   s   dS )Nr   r   )r   r   r   r   rd     s    zNoVars.__len__c             C   s   t g S )N)rf   )r   r   r   r   re     s    zNoVars.iterkeysc             C   s
   t i |S )N)cmp)r   r]   r   r   r   __cmp__  s    zNoVars.__cmp__c             C   s   g S )Nr   )r   r   r   r   r\     s    zNoVars.keys)N)N)!r   ri   rj   rk   r   r:   r<   r/   rC   rZ   rK   rM   rR   rS   r)   r?   r@   rB   rF   rL   rm   rO   rc   rd   re   r   r~   r\   r   rh   rg   r   rn   r   r   r   r   r	     sB   

c             c   sD   x>| D ]6\}}d|ks&d|ks&d|kr2|dfV  q||fV  qW d S )Npasswordpasswdpwdz******r   )r   r8   r9   r   r   r   ra     s    ra   )rk   r+   rW   Zwebob.compatr   r   r   r   r   __all__r   objectrw   r
   r   r	   ra   r   r   r   r   <module>   s     3]J