
    Je=                     J    d Z ddlZddlZddlZd Zd	dZd Zd
dZd Zd	dZ	y)za
Debug utilities that are independent of Spyder code.

See spyder.config.base for other helpers.
    Nc                     dt        j                  t        j                                z  }t        dt        |      z  |        t        ||        t        dt        |      z  |        t        d|        y )NzLogging time: %s=file )timectimeprintlen)fdtimestrs     4/usr/lib/python3/dist-packages/spyder/utils/debug.pylog_timer      sU     4::diik#::G	#c'l
$	'	#c'l
$	"2    c                 f   t        | d      }t        |       |rht        d|       t        d|       t        d|       t        ||       t        d|       t        d|       t        d|       t        d|       t        j                  |       t        d|       t        d|       y)	zBLog last error in filename *fname* -- *context*: string (optional)aContextr   z-------r   	Tracebackz	---------N)openr   r
   	traceback	print_exc)fnamecontextr   s      r   log_last_errorr      s    	eS	BRLib!ib!brgBbrk#k#brR 	"2	"2r   c           
          t        | d      }t        |       t        d|dt        dt	        j                         |z
  z        z  fz  |       t        d|       t        d|       y )Nr   z	%s: %d ms
   g      Y@r   r   )r   r   r
   roundr   )r   r   t0r   s       r   log_dtr   +   sV    	eS	BRL	+"U3		B+?%@"@A
AK	"2	"2r   c                    t        j                         }d| z   }t        |      |dz   k  ry||   d   }g }t        j                  |      }|r|j	                  |j
                         d|j                  v r2|j	                  |j                  d   j                  j
                         |j                  j                  }|dk7  r|j	                  |       ~dj                  |      S )a  
    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
    r      r   selfz<module>.)inspectstackr   	getmoduleappend__name__f_locals	__class__f_codeco_namejoin)skipr%   startparentframenamemodulecodenames          r   caller_namer4   2   s     MMOEHE
5zEAI,q/KD{+F FOO$%%% 	K((0::CCD!!))H:X88D>r   c                     t        j                  | j                        D ](  }| j                  |j                  v s|j                  c S  y N)r$   getmroim_classr(   __dict__)methodclss     r   get_class_that_definedr<   S   s8    ~~foo.  ??cll*<< r   c                    	 t        | d      j                          | |d|dk7  r|ddifdddl		fd}||_        y)	a  
    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   z,--[ %(asked)s / %(called)s / %(defined)s ]--No_Or   c                     j                   |j                  j                   t        |       d}|z  }t        t	        |      d         d<   |j                  d   d      S )zK
        --[ ShellBase / Internal / BaseEdit ]------- get_position
        )askedcalleddefinedr>   -)r(   r*   r<   maxr   ljust)r:   	methodobj
classnameslineCLASSMAXWIDTHPREFIXs       r   format_prefixz(log_methods_calls.<locals>.format_prefixo   sc    
 ^^))22-f5


 
"c$i%9zz(5/3//r   r   c                 ~     t         j                         t              j                  urS  fd}|S )Nc                      t        d      } 	      }|j                  |dd       |j                           | i |}|S )Nr    
)r   writeclose)
argskwargslogprefixresultFILENAMEattrrL   r1   r"   s
        r   newfuncz<log_methods_calls.<locals>.__getattribute__.<locals>.newfunc   sI    8S)&tT2		vt45		t.v.r   )object__getattribute__type
MethodType)r"   r1   rZ   rY   rX   rL   typess   `` @r   r\   z+log_methods_calls.<locals>.__getattribute__}   s=    &&tT2:U---K  Nr   )r   rR   r_   r\   )
r   
some_classrV   r\   rI   rX   rJ   rK   rL   r_   s
       @@@@@@r   log_methods_callsra   X   sU     	HE;F~r{H0  #3Jr   r6   )   )
__doc__r$   r   r   r   r   r   r4   r<   ra    r   r   <module>re      s4      "B 
33r   