ó
‹²,]c           @  s   d  Z  d d l m Z d d l Z d d l Z d d l Z d d l m Z d „  Z d d „ Z
 d „  Z d d	 „ Z d
 „  Z d d „ Z d S(   sa   
Debug utilities that are independent of Spyder code.

See spyder.config.base for other helpers.
iÿÿÿÿ(   t   print_functionN(   t   PY2c         C  sq   d t  j t  j  ƒ  ƒ } t d t | ƒ d |  ƒt | d |  ƒt d t | ƒ d |  ƒt d d |  ƒd  S(   Ns   Logging time: %st   =t   filet    (   t   timet   ctimet   printt   len(   t   fdt   timestr(    (    s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   log_time   s
    c         C  s  t  |  d ƒ } t | ƒ | rÓ t d d | ƒt d d | ƒt d d | ƒt r€ t d j | ƒ j d ƒ j ƒ  d | ƒn t | d | ƒt d d | ƒt d d | ƒt d	 d | ƒt d d | ƒn  t j d | ƒ t d d | ƒt d d | ƒd
 S(   sB   Log last error in filename *fname* -- *context*: string (optional)t   at   ContextR   s   -------R   u    s   utf-8t	   Tracebacks	   ---------N(	   t   openR   R   R   t   joint   encodet   stript	   tracebackt	   print_exc(   t   fnamet   contextR	   (    (    s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   log_last_error   s     
+c         C  so   t  |  d ƒ } t | ƒ t d | d t d t j ƒ  | ƒ f d | ƒt d d | ƒt d d | ƒd  S(   NR   s	   %s: %d msi
   g      Y@R   R   (   R   R   R   t   roundR   (   R   R   t   t0R	   (    (    s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   log_dt2   s
    
2i   c         C  sÐ   t  j ƒ  } d |  } t | ƒ | d k  r0 d S| | d } g  } t  j | ƒ } | rl | j | j ƒ n  d | j k r˜ | j | j d j j ƒ n  | j j	 } | d k rÀ | j | ƒ n  ~ d j
 | ƒ S(   s   
    Get name of a caller in the format module.class.method

    `skip` specifies how many levels of call stack to skip for caller's name.
    skip=1 means "who calls me", skip=2 "who calls my caller" etc.
       
    An empty string is returned if skipped levels exceed stack height
    i    i   R   t   selfs   <module>t   .(   t   inspectt   stackR   t	   getmodulet   appendt   __name__t   f_localst	   __class__t   f_codet   co_nameR   (   t   skipR   t   startt   parentframet   namet   modulet   codename(    (    s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   caller_name9   s     	
c         C  s:   x3 t  j |  j ƒ D] } |  j | j k r | j Sq Wd  S(   N(   R   t   getmrot   im_classR!   t   __dict__(   t   methodt   cls(    (    s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   get_class_that_definedZ   s    c           sŠ   t  |  d ƒ j ƒ  |  ‰ | ‰  d ‰ | d k r: | ‰ n  i d d 6‰ ‡  ‡ ‡ f d †  ‰ d d l ‰ ‡ ‡ ‡ f d †  } | | _ d S(	   sà  
    Hack `some_class` to log all method calls into `fname` file.
    If `prefix` format is not set, each log entry is prefixed with:
      --[ asked / called / defined ] --
        asked   - name of `some_class`
        called  - name of class for which a method is called
        defined - name of class where method is defined
    
    Must be used carefully, because it monkeypatches __getattribute__ call.
    
    Example:  log_methods_calls('log.log', ShellBaseWidget)
    R   s,   --[ %(asked)s / %(called)s / %(defined)s ]--i
   t   o_Oc           se   i ˆ  j  d 6| j j  d 6t |  ƒ d 6} ˆ | } t t | ƒ ˆ d ƒ ˆ d <| j ˆ d d ƒ S(   sK   
        --[ ShellBase / Internal / BaseEdit ]------- get_position
        t   askedt   calledt   definedR3   t   -(   R!   R#   R2   t   maxR   t   ljust(   R0   t	   methodobjt
   classnamest   line(   t   CLASSt   MAXWIDTHt   PREFIX(    s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   format_prefixv   s    

iÿÿÿÿNc           sN   t  j ˆ ˆ ƒ ‰  t ˆ  ƒ ˆ j k	 r+ ˆ  S‡ ‡  ‡ ‡ ‡ f d †  } | Sd  S(   Nc            sR   t  ˆ  d ƒ } ˆ ˆ ˆ ƒ } | j d | ˆ f ƒ | j ƒ  ˆ |  | Ž  } | S(   NR   s   %s %s
(   R   t   writet   close(   t   argst   kwargst   logt   prefixt   result(   t   FILENAMEt   attrR@   R)   R   (    s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   newfunc‰   s    
(   t   objectt   __getattribute__t   typet
   MethodType(   R   R)   RJ   (   RH   R@   t   types(   RI   R)   R   s1   lib/python2.7/site-packages/spyder/utils/debug.pyRL   „   s
    (   R   RB   t   NoneRO   RL   (   R   t
   some_classRF   RL   (    (   R=   RH   R>   R?   R@   RO   s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   log_methods_calls_   s    	(   t   __doc__t
   __future__R    R   R   R   t   spyder.py3compatR   R   RP   R   R   R,   R2   RR   (    (    (    s1   lib/python2.7/site-packages/spyder/utils/debug.pyt   <module>   s   		!	