PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB`  jTc @s dZddlZddlZddlZddlZddlZddljZddlm Z m Z ddl m Z m Z mZmZmZddddd d d d d dddg ZejdZejejrejZn dZd efdYZdefdYZdefdYZdefdYZd efdYZd efdYZdefdYZiZe Z!de"fdYZ#defdYZ$d e$fdYZ%de$fdYZ&d e$fd YZ'e'Z(dS(!sContainer and Namespace classesiN(tCreationAbortedErrortMissingCacheParameter(t _threadingtfile_synchronizertmutex_synchronizertNameLocktnull_synchronizertValuet ContainertContainerContexttMemoryContainert DBMContainertNamespaceManagertMemoryNamespaceManagertDBMNamespaceManagert FileContainertOpenResourceNamespaceManagertFileNamespaceManagerRsbeaker.containercGsdS(N((tmessagetargs((s4/usr/lib/python2.7/site-packages/beaker/container.pytdebugscBseZdZedZdZdZdZdZdZ e dZ dZ d Z d Zd Zdd Zd ZdZdZdZRS(sHandles dictionary operations and locking for a namespace of values. The implementation for setting and retrieving the namespace data is handled by subclasses. NamespaceManager may be used alone, or may be privately accessed by one or more Container objects. Container objects provide per-key services like expiration times and automatic recreation of values. Multiple NamespaceManagers created with a particular name will all share access to the same underlying datasource and will attempt to synchronize against a common mutex object. The scope of this sharing may be within a single process or across multiple processes, depending on the type of NamespaceManager used. The NamespaceManager itself is generally threadsafe, except in the case of the DBMNamespaceManager in conjunction with the gdbm dbm implementation. cCsdS(N((tcls((s4/usr/lib/python2.7/site-packages/beaker/container.pyt_init_dependencies4scCs|j||_dS(N(Rt namespace(tselfR((s4/usr/lib/python2.7/site-packages/beaker/container.pyt__init__8s cCs tdS(N(tNotImplementedError(Rtkey((s4/usr/lib/python2.7/site-packages/beaker/container.pytget_creation_lock<scCs tdS(N(R(R((s4/usr/lib/python2.7/site-packages/beaker/container.pyt do_remove?scCsdS(N((R((s4/usr/lib/python2.7/site-packages/beaker/container.pytacquire_read_lockBscCsdS(N((R((s4/usr/lib/python2.7/site-packages/beaker/container.pytrelease_read_lockEscCstS(N(tTrue(Rtwait((s4/usr/lib/python2.7/site-packages/beaker/container.pytacquire_write_lockHscCsdS(N((R((s4/usr/lib/python2.7/site-packages/beaker/container.pytrelease_write_lockKscCs |j|S(N(t __contains__(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pythas_keyNscCs tdS(N(R(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyt __getitem__QscCs tdS(N(R(RRtvalue((s4/usr/lib/python2.7/site-packages/beaker/container.pyt __setitem__TscCs|||R R4R#(R((s4/usr/lib/python2.7/site-packages/beaker/container.pyR#scCss|jjzQ|rG|jdkr5|j|n|jd7_n|j|d|_Wd|jjXdS(Nii(R7tacquireR5R9trelease(RR8R<((s4/usr/lib/python2.7/site-packages/beaker/container.pyR=s   cCs|jjz]|rD|jd8_|jdkri|jqin%|jdkr`|jnd|_Wd|jjXdS(Nii(R7R@R5R:RA(RR<((s4/usr/lib/python2.7/site-packages/beaker/container.pyR>s   cCs@|jjz|jdt|jWd|jjXdS(NR<(R4R"R>tFalseRR#(R((s4/usr/lib/python2.7/site-packages/beaker/container.pyR-s  (R.R/R0RR3R9R:RRR R"R#RBR=R>R-(((s4/usr/lib/python2.7/site-packages/beaker/container.pyRns        cBskeZdZddddZdZd Zd Zd Zd Z d Z ddZ dZ RS(Rt createfuncR)texpire_argumentt starttimet storedtimeRcCs:||_||_||_||_d|_||_dS(Ni(RRCRDRERFR(RRRRCR)RE((s4/usr/lib/python2.7/site-packages/beaker/container.pyRs      cCs9|jjz|jj|jSWd|jjXdS(srreturn true if the container has a value stored. This is regardless of it being expired or not. N(RRR%RR(R((s4/usr/lib/python2.7/site-packages/beaker/container.pyt has_values cCs|jp|jdk S(N(thas_current_valueRCR2(R((s4/usr/lib/python2.7/site-packages/beaker/container.pytcan_have_valuescCs|jjzd|jj|j}|rly*|j\}}}|j|| SWqltk rhqlXntSWd|jjXdS(N( RRR%Rt _get_valuet _is_expiredtKeyErrorRBR(RRGtstoredtexpiredR'((s4/usr/lib/python2.7/site-packages/beaker/container.pyRHs  cCs>|jdk r||jkp=|dk o=tj||kS(s1Return true if this container's value is expired.N(RER2ttime(RRFR)((s4/usr/lib/python2.7/site-packages/beaker/container.pyRKs cCs|jjz}|j}|rny/|j\}}}|j||sP|SWqntk rjt}qnXn|jst|jnWd|jj Xt}|jj |j}|r|j dtst d|St dt }n|st d|j t dnz|jjzV|jr{y/|j\}}}|j||sc|SWq{tk rwq{XnWd|jj Xt d|j}|j||SWd|jt dXdS(NR!s6get_value returning old value while new one is createdslock_creatfunc (didnt wait)slock_createfunc (waiting)slock_createfunc (waited)sget_value creating new valuesreleased create lock(RRRGRJRKRLRBRCRRRR@RR R*RA(RRGRMRNR'thas_createlockt creation_locktv((s4/usr/lib/python2.7/site-packages/beaker/container.pyt get_valuesT                   cCs|j|j}y|\}}}Wntk rt|dksKn|\}}|j}td||j|jj|j|||jjn t k rt |jnX|||fS(Nis*get_value upgrading time %r expire time %r( RRt ValueErrortlenRDRRR*Rt TypeErrorRL(RR'RMRN((s4/usr/lib/python2.7/site-packages/beaker/container.pyRJ2s     cCsv|jjzT|dkr+tj}ntd||j|jj|j||j|fWd|jjXdS(Ns'set_value stored time %r expire time %r( RR"R2RORRDR*RR#(RR'RF((s4/usr/lib/python2.7/site-packages/beaker/container.pyR*Gs  &cCsv|jjzTtd|jj|jrWy|j|j=WqWtk rSqWXnd|_Wd|jjXdS(Nt clear_valuei(RR"RR%RRLRFR#(R((s4/usr/lib/python2.7/site-packages/beaker/container.pyRWQs    (skeys createfuncs expiretimesexpire_arguments starttimes storedtimes namespaceN( R.R/t __slots__R2RRGRIRHRKRSRJR*RW(((s4/usr/lib/python2.7/site-packages/beaker/container.pyRs    8  tAbstractDictionaryNSManagercBsVeZdZdZdZdZdZdZdZdZ dZ RS( sA subclassable NamespaceManager that places data in a dictionary. Subclasses should provide a "dictionary" attribute or descriptor which returns a dict-like object. The dictionary will store keys that are local to the "namespace" attribute of this manager, so ensure that the dictionary will not be used by any other namespace. e.g.:: import collections cached_data = collections.defaultdict(dict) class MyDictionaryManager(AbstractDictionaryNSManager): def __init__(self, namespace): AbstractDictionaryNSManager.__init__(self, namespace) self.dictionary = cached_data[self.namespace] The above stores data in a global dictionary called "cached_data", which is structured as a dictionary of dictionaries, keyed first on namespace name to a sub-dictionary, then on actual cache key to value. cCs tdd|j|fdtS(Nt identifiersmemorynamespace/funclock/%s/%st reentrant(RRR (RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyRxscCs |j|S(N(t dictionary(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyR&~scCs|jj|S(N(R\R$(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyR$scCs|jj|S(N(R\R$(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyR%scCs||j|(Rtg((s4/usr/lib/python2.7/site-packages/beaker/container.pyRpscCsg}tj|jtjr1|j|jnxOdD]G}tj|jtj|tjr8|j|jtj|q8q8W|S(NRtRuRrRs(spagsdirsdbsdat(RvRwRoRxtappendRy(RtlistRz((s4/usr/lib/python2.7/site-packages/beaker/container.pyt get_filenamess #"cCsbtd|jy|jj|j||_Wn,|j|jj|j||_nXdS(Nsopening dbm file %s(RRoRlR=RmRp(RR8((s4/usr/lib/python2.7/site-packages/beaker/container.pyR9s  cCs3|jdk r/td|j|jjndS(Nsclosing dbm file %s(RmR2RRoR>(R((s4/usr/lib/python2.7/site-packages/beaker/container.pyR:scCs(x!|jD]}tj|q WdS(N(RRvR-(Rtf((s4/usr/lib/python2.7/site-packages/beaker/container.pyRscCstj|j|S(N(tcPickletloadsRm(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyR&scCs|jj|S(N(RmR%(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyR$scCstj||j|R8(RR8tfh((s4/usr/lib/python2.7/site-packages/beaker/container.pyR9,s cCsf|jdks|jdkrPt|jd}tj|j||jni|_d|_dS(NR?twtwb(R8R=RoRtdumpRR>R2(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyR:7s   cCs7ytj|jWntk r)}nXi|_dS(N(RvR-RoRR(Rterr((s4/usr/lib/python2.7/site-packages/beaker/container.pyR@s cCs |j|S(N(R(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyR&IscCs|jj|S(N(RR%(RR((s4/usr/lib/python2.7/site-packages/beaker/container.pyR$LscCs||j|s@     (      QU4fZ