Ñò ô†³Kc@s˜ddkZddkZddkZddklZdefd„ƒYZdefd„ƒYZhdd6Zed joddk Z e i ƒndS( iÿÿÿÿN(t DictMixint MultiDictcBsøeZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z e Z d „Zd „Zdd „Zd„Zd„Zdd„Zd„Zd„Zd„Zd„ZeZd„Zd„Zd„Zd„ZRS(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. cOsÀt|ƒdjotdƒ‚n|ost|ddƒot|diƒƒ}n9t|ddƒo|diƒ}nt|dƒ}||_n g|_|ii|iƒƒdS(Nis9MultiDict can only be called with one positional argumentit iteritemstitems(tlent TypeErrorthasattrtlistRRt_itemstextend(tselftargstkwR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyt__init__s   cCsBx)|iD]\}}||jo|Sq Wtt|ƒƒ‚dS(N(RtKeyErrortrepr(R tkeytktv((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyt __getitem__ s    cCs;y ||=Wntj onX|ii||fƒdS(N(RRtappend(R Rtvalue((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyt __setitem__&s  cCs|ii||fƒdS(sL Add the key and value, not overwriting any previous value. N(RR(R RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pytadd-scCsBg}x5|iD]*\}}||jo|i|ƒqqW|S(sU Return a list of all values matching the key (may be an empty list) (RR(R RtresultRR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pytgetall3s   cCs_|i|ƒ}|ptd|ƒ‚nt|ƒdjotd||fƒ‚n|dS(sk Get one value matching the key, raising a KeyError if multiple values were found. sKey not found: %risMultiple values match %r: %ri(RRR(R RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pytgetone=s cCs…h}h}xr|iD]g\}}||joD||jo||i|ƒq}|||g||}|i|d|jo |i|d}|i|=|SqJW|o |dStt|ƒƒ‚dS(Nis&pop expected at most 2 arguments, got i(RRRR RR(R RR R#R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pytpopŒs   cCs |iiƒS(N(RR*(R ((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pytpopitemšscKsÉ|djont|dƒo|ii|iƒƒnst|dƒo5x_|iƒD] }|ii|||fƒqXWn.x*|D]"\}}|ii||fƒq‡W|o|i|ƒndS(NRtkeys(RRRR RR,Rtupdate(R tothertkwargsRR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR-s  " cCsEdig}|iD]}|d|q~ƒ}d|ii|fS(Ns, s(%r, %r)s%s([%s])(tjoinRt __class__t__name__(R t_[1]RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyt__repr__«s1cCs t|iƒS(N(RR(R ((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyt__len__¯scCs(g}|iD]\}}||q~S(N(R(R R3RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR,¶sccs#x|iD]\}}|Vq WdS(N(R(R RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pytiterkeys¹s cCs|iS(N(R(R ((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR¿scCs t|iƒS(N(titerR(R ((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRÂscCs(g}|iD]\}}||q~S(N(R(R R3RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pytvaluesÅsccs#x|iD]\}}|Vq WdS(N(R(R RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyt itervaluesÈs N(R2t __module__t__doc__R RRRRRRRR$R%thas_keyR&R'RR)R*R+R-R4R5R,R6t__iter__RRR8R9(((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRs6                   tUnicodeMultiDictcBs eZdZddded„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zd „Zd „ZeZd„Zd„Zdd„Zd„Zd„Zd„Zd„Zd„Zd„ZeZd„Zd„Zd„Zd„ZRS(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. tstrictcCsE||_|djotiƒ}n||_||_||_dS(N(RRtsystgetdefaultencodingtencodingterrorst decode_keys(R RRBRCRD((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR Ýs     cCsD|io6y|i|i|iƒ}Wq@tj oq@Xn|S(N(RDtdecodeRBRCtAttributeError(R R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyt _decode_keyæs   cCs¦t|tiƒo]ti|ƒ}|io"|ii|i|iƒ|_n|i i|i|iƒ|_ n3y|i|i|iƒ}Wnt j onX|S(s¯ Decode the specified value to unicode. Assumes value is a ``str`` or `FieldStorage`` object. ``FieldStorage`` objects are specially handled. ( t isinstancetcgit FieldStorageR'RDtnameRERBRCtfilenameRF(R R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyt _decode_valueîs ""cCs|i|ii|ƒƒS(N(RMRR(R R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRscCs|ii||ƒdS(N(RR(R RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRscCs|ii||ƒdS(sL Add the key and value, not overwriting any previous value. N(RR(R RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRscCs4g}|ii|ƒD]}||i|ƒq~S(sU Return a list of all values matching the key (may be an empty list) (RRRM(R RR3R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRscCs|i|ii|ƒƒS(sk Get one value matching the key, raising a KeyError if multiple values were found. (RMRR(R R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRscCsh}xƒ|iiƒiƒD]l\}}t|tƒo.g}|D]}||i|ƒqC~}n|i|ƒ}|||i|ƒRR'RBRC(R ((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR'BscCs|i|ii||ƒƒS(N(RMRR)(R RR(((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR)EscGs|i|ii||ŒƒS(N(RMRR*(R RR ((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR*HscCs1|iiƒ\}}|i|ƒ|i|ƒfS(N(RR+RGRM(R RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR+KscCsHdig}|iƒD]}|d|q~ƒ}d|ii|fS(Ns, s(%r, %r)s%s([%s])(R0RR1R2(R R3RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR4Os4cCs |iiƒS(N(RR5(R ((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR5SscCs1g}|iiƒD]}||i|ƒq~S(N(RR6RG(R R3R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR,Zsccs,x%|iiƒD]}|i|ƒVqWdS(N(RR6RG(R R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR6]scCsFg}|iiƒD]+\}}||i|ƒ|i|ƒfq~S(N(RRRGRM(R R3RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRcsccsAx:|iiƒD])\}}|i|ƒ|i|ƒfVqWdS(N(RRRGRM(R RR((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyRgs cCs1g}|iiƒD]}||i|ƒq~S(N(RR9RM(R R3R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR8ksccs,x%|iiƒD]}|i|ƒVqWdS(N(RR9RM(R R((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyR9nsN( R2R:R;RRR RGRMRRRRRRRR$R%R<R&R'R)R*R+R4R5R,R6R=RRR8R9(((s8/usr/lib/python2.6/site-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)]) tgeneralt__main__( RIR'R@tUserDictRRR>t__test__R2tdoctestttestmod(((s8/usr/lib/python2.6/site-packages/paste/util/multidict.pyts   Ħ