ó
A¾^Yc           @   s7  d  Z  d d l Z d d l Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d d d „  ƒ  YZ d	 „  Z e ƒ  Z d
 „  Z	 d „  Z
 d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d „  Z d d d „  ƒ  YZ xU d j ƒ  D]G Z d e Z y# e e e e e j j e ƒ ƒ Wqè e k
 r.qè Xqè Wd S(   sÍ  
basic logging functionality based on a producer/consumer scheme.

XXX implement this API: (maybe put it into slogger.py?)

        log = Logger(
                    info=py.log.STDOUT,
                    debug=py.log.STDOUT,
                    command=None)
        log.info("hello", "world")
        log.command("hello", "world")

        log = Logger(info=Logger(something=...),
                     debug=py.log.STDOUT,
                     command=None)
iÿÿÿÿNt   Messagec           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   keywordst   args(   t   selfR   R   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   __init__   s    	c         C   s   d j  t t |  j ƒ ƒ S(   Nt    (   t   joint   mapt   strR   (   R   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   content   s    c         C   s   d d j  |  j ƒ S(   Ns   [%s] t   :(   R   R   (   R   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   prefix   s    c         C   s   |  j  ƒ  |  j ƒ  S(   N(   R   R	   (   R   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   __str__   s    (   t   __name__t
   __module__R   R	   R   R   (    (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR       s   			t   Producerc           B   sA   e  Z d  Z e Z i  Z d d „ Z d „  Z d „  Z d „  Z	 RS(   sÁ    (deprecated) Log producer API which sends messages to be logged
        to a 'consumer' object, which then prints them to stdout,
        stderr, files, etc. Used extensively by PyPy-1.1.
    c         K   sO   t  | d ƒ r$ t | j ƒ  ƒ } n  | |  _ | d  k rB t } n  | |  _ d  S(   Nt   split(   t   hasattrt   tupleR   t	   _keywordst   Nonet   default_keywordmappert   _keywordmapper(   R   R   t   keywordmappert   kw(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR   +   s    		c         C   s   d d j  |  j ƒ S(   Ns   <py.log.Producer %s>R
   (   R   R   (   R   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   __repr__3   s    c         C   sH   d | k r t  | ƒ ‚ n  |  j |  j | f ƒ } t |  | | ƒ | S(   Nt   _(   t   AttributeErrort	   __class__R   t   setattr(   R   t   namet   producer(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   __getattr__6   s
    c         G   sA   |  j  j |  j ƒ } | d k	 r= | |  j |  j | ƒ ƒ n  d S(   s0    write a message to the appropriate consumer(s) N(   R   t   getconsumerR   R   R    (   R   R   t   func(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   __call__=   s    N(
   R   R   t   __doc__R    t   keywords2consumerR   R   R   R    R#   (    (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR   "   s   		t   KeywordMapperc           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s   i  |  _  d  S(   N(   R%   (   R   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR   D   s    c         C   s   |  j  j ƒ  S(   N(   R%   t   copy(   R   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   getstateG   s    c         C   s!   |  j  j ƒ  |  j  j | ƒ d  S(   N(   R%   t   cleart   update(   R   t   state(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   setstateI   s    c         C   s`   xJ t  t | ƒ d d ƒ D]0 } y |  j | |  SWq t k
 rH q q Xq W|  j j d t ƒ S(   s   return a consumer matching the given keywords.

            tries to find the most suitable consumer by walking, starting from
            the back, the list of keywords, the first consumer matching a
            keyword is returned (falling back to py.log.default)
        i    iÿÿÿÿt   default(   t   ranget   lenR%   t   KeyErrort   gett   default_consumer(   R   R   t   i(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR!   M   s    c         C   sÑ   t  | t ƒ r- t t d | j ƒ  ƒ ƒ } n@ t | d ƒ rH | j } n% t  | t ƒ sm t d | f ƒ ‚ n  | d k	 rÀ t	 j
 j | ƒ rÀ t | d ƒ s± t d | f ƒ ‚ n  t | ƒ } n  | |  j | <d S(   s'    set a consumer for a set of keywords. R   s   key %r is not a string or tuplet   writes(   %r should be None, callable or file-likeN(   t
   isinstanceR   R   t   filterR   R   R   R   t	   TypeErrort   pyt   builtint   callablet   FileR%   (   R   R   t   consumer(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   setconsumer[   s    (   R   R   R   R(   R,   R!   R=   (    (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR&   C   s
   				c         C   s   t  j j t |  ƒ d ƒ d S(   sD    the default consumer, prints the message to stdout (using 'print') s   
N(   t   syst   stderrR4   R   (   t   msg(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR2   k   s    c         C   s   t  j |  | ƒ d  S(   N(   R   R=   (   R   R<   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR=   q   s    c         C   s   t  j |  ƒ d  S(   N(   R   R,   (   R+   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR,   t   s    c           C   s
   t  j ƒ  S(   N(   R   R(   (    (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR(   v   s    R;   c           B   s    e  Z d  Z d „  Z d „  Z RS(   s,    log consumer wrapping a file(-like) object c         C   s"   t  | d ƒ s t ‚ | |  _ d  S(   NR4   (   R   t   AssertionErrort   _file(   R   t   f(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR      s    c         C   s@   |  j  j t | ƒ d ƒ t |  j  d ƒ r< |  j  j ƒ  n  d S(   s    write a message to the log s   
t   flushN(   RB   R4   R   R   RD   (   R   R@   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR#   „   s    (   R   R   R$   R   R#   (    (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR;   }   s   	t   Pathc           B   s2   e  Z d  Z e e e d „ Z d „  Z d „  Z RS(   s.    log consumer that opens and writes to a Path c         C   s8   | |  _  t | ƒ |  _ | |  _ | s4 |  j ƒ  n  d  S(   N(   t   _appendR   t	   _filenamet
   _bufferingt	   _openfile(   R   t   filenamet   appendt   delayed_createt	   buffering(    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR   Œ   s
    		c         C   s4   |  j  r d p d } t |  j | ƒ } | |  _ d  S(   Nt   at   w(   RF   t   openRG   RB   (   R   t   modeRC   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyRI   ”   s    c         C   sS   t  |  d ƒ s |  j ƒ  n  |  j j t | ƒ d ƒ |  j sO |  j j ƒ  n  d S(   s    write a message to the log RB   s   
N(   R   RI   RB   R4   R   RH   RD   (   R   R@   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR#   ™   s
    	(   R   R   R$   t   FalseR   RI   R#   (    (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyRE   Š   s
   	c         C   s   t  j j t |  ƒ d ƒ d S(   s$    consumer that writes to sys.stdout s   
N(   R>   t   stdoutR4   R   (   R@   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   STDOUT¡   s    c         C   s   t  j j t |  ƒ d ƒ d S(   s$    consumer that writes to sys.stderr s   
N(   R>   R?   R4   R   (   R@   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   STDERR¥   s    t   Syslogc           B   s#   e  Z d  Z d d „ Z d „  Z RS(   s+    consumer that writes to the syslog daemon c         C   s%   | d  k r |  j } n  | |  _ d  S(   N(   R   t   LOG_INFOt   priority(   R   RX   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR   ¬   s    c         C   s#   t  j j j |  j t | ƒ ƒ d S(   s    write a message to the log N(   R8   t   stdt   syslogRX   R   (   R   R@   (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyR#   ±   s    N(   R   R   R$   R   R   R#   (    (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyRV   ©   s   s.   EMERG ALERT CRIT ERR WARNING NOTICE INFO DEBUGt   LOG_(    (    (   R$   R8   R>   t   objectR    R   R&   R2   R   R=   R,   R(   R;   RE   RT   RU   RV   R   t   _prioR   t   getattrRY   RZ   R   (    (    (    s'   /tmp/pip-build-UnxK1c/py/py/_log/log.pyt   <module>   s(   !(							
#