ó
óÏù]c           @   sÚ  d  Z  d d l Z d d l Z d d l Z d d l Z d d l m Z m Z e j j	 d e
 ƒ sî e j j ƒ  r¦ e e j ƒ e e j ƒ k r¦ e j e j ƒ e _ n  e j j ƒ  rî e e j ƒ e e j ƒ k rî e j e j ƒ e _ qî n  d d l Z e j j	 d d ƒ Z e j j	 d d ƒ Z g  Z d	 Z i e d
 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d  6Z d! Z y e Wn e k
 r±d Z n Xd" „  Z y e j Z Wn e k
 räd# „  Z n Xd$ e _  d% „  Z  d& e! f d' „  ƒ  YZ" e" ƒ  Z# e j$ d( e j% ƒ Z& d) e j' f d* „  ƒ  YZ( d+ e j) f d, „  ƒ  YZ* d- e j+ f d. „  ƒ  YZ, d a- d/ „  Z. d0 „  Z/ d1 „  Z0 d2 „  Z1 d3 „  Z2 d4 „  Z3 d5 d6 „ Z4 d7 „  Z5 d8 d9 d: „ Z6 d S(;   s2   
logging, colors, terminal width and pretty-print
iÿÿÿÿN(   t   Utilst   ansitermt   NOSYNCt   WAF_LOG_FORMATs,   %(asctime)s %(c1)s%(zone)s%(c2)s %(message)st   WAF_HOUR_FORMATs   %H:%M:%Si    t   USEs   [01;1mt   BOLDs   [01;31mt   REDs   [32mt   GREENs   [33mt   YELLOWs   [35mt   PINKs   [01;34mt   BLUEs   [36mt   CYANs   [37mt   GREYs   [0mt   NORMALs   [?25ht	   cursor_ons   [?25lt
   cursor_offs
   [K%s%s%sc         C   sº   |  d k r� t  j j ƒ  p' t  j j ƒ  s3 d }  n  t j rc t j d k rc t j j	 d d ƒ } n t j j	 d d ƒ } | d k r� d }  q� n  |  d k r¬ d t j d <n  |  t
 d	 <d
 S(   s3  
	If *1* is given, then the system will perform a few verifications
	before enabling colors, such as checking whether the interpreter
	is running in a terminal. A value of zero will disable colors,
	and a value above *1* will force colors.

	:param use: whether to enable colors or not
	:type use: integer
	i   i    t   javat   TERMt    t   dumbt   emacst   vt100R   N(   R   R   (   t   syst   stderrt   isattyt   stdoutR    t   is_win32t   ost   namet   environt   gett
   colors_lst(   t   uset   term(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   enable_colors:   s    
	c           C   s   d S(   NiP   (    (    (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   get_term_colsY   s    sf   
	Returns the console width in characters.

	:return: the number of characters per line
	:rtype: int
	c         C   s   t  d r t  j |  d ƒ Sd S(   sÂ   
	Returns the ansi sequence corresponding to the given color name.
	An empty string is returned when coloring is globally disabled.

	:param cl: color name in capital letters
	:type cl: string
	R   R   (   R    R   (   t   cl(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt	   get_colorc   s    
t
   color_dictc           B   s    e  Z d  Z d „  Z d „  Z RS(   s-   attribute-based color access, eg: colors.PINKc         C   s
   t  | ƒ S(   N(   R&   (   t   selft   a(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   __getattr__q   s    c         C   s
   t  | ƒ S(   N(   R&   (   R(   R)   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   __call__s   s    (   t   __name__t
   __module__t   __doc__R*   R+   (    (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyR'   o   s   	s   (\w+): (.*)t
   log_filterc           B   s#   e  Z d  Z d d „ Z d „  Z RS(   sù   
	Waf logs are of the form 'name: message', and can be filtered by 'waf --zones=name'.
	For example, the following::

		from waflib import Logs
		Logs.debug('test: here is a message')

	Will be displayed only when executing::

		$ waf --zones=test
	R   c         C   s   t  j j |  | ƒ d  S(   N(   t   loggingt   Filtert   __init__(   R(   R   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyR2   …   s    c         C   s�   | j  | _ | j t j k r" t St j | j ƒ } | ra | j	 d ƒ | _ | j	 d ƒ | _ n  t
 r‰ t | d d ƒ t
 k pˆ d t
 k St d k s™ t St S(   sO   
		Filters log records by zone and by logging level

		:param rec: log entry
		i   i   t   zoneR   t   *(   t   moduleR3   t   levelnoR0   t   INFOt   Truet   re_logt   matcht   msgt   groupt   zonest   getattrt   verboset   False(   R(   t   rect   m(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   filterˆ   s    "(   R,   R-   R.   R2   RC   (    (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyR/   y   s   t   log_handlerc           B   s    e  Z d  Z d „  Z d „  Z RS(   sD   Dispatches messages to stderr/stdout depending on the severity levelc         C   s®   yz y | j  |  _  WnL t k
 ra | j t j k rK t j | _  |  _  qb t j | _  |  _  n X|  j | ƒ |  j	 ƒ  Wn- t
 t f k
 r– ‚  n |  j | ƒ n Xd S(   sT   
		Delegates the functionality to :py:meth:`waflib.Log.log_handler.emit_override`
		N(   t   streamt   AttributeErrorR6   R0   t   WARNINGR   R   R   t   emit_overridet   flusht   KeyboardInterruptt
   SystemExitt   handleError(   R(   t   record(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   emitŸ   s    c         K   s  t  | d d ƒ |  _ |  j } t r|  j j | ƒ } d |  j } y‘ t | t ƒ rÂ t  | d d ƒ rÂ | j | j	 ƒ } y | j
 | | ƒ WqÓ t k
 r¾ | j
 | | j | j	 ƒ ƒ qÓ Xn | j
 | | ƒ Wqt k
 r| j
 | | j d ƒ ƒ qXn t j j |  | ƒ d S(   sA   
		Writes the log record to the desired stream (stderr/stdout)
		t
   terminators   
s   %st   encodings   utf-8N(   R>   RO   RE   t   unicodet	   formattert   formatt
   isinstancet   Nonet   decodeRP   t   writet   UnicodeEncodeErrort   encodet   UnicodeErrorR0   t   StreamHandlerRN   (   R(   RM   t   kwRE   R;   t   fs(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyRH   ³   s     	!$!(   R,   R-   R.   RN   RH   (    (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyRD   �   s   	RR   c           B   s    e  Z d  Z d „  Z d „  Z RS(   s)   Simple log formatter which handles colorsc         C   s   t  j j |  t t ƒ d  S(   N(   R0   t	   FormatterR2   t
   LOG_FORMATt   HOUR_FORMAT(   R(   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyR2   Í   s    c         C   sƒ  y | j  j d ƒ } Wn t k
 r2 | j  } n Xt d } | d k rX | j j ƒ  sd | d k rt | d d
 ƒ } | d
 k rå d } | j t	 j
 k r¦ t j } qå | j t	 j k rÄ t j } qå | j t	 j k rå t j } qå n  t | d t j ƒ } d | | | f } n t j d	 d | ƒ } | j t	 j k rO| j rK| | j S| S| | _  t j | _ t j | _ t	 j j |  | ƒ S(   s…   
		Formats records and adds colors as needed. The records do not get
		a leading hour format if the logging level is above *INFO*.
		s   utf-8R   i   i   t   c1R   t   c2s   %s%s%ss   \r(?!\n)|\x1B\[(K|.*?(m|h|l))N(   R;   RV   t	   ExceptionR    RE   R   R>   RU   R6   R0   t   ERRORt   colorsR   RG   R	   R7   R   R   t   ret   subt   argsR
   Ra   Rb   R^   RS   (   R(   RA   R;   R!   Ra   Rb   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyRS   Ð   s4    
'		(   R,   R-   R.   R2   RS   (    (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyRR   Ë   s   	c          O   sC   t  r? t |  ƒ }  |  d j d d ƒ |  d <t j |  | Ž  n  d S(   si   
	Wraps logging.debug and discards messages if the verbosity level :py:attr:`waflib.Logs.verbose` â‰¤ 0
	i    s   
t    N(   R?   t   listt   replacet   logt   debug(   t   kR\   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyRm   û   s    c          O   s¾   t  j |  | Ž  t d k rº t j ƒ  } | rº | d  } g  } xT | D]L \ } } } } | j d | | | f ƒ | rE | j d | j ƒ  ƒ qE qE W| r· t  j d j | ƒ ƒ q· qº n  d S(   sk   
	Wrap logging.errors, adds the stack trace when the verbosity level :py:attr:`waflib.Logs.verbose` â‰¥ 2
	i   iÿÿÿÿs     File %r, line %d, in %ss   	%ss   
N(   Rl   t   errorR?   t	   tracebackt   extract_stackt   appendt   stript   join(   Rn   R\   t   stt   buft   filenamet   linenoR   t   line(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyRo     s    
c          O   s   t  j |  | Ž  d S(   s   
	Wraps logging.warn
	N(   Rl   t   warn(   Rn   R\   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyRz     s    c          O   s   t  j |  | Ž  d S(   s   
	Wraps logging.info
	N(   Rl   t   info(   Rn   R\   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyR{     s    c          C   sk   t  j d ƒ a g  t _ g  t _ t ƒ  }  |  j t ƒ  ƒ t j |  ƒ t j	 t
 ƒ  ƒ t j t  j ƒ d S(   s5   
	Initializes the logger :py:attr:`waflib.Logs.log`
	t   waflibN(   R0   t	   getLoggerRl   t   handlerst   filtersRD   t   setFormatterRR   t
   addHandlert	   addFilterR/   t   setLevelt   DEBUG(   t   hdlr(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   init_log!  s    			c         C   sˆ   t  j | ƒ } t j d k r- t j j } n d } t  j |  d d | ƒ} t  j d ƒ } | j	 | ƒ | j
 | ƒ | j t  j ƒ | S(   s8  
	Creates a simple logger, which is often used to redirect the context command output::

		from waflib import Logs
		bld.logger = Logs.make_logger('test.log', 'build')
		bld.check(header_name='sadlib.h', features='cxx cprogram', mandatory=False)

		# have the file closed immediately
		Logs.free_logger(bld.logger)

		# stop logging
		bld.logger = None

	The method finalize() of the command will try to free the logger, if any

	:param path: file name to write the log output to
	:type path: string
	:param name: logger name (loggers are reused)
	:type name: string
	i   t   wRP   s   %(message)sN(   R0   R}   R   t
   hexversionR   RP   RU   t   FileHandlerR^   R€   R�   Rƒ   R„   (   t   pathR   t   loggerRP   R…   RR   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   make_logger/  s    i    c         C   sw   d d l  m } t j |  ƒ } | | d | ƒ} t j d ƒ } | j | ƒ | j | ƒ | | _ | j t j	 ƒ | S(   sL   
	Creates a memory logger to avoid writing concurrently to the main logger
	iÿÿÿÿ(   t   MemoryHandlert   targets   %(message)s(
   t   logging.handlersR�   R0   R}   R^   R€   R�   t
   memhandlerRƒ   R„   (   R   t   to_logt   sizeR�   R‹   R…   RR   (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   make_mem_loggerP  s    	c         C   sG   y/ x( |  j  D] } | j ƒ  |  j | ƒ q WWn t k
 rB n Xd S(   s°   
	Frees the resources held by the loggers created through make_logger or make_mem_logger.
	This is used for file cleanup and for handler removal (logger objects are re-used).
	N(   R~   t   closet   removeHandlerRc   (   R‹   t   x(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   free_logger^  s    
R   s   
c      
   C   s0   t  d t |  ƒ | t j | d i | d 6ƒd S(   sÊ  
	Prints messages in color immediately on stderr::

		from waflib import Logs
		Logs.pprint('RED', 'Something bad just happened')

	:param col: color name to use in :py:const:`Logs.colors_lst`
	:type col: string
	:param msg: message to display
	:type msg: string or a value that can be printed by %s
	:param label: a message to add after the colored output
	:type label: string
	:param sep: a string to append at the end (line separator)
	:type sep: string
	s	   %s%s%s %st   extraRO   N(   R{   Re   R   (   t   colR;   t   labelt   sep(    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   pprintj  s    (7   R.   R   Rf   Rp   R   R|   R    R   R   R   R@   R   R   t   idt
   __stdout__t   AnsiTermR   t
   __stderr__R0   R_   R`   R=   R?   R8   R    t	   indicatorRQ   t	   NameErrorRU   R#   R$   RF   R&   t   objectR'   Re   t   compilet   MR9   R1   R/   R[   RD   R^   RR   Rl   Rm   Ro   Rz   R{   R†   RŒ   R“   R—   Rœ   (    (    (    s!   /git_repos/ams-lv2/waflib/Logs.pyt   <module>   sj   0--

				$.-							!	