
    G@d=                     L    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	dS )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|            d S )NzLogging time: %s=file )timectimeprintlen)fdtimestrs     2lib/python3.11/site-packages/spyder/utils/debug.pylog_timer      s     4:dikk#:#::G	#c'll
$$$$	'	#c'll
$$$$	"2    c                    t          | d          }t          |           |rt          d|           t          d|           t          d|           t          ||           t          d|           t          d|           t          d|           t          d|           t          j        |           t          d|           t          d|           dS )	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RLLL 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|           d S )Nr   z	%s: %d ms
   g      Y@r   r   )r   r   r
   roundr   )r   r   t0r   s       r   log_dtr   +   s    	eS		BRLLL	+"U3	B+?%@%@"@A
AKKKK	"2	"2r      c                    t          j                    }d| z   }t          |          |dz   k     rdS ||         d         }g }t          j        |          }|r|                    |j                   d|j        v r*|                    |j        d         j        j                   |j        j	        }|dk    r|                    |           ~d
                    |          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_namer5   2   s     MOOEHE
5zzEAIR,q/KD{++F  %FO$$$%%% 	K(0:CDDD!)H:X88D>>r   c                 l    t          j        | j                  D ]}| j        |j        v r	|j        c S d S N)r%   getmroim_classr)   __dict__)methodclss     r   get_class_that_definedr=   S   sI    ~fo..    ?cl**< +   r   c                    	 t          | d                                           | |d|dk    r|ddifdddl		fd}||_        dS )	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<   |                    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   sk    
 ^)2-f55
 


 
"c$ii%99zz(5/3///r   r   c                      t                                          t                    j        urS  fd}|S )Nc                      t          d          } 	          }|                    |dd           |                                  | i |}|S )Nr    
)r   writeclose)
argskwargslogprefixresultFILENAMEattrrM   r2   r#   s
        r   newfuncz<log_methods_calls.<locals>.__getattribute__.<locals>.newfunc   sh    8S))&tT22		vvvttt4555		t.v..r   )object__getattribute__type
MethodType)r#   r2   r[   rZ   rY   rM   typess   `` @r   r]   z+log_methods_calls.<locals>.__getattribute__}   sh    &&tT22::U---K         Nr   )r   rS   r`   r]   )
r   
some_classrW   r]   rJ   rY   rK   rL   rM   r`   s
       @@@@@@r   log_methods_callsrb   X   s     	HE;F~~r{H0 0 0 0 0 0 0 LLL       #3Jr   r7   )r    )
__doc__r%   r   r   r   r   r   r5   r=   rb    r   r   <module>re      s               "     B     
33 33 33 33 33 33r   