ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ bNc@sdZddlZddlZddlmZdejfdYZdada dZ dZ dZ e a ad ejfd YZdadad Zd Z d ZdS(s threadedprint.py ================ :author: Ian Bicking :date: 12 Jul 2004 Multi-threaded printing; allows the output produced via print to be separated according to the thread. To use this, you must install the catcher, like:: threadedprint.install() The installation optionally takes one of three parameters: default The default destination for print statements (e.g., ``sys.stdout``). factory A function that will produce the stream for a thread, given the thread's name. paramwriter Instead of writing to a file-like stream, this function will be called like ``paramwriter(thread_name, text)`` for every write. The thread name is the value returned by ``threading.currentThread().getName()``, a string (typically something like Thread-N). You can also submit file-like objects for specific threads, which will override any of these parameters. To do this, call ``register(stream, [threadName])``. ``threadName`` is optional, and if not provided the stream will be registered for the current thread. If no specific stream is registered for a thread, and no default has been provided, then an error will occur when anything is written to ``sys.stdout`` (or printed). Note: the stream's ``write`` method will be called in the thread the text came from, so you should consider thread safety, especially if multiple threads share the same writer. Note: if you want access to the original standard out, use ``sys.__stdout__``. You may also uninstall this, via:: threadedprint.uninstall() TODO ---- * Something with ``sys.stderr``. * Some default handlers. Maybe something that hooks into `logging`. * Possibly cache the results of ``factory`` calls. This would be a semantic change. iN(t filemixint PrintCatchercBseZd d d edZejdZdZdZ dZ dZ dZ dZ d ejdZd ejd ZRS( cCsttd|||gdks3td|r\| sPtd|tj}n|rq|j|_n6|r|j|_n!|r|j|_n |j |_||_ ||_ ||_ i|_ dS(NcSs |dk S(N(tNone(tx((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pytGtis<You can only provide one of default, factory, or paramwriters:You cannot pass in both default (%r) and leave_stdout=True(tlentfiltertAssertionErrortsyststdoutt _writedefaultt _defaultfunct _writefactoryt _writeparamt _writeerrort_defaultt_factoryt _paramwritert _catchers(tselftdefaulttfactoryt paramwritert leave_stdout((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyt__init__Es&         cCsU|j}|j}|j|s:|j||n||}|j|dS(N(tgetNameRthas_keyR twrite(Rtvt currentThreadtnametcatcherstcatcher((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyR\s   cGsOtjj}|j}||kr:|jj|n||j|dS(N(t threadingRRRRtseek(RtargsRR ((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyR#es   cGsOtjj}|j}||kr:|jj|n||j|dS(N(R"RRRRtread(RR$RR ((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyR%ns   cCs|jj|dS(N(RR(RRR((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyR wscCs|j|j|dS(N(RR(RRR((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyR zscCs|j||dS(N(R(RRR((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyR}scCststd|dS(Ns8There is no PrintCatcher output stream for the thread %r(tFalseR(RRR((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyRs cCs/|dkr|j}n||j|s (t__doc__R"R t paste.utilRt FileMixinRRR+R,R.R0R/R'R(R1R8R:R=R>(((sI/opt/alt/python27/lib/python2.7/site-packages/paste/util/threadedprint.pyt=s   P    8