o
     JAfr                     @   s   	 d dgZ ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZ ddlZdZG dd dZdd	 Zd
d ZG dd dZdd Zdd ZdddZdd ZG dd  d Zdd Zedkrte  dS dS )TraceCoverageResults    N)	monotonicz#pragma NO COVERc                   @   s   e Zd ZdddZdd ZdS )_IgnoreNc                 C   s:   |st  nt || _|sg ndd |D | _ddi| _d S )Nc                 S   s   g | ]}t j|qS  )ospathnormpath.0dr   r   /usr/lib/python3.10/trace.py
<listcomp>G   s    z$_Ignore.__init__.<locals>.<listcomp>z<string>   )set_mods_dirs_ignore)selfmodulesdirsr   r   r   __init__E   s
   z_Ignore.__init__c                 C   s   || j v r
| j | S || jv rd| j |< dS | jD ]}||d r*d| j |<  dS q|d u r6d| j |< dS | jD ]}||tj rKd| j |<  dS q9d| j |< dS )Nr   .r   )r   r   
startswithr   r   sep)r   filename
modulenamemodr   r   r   r   namesK   s(   









z_Ignore.namesNN)__name__
__module____qualname__r   r   r   r   r   r   r   D   s    
r   c                 C   s"   	 t j| }t j|\}}|S N)r   r   basenamesplitext)r   baser   extr   r   r   _modnamev   s   r(   c                 C   s   	 t j| }d}tjD ] }t j|}||r,|t| t jkr,t|t|kr,|}q|r:| t|d d  }n| }t j|\}}|t jd}t j	rU|t j	d}t j
|\}}|dS )N r   r   )r   r   normcasesysr   lenr   
splitdrivereplacealtsepr%   lstrip)r   ZcomparepathZlongestdirr&   driver   r'   r   r   r   _fullmodname}   s$   

r3   c                   @   s>   e Zd Z		dddZdd Zdd Zdd
dZdddZdS )r   Nc              
   C   s  || _ | j d u ri | _ | j  | _|| _| jd u ri | _| j | _|| _| jd u r-i | _| j | _|| _|| _| jrz+t| jd}t	|\}}}W d    n1 sVw   Y  | 
| ||| W d S  tttfy } ztd| j|f tjd W Y d }~d S d }~ww d S )NrbzSkipping counts file %r: %sfile)countscopyZcountercalledfuncscallersinfileoutfileopenpickleloadupdate	__class__OSErrorEOFError
ValueErrorprintr+   stderr)r   r7   r9   r;   r:   r<   ferrr   r   r   r      s:   


zCoverageResults.__init__c                 C   s   	 | do
|dS )N<>)r   endswith)r   r   r   r   r   is_ignored_filename   s   z#CoverageResults.is_ignored_filenamec           	      C   sp   	 | j }| j}| j}|j }|j}|j}|D ]}||d||  ||< q|D ]}d||< q&|D ]}d||< q/d S Nr   r   )r7   r9   r:   get)	r   otherr7   r9   r:   Zother_countsZother_calledfuncsZother_callerskeyr   r   r   r@      s   

zCoverageResults.updateTFc           "   
   C   s  	 | j r!t  td | j }t|D ]\}}}td|||f  q| jrit  td d }}	t| jD ]4\\}
}}\}}}|
|krOt  td|
d |
}d}	||
kr^|	|kr^td| |}	td||||f  q4i }| jD ]\}}||i  }||< | j||f ||< qni }| D ]\}}| |rq|dr|d d	 }|d u rt	j
t	j
|}t|}n|}t	j
|st	| t|}|rt|}ni }t|}t	j
||d
 }t|d}t|j\}}W d    n1 sw   Y  | |||||\}}|r|rtd| | }||||f||< q|r=|r=td t|D ]}|| \}}}}td||   q)| jrz)t| jd} t| j| j | jf| d W d    W d S 1 scw   Y  W d S  ty }! ztd|! tj d W Y d }!~!d S d }!~!ww d S )Nzfunctions called:z*filename: %s, modulename: %s, funcname: %szcalling relationships:r)   z***z  -->z    %s.%s -> %s.%sz.pycz.coverr4   d   zlines   cov%   module   (path)z%5d   %3d%%   %s   (%s)wbr   z"Can't save counts files because %sr5   )!r9   rE   sortedr:   r7   rN   itemsrL   rK   r   r   dirnameabspathr(   existsmakedirsr3   _find_executable_linenos	linecachegetlinesjoinr=   tokenizedetect_encodingreadlinewrite_results_fileintr<   r>   dumprB   r+   rF   )"r   Zshow_missingsummarycoverdirZcallsr   r   funcnameZlastfileZ	lastcfileZpfileZpmodZpfunccfileZcmodZcfuncZper_filelineno	lines_hitZsumscountr1   lnotabsourceZ	coverpathfpencoding_n_hitsn_linespercentmrG   rH   r   r   r   write_results   s   	






( zCoverageResults.write_resultsc              
   C   s
  	 z	t |d|d}W n ty( } ztd||f tjd W Y d }~dS d }~ww d}d}	|J t|dD ]9\}
}|
|v rO|d||
   |	d7 }	|d7 }n|
|v rat|vra|d	 |d7 }n|d
 ||d q5W d    |	|fS 1 s|w   Y  |	|fS )Nwrn   z3trace: Could not open %r for writing: %s - skippingr5   )r   r   r   r   z%5d: z>>>>>> z          )	r=   rB   rE   r+   rF   	enumeratewritePRAGMA_NOCOVER
expandtabs)r   r   linesrk   ri   rn   r<   rH   rq   rp   rh   liner   r   r   ra   (  s<   




z"CoverageResults.write_results_file)NNNNN)TFNr#   )r    r!   r"   r   rL   r@   rt   ra   r   r   r   r   r      s    

\c                 C   s.   	 i }t | D ]\}}||vrd||< q|S )Nr   )disZfindlinestarts)codestrslinenosro   rh   r   r   r   _find_lines_from_codeH  s   r   c                 C   s6   	 t | |}| jD ]}t|r|t|| q	|S r#   )r   	co_constsinspectZiscoder@   _find_lines)r   r   r   cr   r   r   r   R  s   


r   c                 C   s   	 i }t j}t| |d;}t|j}|D ])\}}}}	}
|t jkr<|t jkr<|\}}|	\}}t||d D ]}d||< q5|}qW d    |S 1 sJw   Y  |S )Nrv   r   )tokenINDENTr=   r^   generate_tokensr`   STRINGrange)r   rn   r   Z
prev_ttyperG   tokZttypeZtstrstartendr}   ZslineZscolZelineZecolir   r   r   _find_strings^  s$   





r   c              
   C   s   	 zt | }| }|j}W d    n1 sw   Y  W n ty> } ztd| |f tjd i W  Y d }~S d }~ww t|| d}t	| |}t
||S )Nz%Not printing coverage data for %r: %sr5   exec)r^   r=   readrn   rB   rE   r+   rF   compiler   r   )r   rG   progrn   rH   r   r   r   r   r   rZ   u  s&   

rZ   c                   @   sv   e Zd Z			dddZdd	 Zdd
dZdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS ) r   r   r   r   NFc
           
      C   s   	 || _ || _t||| _i | _i | _d| _|| _i | _i | _	i | _
d | _|	r+t | _|r3| j| _d S |r;| j| _d S |rI|rI| j| _| j| _d S |rU| j| _| j| _d S |ra| j| _| j| _d S d| _d S rM   )r;   r<   r   ignorer7   Zpathtobasename	donothingtrace_calledfuncs_callers_caller_cache
start_time_timeglobaltrace_trackcallersglobaltraceglobaltrace_countfuncsglobaltrace_ltlocaltrace_trace_and_count
localtracelocaltrace_tracelocaltrace_count)
r   rj   r   
countfuncscountcallers
ignoremods
ignoredirsr;   r<   timingr   r   r   r     s8   
zTrace.__init__c                 C   s    dd l }|j}| ||| d S )Nr   )__main____dict__runctx)r   cmdr   dictr   r   r   run  s   z	Trace.runc              	   C   s   |d u ri }|d u ri }| j st| j t| j zt||| W | j s2td  td  d S d S | j sBtd  td  w w r#   )r   	threadingsettracer   r+   r   )r   r   globalslocalsr   r   r   r     s   


zTrace.runctxc             	   O   sP   d }| j st| j z||i |}W | j std  |S | j s'td  w w r#   )r   r+   r   r   )r   funcargskwresultr   r   r   runfunc  s   
zTrace.runfuncc           
      C   s   |j }|j}|rt|}nd }|j}d }|| jv r&| j| d ur%| j| }nCd | j|< dd t|D }t|dkridd t|d D }t|dkridd t|d D }	t|	dkri|	d j}|| j|< |d ursd||f }|||fS )Nc                 S   s   g | ]	}t |r|qS r   )r   Z
isfunction)r   rG   r   r   r   r         
z1Trace.file_module_function_of.<locals>.<listcomp>r   c                 S   s   g | ]	}t |tr|qS r   )
isinstancer   r
   r   r   r   r     r   r   c                 S   s   g | ]	}t |d r|qS )	__bases__)hasattr)r   r   r   r   r   r     r   z%s.%s)	f_codeco_filenamer(   co_namer   gcZget_referrersr,   r    )
r   framer   r   r   rf   ZclsnameZfuncsZdictsZclassesr   r   r   file_module_function_of  s.   






zTrace.file_module_function_ofc                 C   s6   	 |dkr|  |}|  |j}d| j||f< d S d S Ncallr   )r   f_backr   )r   r   whyarg	this_funcZparent_funcr   r   r   r     s   
zTrace.globaltrace_trackcallersc                 C   s&   	 |dkr|  |}d| j|< d S d S r   )r   r   )r   r   r   r   r   r   r   r   r     s
   
zTrace.globaltrace_countfuncsc                 C   sr   	 |dkr7|j }|jdd }|r5t|}|d ur1| j||}|s3| jr.td||jf  | j	S d S d S d S d S )Nr   __file__z! --- modulename: %s, funcname: %s)
r   	f_globalsrN   r(   r   r   r   rE   r   r   )r   r   r   r   r   r   r   Z	ignore_itr   r   r   r     s$   zTrace.globaltrace_ltc                 C   s   |dkr?|j j}|j}||f}| j|dd | j|< | jr*tdt | j  dd tj	
|}td||t||f dd | jS )	Nr}   r   r   %.2f r   
%s(%d): %sr)   )r   r   f_linenor7   rN   r   rE   r   r   r   r$   r[   getliner   )r   r   r   r   r   rh   rP   bnamer   r   r   r   '  s   
z Trace.localtrace_trace_and_countc                 C   sd   |dkr/|j j}|j}| jrtdt | j  dd tj|}td||t	
||f dd | jS )Nr}   r   r   r   r   r)   )r   r   r   r   rE   r   r   r   r$   r[   r   r   )r   r   r   r   r   rh   r   r   r   r   r   6  s   
zTrace.localtrace_tracec                 C   s<   |dkr|j j}|j}||f}| j|dd | j|< | jS )Nr}   r   r   )r   r   r   r7   rN   r   )r   r   r   r   r   rh   rP   r   r   r   r   C  s   zTrace.localtrace_countc                 C   s   t | j| j| j| j| jdS )N)r;   r<   r9   r:   )r   r7   r;   r<   r   r   )r   r   r   r   resultsK  s
   
zTrace.results)	r   r   r   r   r   r   NNFr   )r    r!   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s     
2
)	c                     s  dd l } |  }|jdddd |dd}|jdd	d
dd |jddd
dd |jddd
dd |jddd
dd |d}| }|jddd
dd |jddd
dd |jdddd  |jd!d"d#d  |jd$d%d
d&d |jd'd(d
d)d |jd*d+d
d,d |d-d.}|jd/d0g d1d2 |jd3d0g d4d2 |jd5d
d6d7d2 |jd8d9d:d; |jd<| jd=d; | }|jrt	d>t	d?  fd@dAdBdC |j
D |_
fdDdC|jD |_|jr|js|dE t|j|jdF}||j|j|jS t|j|j|j|jgs|dG |jr|js|jr|dH |jr+|js+|dI |jd u r6|dJ t|j|j|j|j|j
|j|j|j|jdK	}zk|jrudd l}|j}||\}	}
}|jg|jt _!dL|j|
j"|
j#|
d dM}n:|jg|jt _!t$j%&|jt j%d< t'|jdN}t(|) |jdO}W d    n	1 sw   Y  |jdLd d dP}|*||| W n( t+y } zt ,dQt j!d |f  W Y d }~nd }~w t-y   Y nw |. }|j/s||j|j|j d S d S )RNr   z	--versionversionz	trace 2.0)actionr   zMain optionsz(One of these (or --report) must be givenz-cz--count
store_truezCount the number of times each line is executed and write the counts to <module>.cover for each module executed, in the module's directory. See also --coverdir, --file, --no-report below.)r   helpz-tz--tracez3Print each line to sys.stdout before it is executedz-lz--listfuncszKeep track of which functions are executed at least once and write the results to sys.stdout after the program exits. Cannot be specified alongside --trace or --count.z-Tz--trackcallsz^Keep track of caller/called pairs and write the results to sys.stdout after the program exits.Z	Modifiersz-rz--reportzGenerate a report from a counts file; does not execute any code. --file must specify the results file to read, which must have been created in a previous run with --count --file=FILEz-Rz--no-reportz^Do not generate the coverage report files. Useful if you want to accumulate over several runs.z-fz--filez+File to accumulate counts over several runs)r   z-Cz
--coverdirzDirectory where the report files go. The coverage report for <package>.<module> will be written to file <dir>/<package>/<module>.coverz-mz	--missingz?Annotate executable lines that were not executed with ">>>>>> "z-sz	--summaryz\Write a brief summary for each file to sys.stdout. Can only be used with --count or --reportz-gz--timingzQPrefix each line with the time since the program started. Only used while tracingZFilterszCan be specified multiple timesz--ignore-moduleappendzqIgnore the given module(s) and its submodules (if it is a package). Accepts comma separated list of module names.)r   defaultr   z--ignore-dirzWIgnore files in the given directory (multiple directories can be joined by os.pathsep).z--moduleFzTrace a module. progname?zfile to run as main program)nargsr   	argumentszarguments to the programZstdlibZ
platstdlibc                    s4   t jt j| } | dd } t j| S )Nz$prefixz$exec_prefix)r   r   
expanduser
expandvarsr.   r	   )s)_exec_prefix_prefixr   r   parse_ignore_dir  s   zmain.<locals>.parse_ignore_dirc                 S   s$   g | ]}| d D ]}| q	qS ),)splitstrip)r   r   r   r   r   r   r     s
    
zmain.<locals>.<listcomp>c                    s&   g | ]}| tjD ]} |q
qS r   )r   r   pathsep)r   r   r   )r   r   r   r     s
    z-r/--report requires -f/--file)r;   r<   zLmust specify one of --trace, --count, --report, --listfuncs, or --trackcallsz8cannot specify both --listfuncs and (--trace or --count)z3--summary can only be used with --count or --reportz3progname is missing: required with the main options)r   r   r   r   r;   r<   r   r   )r    r   __package__
__loader____spec__
__cached__r4   r   )r   r    r   r   zCannot run file %r because: %s)0argparseArgumentParseradd_argumentadd_argument_groupadd_mutually_exclusive_group	REMAINDER
parse_argsZ
ignore_dir	sysconfigZget_pathZignore_modulereportr6   errorr   rt   missingrd   re   anyr   rj   Z	listfuncsZ
trackcallsr   r   r   modulerunpyZ_get_module_detailsr   r   r+   argvparentloaderr   r   rV   r=   r   r   r   rB   exit
SystemExitr   Z	no_report)r   parsergrpZ_grpZoptsr   tr   module_nameZmod_nameZmod_specr   Zglobsrm   rH   r   )r   r   r   r   mainQ  s   





















	$r  r   r#   )__all__r[   r   r+   r   r   r^   r   r   r~   r>   timer   r   r   rz   r   r(   r3   r   r   r   r   rZ   r   r  r    r   r   r   r   <module>   s>   2 0

 O 
