ó
ú2ec           @   sÊ   d  d l  Z  d  d l Z d  d l Z d  d l Z y d  d l m Z Wn! e k
 rg d  d l m Z n Xd e f d „  ƒ  YZ	 d e f d „  ƒ  YZ
 i d d	 6Z e d
 k rÆ d  d l Z e j ƒ  n  d S(   iÿÿÿÿN(   t   MutableMapping(   t	   DictMixint	   MultiDictc           B   sø   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z e Z d „  Z d „  Z d d „ Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z e Z d „  Z d „  Z d „  Z d „  Z RS(   s§   
    An ordered dictionary that can have multiple values for each key.
    Adds the methods getall, getone, mixed, and add to the normal
    dictionary interface.
    c         O   sµ   t  | ƒ d k r! t d ƒ ‚ n  | r t | d d ƒ rM | d j ƒ  } n0 t | d d ƒ rs | d j ƒ  } n
 | d } t | ƒ |  _ n	 g  |  _ |  j j t j | ƒ ƒ d  S(   Ni   s9   MultiDict can only be called with one positional argumenti    t	   iteritemst   items(	   t   lent	   TypeErrort   hasattrR   R   t   listt   _itemst   extendt   six(   t   selft   argst   kwR   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   __init__   s    
	c         C   s@   x' |  j  D] \ } } | | k r
 | Sq
 Wt t | ƒ ƒ ‚ d  S(   N(   R	   t   KeyErrort   repr(   R   t   keyt   kt   v(    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   __getitem__'   s    c         C   s9   y |  | =Wn t  k
 r n X|  j j | | f ƒ d  S(   N(   R   R	   t   append(   R   R   t   value(    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   __setitem__-   s
    c         C   s   |  j  j | | f ƒ d S(   sL   
        Add the key and value, not overwriting any previous value.
        N(   R	   R   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   add4   s    c         C   sX   g  } xK |  j  D]@ \ } } t | ƒ t | ƒ k r | | k r | j | ƒ q q W| S(   sU   
        Return a list of all values matching the key (may be an empty list)
        (   R	   t   typeR   (   R   R   t   resultR   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   getall:   s
    $c         C   s[   |  j  | ƒ } | s( t d | ƒ ‚ n  t | ƒ d k rS t d | | f ƒ ‚ n  | d S(   sk   
        Get one value matching the key, raising a KeyError if multiple
        values were found.
        s   Key not found: %ri   s   Multiple values match %r: %ri    (   R   R   R   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   getoneD   s    c         C   s   i  } i  } xn |  j  D]c \ } } | | k ro | | k rN | | j | ƒ qy | | | g | | <d | | <q | | | <q W| S(   s$  
        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   t   None(   R   R   t   multiR   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   mixedP   s    c         C   sQ   i  } xD |  j  D]9 \ } } | | k r< | | j | ƒ q | g | | <q W| S(   sb   
        Returns a dictionary where each key is associated with a
        list of values.
        (   R	   R   (   R   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   dict_of_listsg   s    c         C   s™   |  j  } t } xh t t | ƒ d d d ƒ D]J } t | | d ƒ t | ƒ k r, | | d | k r, | | =t } q, q, W| s• t t | ƒ ƒ ‚ n  d  S(   Ni   iÿÿÿÿi    (   R	   t   Falset   rangeR   R   t   TrueR   R   (   R   R   R   t   foundt   i(    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   __delitem__t   s    	#4c         C   sF   x? |  j  D]4 \ } } t | ƒ t | ƒ k r
 | | k r
 t Sq
 Wt S(   N(   R	   R   R$   R"   (   R   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   __contains__~   s    $c         C   s   g  |  _  d  S(   N(   R	   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   clear†   s    c         C   s
   t  |  ƒ S(   N(   R   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   copy‰   s    c         C   sD   x' |  j  D] \ } } | | k r
 | Sq
 W|  j  j | | f ƒ | S(   N(   R	   R   (   R   R   t   defaultR   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt
   setdefaultŒ   s
    c         G   sÒ   t  | ƒ d k r5 t d t d t  | ƒ ƒ ƒ ‚ n  xv t t  |  j ƒ ƒ D]_ } t |  j | d ƒ t | ƒ k rK |  j | d | k rK |  j | d } |  j | =| SqK W| r¼ | d St t | ƒ ƒ ‚ d  S(   Ni   s&   pop expected at most 2 arguments, got i    (   R   R   R   R#   R	   R   R   (   R   R   R   R&   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   pop“   s    :
c         C   s   |  j  j ƒ  S(   N(   R	   R-   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   popitem¡   s    c         K   sÁ   | d  k r n˜ t | d ƒ r7 |  j j | j ƒ  ƒ np t | d ƒ rz x^ | j ƒ  D]  } |  j j | | | f ƒ qS Wn- x* | D]" \ } } |  j j | | f ƒ q W| r½ |  j | ƒ n  d  S(   NR   t   keys(   R   R   R	   R
   R   R/   R   t   update(   R   t   othert   kwargsR   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR0   ¤   s    !c         C   s=   d j  g  |  j D] } d | ^ q ƒ } d |  j j | f S(   Ns   , s   (%r, %r)s   %s([%s])(   t   joinR	   t	   __class__t   __name__(   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   __repr__²   s    )c         C   s   t  |  j ƒ S(   N(   R   R	   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   __len__¶   s    c         C   s    g  |  j  D] \ } } | ^ q
 S(   N(   R	   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR/   ½   s    c         c   s#   x |  j  D] \ } } | Vq
 Wd  S(   N(   R	   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   iterkeysÀ   s    c         C   s   |  j  S(   N(   R	   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR   Æ   s    c         C   s   t  |  j ƒ S(   N(   t   iterR	   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR   É   s    c         C   s    g  |  j  D] \ } } | ^ q
 S(   N(   R	   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   valuesÌ   s    c         c   s#   x |  j  D] \ } } | Vq
 Wd  S(   N(   R	   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt
   itervaluesÏ   s    N(   R5   t
   __module__t   __doc__R   R   R   R   R   R   R    R!   R'   R(   t   has_keyR)   R*   R   R,   R-   R.   R0   R6   R7   R/   R8   t   __iter__R   R   R:   R;   (    (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR      s6   					
				
												t   UnicodeMultiDictc           B   s  e  Z d  Z d d d e d „ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z e Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e Z d „  Z d „  Z d „  Z d „  Z  RS(   s  
    A MultiDict wrapper that decodes returned values to unicode on the
    fly. Decoding is not applied to assigned values.

    The key/value contents are assumed to be ``str``/``strs`` or
    ``str``/``FieldStorages`` (as is returned by the ``paste.request.parse_``
    functions).

    Can optionally also decode keys when the ``decode_keys`` argument is
    True.

    ``FieldStorage`` instances are cloned, and the clone's ``filename``
    variable is decoded. Its ``name`` variable is decoded when ``decode_keys``
    is enabled.

    t   strictc   
      C   s£   | |  _  | d  k r$ t j ƒ  } n  | |  _ | |  _ | |  _ |  j rŸ |  j  j } xH t | ƒ D]7 \ } } | \ } }	 |  j	 | ƒ } | |	 f | | <qa Wn  d  S(   N(
   R   R   t   syst   getdefaultencodingt   encodingt   errorst   decode_keysR	   t	   enumeratet   _encode_key(
   R   R   RD   RE   RF   R   t   indext   itemR   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR   ä   s    					c         C   s@   |  j  r< y | j |  j |  j ƒ } Wq< t k
 r8 q< Xn  | S(   N(   RF   t   encodeRD   RE   t   AttributeError(   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyRH   ó   s    	c         C   s@   |  j  r< y | j |  j |  j ƒ } Wq< t k
 r8 q< Xn  | S(   N(   RF   t   decodeRD   RE   RL   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   _decode_keyû   s    	c         C   sÙ   t  | t j ƒ r¥ |  j o- t  | j t j ƒ } t j s? | rÕ t j | ƒ } | ru | j j	 |  j
 |  j ƒ | _ n  t j r¢ | j j	 |  j
 |  j ƒ | _ q¢ qÕ n0 y | j	 |  j
 |  j ƒ } Wn t k
 rÔ n X| S(   s¯   
        Decode the specified value to unicode. Assumes value is a ``str`` or
        `FieldStorage`` object.

        ``FieldStorage`` objects are specially handled.
        (   t
   isinstancet   cgit   FieldStorageRF   t   nameR   t   binary_typet   PY2R*   RM   RD   RE   t   filenameRL   (   R   R   t   decode_name(    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   _decode_value  s    !	'c         C   s(   |  j  | ƒ } |  j |  j j | ƒ ƒ S(   N(   RH   RW   R   R   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR     s    c         C   s&   |  j  | ƒ } |  j j | | ƒ d  S(   N(   RH   R   R   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR     s    c         C   s&   |  j  | ƒ } |  j j | | ƒ d S(   sL   
        Add the key and value, not overwriting any previous value.
        N(   RH   R   R   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR   "  s    c         C   s;   |  j  | ƒ } g  |  j j | ƒ D] } |  j | ƒ ^ q" S(   sU   
        Return a list of all values matching the key (may be an empty list)
        (   RH   R   R   RW   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR   )  s    c         C   s(   |  j  | ƒ } |  j |  j j | ƒ ƒ S(   sk   
        Get one value matching the key, raising a KeyError if multiple
        values were found.
        (   RH   RW   R   R   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR   0  s    c         C   s‰   i  } x| t  j |  j j ƒ  ƒ D]b \ } } t | t ƒ r_ g  | D] } |  j | ƒ ^ qA } n |  j | ƒ } | | |  j | ƒ <q W| S(   s$  
        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.
        (   R   R   R   R    RO   R   RW   RN   (   R   t   unicode_mixedR   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR    8  s    %%c         C   sh   i  } x[ t  j |  j j ƒ  ƒ D]A \ } } g  | D] } |  j | ƒ ^ q2 } | | |  j | ƒ <q W| S(   sb   
        Returns a dictionary where each key is associated with a
        list of values.
        (   R   R   R   R!   RW   RN   (   R   t   unicode_dictR   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR!   I  s
    %"c         C   s#   |  j  | ƒ } |  j j | ƒ d  S(   N(   RH   R   R'   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR'   T  s    c         C   s   |  j  | ƒ } |  j j | ƒ S(   N(   RH   R   R(   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR(   X  s    c         C   s   |  j  j ƒ  d  S(   N(   R   R)   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR)   ^  s    c         C   s(   t  |  j j ƒ  |  j |  j d |  j ƒS(   NRF   (   R@   R   R*   RD   RE   RF   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR*   a  s    c         C   s+   |  j  | ƒ } |  j |  j j | | ƒ ƒ S(   N(   RH   RW   R   R,   (   R   R   R+   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR,   e  s    c         G   s+   |  j  | ƒ } |  j |  j j | | Œ ƒ S(   N(   RH   RW   R   R-   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR-   i  s    c         C   s1   |  j  j ƒ  \ } } |  j | ƒ |  j | ƒ f S(   N(   R   R.   RN   RW   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR.   m  s    c         C   s@   d j  g  |  j ƒ  D] } d | ^ q ƒ } d |  j j | f S(   Ns   , s   (%r, %r)s   %s([%s])(   R3   R   R4   R5   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR6   q  s    ,c         C   s   |  j  j ƒ  S(   N(   R   R7   (   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR7   u  s    c         C   s)   g  |  j  j ƒ  D] } |  j | ƒ ^ q S(   N(   R   R8   RN   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR/   |  s    c         c   s,   x% |  j  j ƒ  D] } |  j | ƒ Vq Wd  S(   N(   R   R8   RN   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR8     s    c         C   sA   g  t  j |  j ƒ D]* \ } } |  j | ƒ |  j | ƒ f ^ q S(   N(   R   R   R   RN   RW   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR   …  s    c         c   sD   x= t  j |  j ƒ D]) \ } } |  j | ƒ |  j | ƒ f Vq Wd  S(   N(   R   R   R   RN   RW   (   R   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR   ‰  s    c         C   s)   g  |  j  j ƒ  D] } |  j | ƒ ^ q S(   N(   R   R;   RW   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR:     s    c         c   s,   x% |  j  j ƒ  D] } |  j | ƒ Vq Wd  S(   N(   R   R;   RW   (   R   R   (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR;     s    N(!   R5   R<   R=   R   R"   R   RH   RN   RW   R   R   R   R   R   R    R!   R'   R(   R>   R)   R*   R,   R-   R.   R6   R7   R/   R8   R?   R   R   R:   R;   (    (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyR@   Ó   s<   																								s¥  
    >>> d = MultiDict(a=1, b=2)
    >>> d['a']
    1
    >>> d.getall('c')
    []
    >>> d.add('a', 2)
    >>> d['a']
    1
    >>> d.getall('a')
    [1, 2]
    >>> d['b'] = 4
    >>> d.getall('b')
    [4]
    >>> d.keys()
    ['a', 'a', 'b']
    >>> d.items()
    [('a', 1), ('a', 2), ('b', 4)]
    >>> d.mixed()
    {'a': [1, 2], 'b': 4}
    >>> MultiDict([('a', 'b')], c=2)
    MultiDict([('a', 'b'), ('c', 2)])
    t   generalt   __main__(   RP   R*   R   RB   t   collections.abcR    R   t   ImportErrort   UserDictR   R@   t   __test__R5   t   doctestt   testmod(    (    (    s>   /usr/local/lib/python2.7/dist-packages/paste/util/multidict.pyt   <module>   s   ÄÁ
