
    ^hX                        S r SSKrSSKrSSKrSSKrSSKJr  SSKrSSK	J
r
  \R                  " \5      r\R                  R                  r\R                   SSSS1r " S	 S
\R$                  5      r " S S\R(                  5      rS r\S:X  a  SSKr\R                  R1                  SS5        \r\" 5         \R5                  5       r\   SSKr\R8                  R;                  \5        \
" \R8                  5         \R<                  " 5       rSSS5        SSS5        \R@                  " \5        gg! , (       d  f       N*= f! , (       d  f       N3= f)z
Example of simple code coverage implemented using Pyccolo.

Run as `python pyccolo/examples/coverage.py` from the repository root.
    N)Counter)patch_meta_pathz
version.pyz_version.pyzemit_event.pyzimport_hooks.pyc                   .   ^  \ rS rSrS rU 4S jrSrU =r$ )CountStatementsVisitor!   c                     SU l         g )Nr   	num_stmts)selfs    S/home/james-whalen/.local/lib/python3.13/site-packages/pyccolo/examples/coverage.py__init__CountStatementsVisitor.__init__"   s	        c                   > [        U[        R                  5      (       a  [        U[        R                  5      (       d  U =R                  S-  sl        [        U[        R
                  5      (       aD  [        UR                  [        R                  5      (       a  UR                  R                  S:X  a  g [        TU ])  U5        g )N   TYPE_CHECKING)
isinstanceaststmtRaiser
   IftestNameidsupergeneric_visit)r   node	__class__s     r   r   $CountStatementsVisitor.generic_visit%   sy    dCHH%%dCII..!#4((tyy#((33IILLO3d#r   r	   )__name__
__module____qualname____firstlineno__r   r   __static_attributes____classcell__r   s   @r   r   r   !   s    
$ 
$r   r   c                      ^  \ rS rSrSrU 4S jrS\S\4S jrS\S\	4S jr
\R                  " \R                  5      S	 5       rSS
 jrSrU =r$ )CoverageTracer2   Fc                    > [         TU ]  " U0 UD6  [        5       U l        [	        5       U l        [        5       U l        g N)r   r   set
seen_stmtsr   stmt_count_by_fnamer   count_static_statements_visitor)r   argskwargsr   s      r   r   CoverageTracer.__init__5   s3    $)&)%#*9 /E/G,r   pathreturnc                    [        US5       nUR                  5       n U R                  R                  [        R
                  " U5      5        S S S 5        U R                  R                  nSU R                  l        U$ ! [         a-    U R                  R                  U R                  U5      5         Ngf = f! , (       d  f       Nq= f)Nrr   )openreadr/   visitr   parseSyntaxErrorr
   )r   r3   fcontentsrets        r   count_statementsCoverageTracer.count_statements;   s    $_vvxHQ44::399X;NO  22<<9:,,6
  Q 44::4::h;OPQ	 _s(   B9/A??4B63B95B66B99
Cfilenamec                 r   ^ ST;   d  ST;   a  gST;   =(       a    [        U4S j[         5       5      (       + $ )Nztest/examplesFpyccoloc              3   F   >#    U  H  nTR                  U5      v   M     g 7fr+   )endswith).0exceptedrA   s     r   	<genexpr>8CoverageTracer.should_instrument_file.<locals>.<genexpr>M   s"      1
8FHHh''s   !)anyEXCEPTED_FILES)r   rA   s    `r   should_instrument_file%CoverageTracer.should_instrument_fileH   s@    h*"8H$ 
S 1
8F1
 .
 *
 	
r   c                     UR                   R                  nUR                  [        R                  5      (       a  g X R
                  ;  a3  U R                  U==   S-  ss'   U R
                  R                  U5        g g )Nr   )f_codeco_filename
startswithpycSANDBOX_FNAME_PREFIXr-   r.   add)r   _retstmt_idframe___fnames          r   handle_stmtCoverageTracer.handle_stmtQ   sb    ((C4455//)$$U+q0+OO( *r   c           
      j   Sn[        U R                  R                  5       5       H  nUR                  [        R
                  5      (       a  M)  SUR                  SS5      S   -   nU R                  U   nU R                  U5      nX-  n[        R                  SUUU[        U5      U-  5        M     [        U R                  5      n[        R                  SU5        [        R                  SU5        US:X  a  [        R                  SU5        g [        R                  S	[        U5      U-  5        g )
Nr   .r   z([%-40s]: seen=%4d, total=%4d, ratio=%.3fznum stmts seen: %sznum stmts total: %sz"Counted 0 total statements; saw %dzratio: %.3f)sortedr.   keysrR   rS   rT   splitr?   loggerwarningfloatlenr-   error)r   total_stmtsr[   	shortenedseentotal_in_filenum_seen_stmtss          r   exit_tracing_hook CoverageTracer.exit_tracing_hook[   s   D4499;<E 8 899ekk#q1"55I++E2D 11%8M(KNN:dm+ = T__-+^<,k:!LL=~NNN=%*?+*MNr   )r/   r-   r.   )r4   N)r    r!   r"   r#   bytecode_caching_allowedr   strintr?   boolrM   rS   register_raw_handlerbefore_stmtr\   rn   r$   r%   r&   s   @r   r(   r(   2   sd    $HS S 
s 
t 
 	coo.) /)O Or   r(   c                      / n [         R                   H,  nUR                  S5      (       d  M  U R                  U5        M.     U  H  n[         R                  U	 M     g )NrD   )sysmodulesrR   append)	to_deletemods     r   remove_pyccolo_modulesr|   t   sJ    I{{>>)$$S!  KK r   __main__r_   )!__doc__r   loggingosrw   collectionsr   rD   rS   pyccolo.import_hooksr   	getLoggerr    rd   r3   joinSANDBOX_FNAMErL   NodeVisitorr   
BaseTracerr(   r|   pytestinsertorig_pycinstancetracer_TRACER_STACKry   console_main	exit_codeexit r   r   <module>r      s(  
   	 
   0			8	$ 
ww||  $S__ $"?OS^^ ?OD zHHOOAs H$$&F	
 	  (S../++-I 0 
 HHY%   0/ 
s$   
2E<D2E2
E 	<E
E