
    FewD                    8   d Z ddlm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
mZ ddlmZmZmZmZ ddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ erddlmZ ddlmZ  ej@                  e!      Z"dddZ#ddZ$ddZ%ddZ&ddZ' G d de      Z(ddZ)y)zCheck Python modules and C API for coverage.

Mostly written by Josip Dzolonga for the Google Highly Open Participation
contest.
    )annotationsN)import_module)path)IOTYPE_CHECKINGAnyTextIO)Builder)__)logging)red)safe_getattr)Iterator)Sphinxc                l    | j                  |dz          | j                  |t        |      z  dz          y )N
z

)writelen)ftextchars      5/usr/lib/python3/dist-packages/sphinx/ext/coverage.pywrite_headerr   "   s,    GGD4KGGD3t9v%&    c                    g }|D ]'  }	 |j                  t        j                  |             ) |S # t        $ r# t        j                  t        d      ||        Y Ww xY w)Nzinvalid regex %r in %s)appendrecompile	Exceptionloggerwarningr   )nameexpslstexps       r   compile_regex_listr&   '   sb    
C D	DJJrzz#'D
 J  	DNN267dC	Ds   $1)AAc              #    K   t        t        | d               D cg c]  t        fd| D              dz    }}t        |d       t	        || d   d      E d {    | dd  D ]  }t	        ||d      E d {     y c c}w 7 )7 w)Nr   c              3  :   K   | ]  }t        |           y wN)r   ).0xcolumns     r   	<genexpr>z_write_table.<locals>.<genexpr>2   s     /AQvY/s      -=)ranger   max	_add_line_add_row)tabler,   sizesrows    `  r   _write_tabler8   1   s     BGERSHBVWS///!3WEW
E3
uQx---QRy -E3,,,- X . 	-s-   BB#BB	 B<B=BBc                >    ddj                  fd| D              z   S )N+ c              3  4   K   | ]  }|d z   z  dz     yw)r.   r:   N )r*   size	separators     r   r-   z_add_line.<locals>.<genexpr><   s     JD)tax0C7Js   )join)r6   r?   s    `r   r3   r3   ;   s    JEJJJJr   c              #  z    K   dj                   fdt        |      D              dz    t         |       y w)Nr;   c              3  >   K   | ]  \  }}d |d|    d  yw)z| z <r;   Nr=   )r*   ir,   
col_widthss      r   r-   z_add_row.<locals>.<genexpr>@   s,     ViaBvbAp/01Vs   |)r@   	enumerater3   )rD   columnsr?   s   `  r   r4   r4   ?   s4     
''V9WCUV
VY\
\\
J	
**s   8;c                      e Zd ZdZdZ edej                  z   dz         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dZy)CoverageBuilderz:
    Evaluates coverage of code in the documentation.
    coveragezNTesting of coverage in the sources finished, look at the results in %(outdir)szpython.txt.c                   g | _         | j                  j                  D ]P  }t        j                  | j
                  |      }| j                   j                  t        j                  |             R g | _        | j                  j                  j                         D ]6  \  }}	 | j                  j                  |t        j                  |      f       8 i | _        | j                  j&                  j                         D ]  \  }}t)        d|      | j$                  |<     t)        d| j                  j*                        | _        t)        d| j                  j.                        | _        t)        d| j                  j2                        | _        t)        d| j                  j6                        | _        y # t        $ r# t        j!                  t#        d      |       Y Ew xY w)Nz&invalid regex %r in coverage_c_regexescoverage_ignore_c_itemscoverage_ignore_modulescoverage_ignore_classescoverage_ignore_functionscoverage_ignore_pyobjects)c_sourcefilesconfigcoverage_c_pathr   r@   srcdirextendglob	c_regexescoverage_c_regexesitemsr   r   r   r   r    r!   r   c_ignorexpsrL   r&   rM   mod_ignorexpsrN   cls_ignorexpsrO   fun_ignorexpsrP   py_ignorexps)selfpatternr"   r%   r#   s        r   initzCoverageBuilder.initL   s   (*{{22 	:GiiW5G%%dii&89	: =?;;99??A 	RKT3R%%tRZZ_&=>	R >@ KK??EEG 	>LT4%78Q8<&>DT"	> 00I040S0SU/0I040S0SU/0K040U0UW./J/3{{/T/TV  Rr"JKSQRs   #0F66(G"!G"c                     y)Nzcoverage overviewr=   )r_   s    r   get_outdated_docsz!CoverageBuilder.get_outdated_docsf   s    "r   c                    i | _         i | _        i | _        | j                          | j	                          i | _        | j                          | j                          y r)   )py_undocpy_undocumentedpy_documentedbuild_py_coveragewrite_py_coveragec_undocbuild_c_coveragewrite_c_coverage)r_   ignoreds     r   r   zCoverageBuilder.writei   sP    354624  8:r   c                f   i }| j                   j                  d   j                         D ]  }|d   ||d   <    | j                  D ]  }t	               }t        |d      5 }|D ]  }| j                  D ]  \  }}|j                  |      }	|	s|	j                         d   }
||vr|j                  ||
f       E|
||   vrG| j                  j                  |g       D ]  }|j                  |
      s n |j                  ||
f         	 d d d        |s|| j                  |<    y # 1 sw Y   xY w)Ncr.      utf-8encodingr   )envdomainsget_objectsrQ   setopenrW   matchgroupsaddrZ   getrj   )r_   	c_objectsobjfilenameundocr   linekeyregexry   r"   r%   s               r   rk   z CoverageBuilder.build_c_coveraget   sC   	88##C(446 	'C #AIc!f	'** 	/H*-%Eh1 %Q %D&*nn %
U %D 1 #(<<>!#4D")3 %		3+ 6 (#9S>9+/+;+;+?+?R+H !;C'*yy(-!; %*IIsDk$:$%%%" ).X&)	/% %s    +D'A"D'/D''D0	c           
        t        j                  | j                  d      }t        |dd      5 }| j                  j
                  rt        |dd       |j                  d       | j                  j                         D ]  \  }}t        ||       t        |      D ]  \  }}|j                  d|d	d
|dd       | j                  j                  s7| j                  j                  s| j                  j                  r"t        j!                  t#        d      |||       t        j%                  t'        d      dz   dz   d|d|z  z   z  z   t'        d      z   |z           |j                  d        	 d d d        y # 1 sw Y   y xY w)Nzc.txtwrq   rr   zUndocumented C API elementsr0   r   z * 50z [z>9z]
z&undocumented c api: %s [%s] in file %sundocumented  zc   z
api       %-30sz [%9s]z - in file )r   r@   outdirrx   rR   coverage_write_headliner   r   rj   rY   sortedcoverage_show_missing_itemsappquietwarningiserrorr    r!   r   infor   )r_   output_fileopr   r   typr"   s          r   rl   z CoverageBuilder.write_c_coverage   sM   iiW5+sW5 	{{22R!>DHHTN#'<<#5#5#7 %R*!' 	GICHH4=>{{>>88>>TXX-D-D"NN2.V+W+/h@ #KK,<(=(F(U(/4(S.3H(I)J(+M(:);=E)F G	G 	 	 	s   B"E>B"E>>Fc                @    t        fd| j                  D              S )Nc              3  @   K   | ]  }|j                          y wr)   )search)r*   r%   	full_names     r   r-   z/CoverageBuilder.ignore_pyobj.<locals>.<genexpr>   s"      
 JJy!
s   )anyr^   )r_   r   s    `r   ignore_pyobjzCoverageBuilder.ignore_pyobj   s#     
((
 
 	
r   c                   | j                   j                  d   d   }| j                   j                  d   d   }| j                  j                  }|D ]  }d}| j                  D ]  }|j                  |      sd} n |s| j                  |      r@	 t        |      }t               }	t               }
g }i }t        j                  |      D ]  \  }}|d   d	k(  rt!        |d
      s|j"                  |k7  r-| d| }| j                  |      rFt        j$                  |      rl||vrV| j&                  D ]  }|j                  |      s  |r|j(                  s|j+                  |       |
j-                  |       |	j-                  |       t        j.                  |      s| j0                  D ]  }|j                  |      s  ||vr|r|j(                  sg ||<   g }t3        |      D ]  }||j4                  vr	 t7        ||      }t        j:                  |      st        j$                  |      sJ|d   d	k(  rS|r|j(                  sb| d| }| j                  |      r{||vr#|j+                  |       |
j-                  |       |	j-                  |        |s|||<    ||d| j                  |<   |
| j<                  |<   |	| j>                  |<    y # t        $ r<}t        j                  t        d      ||       d|i| j                  |<   Y d }~d }~ww xY w# t8        $ r Y Iw xY w)NpyobjectsmodulesFTz#module %s could not be imported: %serrorr   _
__module__.)funcsclasses) rt   
domaindatarR   coverage_skip_undoc_in_sourcer[   ry   r   r   ImportErrorr    r!   r   re   rw   inspect
getmembershasattrr   
isfunctionr]   __doc__r   r{   isclassr\   dir__dict__r   AttributeErrorismethodrf   rg   )r_   r   r   
skip_undocmod_nameignorer%   moderrdocumented_objectsundocumented_objectsr   r   r"   r~   r   attrs	attr_nameattrfull_attr_names                       r   rh   z!CoverageBuilder.build_py_coverage   sN   ((%%d+I6((%%d+I6[[>>
 _	>HF)) 99X&!F **84#H- ,/5-0U E,.G$//4 E2	c7c>sL1>>X-'j$0	$$Y/%%c* /#'#5#5 @C"yy %@  *#++ (!LL.044Y?*..y9__S)#11 (299T?!(2 %G3)#++ (,.GDM$+-),S GI(< ()'3C'C %,$4$4T$:$+$6$6t$< ((|s2 ()$,, (09{!I;-GN#00@ (-W< %Y 7 4 8 8 H 2 6 6~ F/G2 !,1GDMKE2N 16'&JDMM(#-AD  *+=Dx(_	>  r"GH(TWX+2C.h't $2 ) ()s*   K)L1)	L.21L))L.1	L>	=L>	c           
        t        | j                  j                               j                  t        | j                  j                                     }t               }t               }|D ]\  }| j                  |   j                  | j                  |         }|j                  |      }|j                  | j                  |         }^ g dg}|D ]  }| j                  |   j                  | j                  |         }t        |      r(dt        | j                  |         z  t        |      z  }	nd}	|j                  |d|	z  dt        | j                  |         z  g        |j                  ddt        |      z  t        |      z  ddt        |      t        |      z
   g       t        |      D ]  }
|j                  |
 d	        y
)z Outputs the table of ``op``.)ModuleCoverageUndocumentedg      Y@z%.2f%%z%dTOTALd   z.2f%r   N)	rw   rg   keysunionrf   r   r   r8   r   )r_   r   all_modulesall_objectsall_documented_objectsmoduleall_module_objectsr5   module_objectsvaluer   s              r   _write_py_statisticsz$CoverageBuilder._write_py_statistics  s   $,,1134::$$))+,. #+.5! 	^F!%!3!3F!;!A!A$BVBVW]B^!_%++,>?K%;%A%A$BTBTU[B\%]"	^ 88! 	_F!//7==d>R>RSY>Z[N>"D$6$6v$> ??#nBUULL&(U"2D3t?S?STZ?[;\4\]^	_ 	S/003{3CCCHJ;#&<"==>
 	 !' 	"DHHvR[!	"r   c           
        t        j                  | j                  d      }g }t        |dd      5 }| j                  j
                  rt        |dd       | j                  j                  r| j                  t        j                         | j                  j                  r.t        |d       | j                  |       |j                  d       t        | j                  j                               }|D ]  }| j                  |   }d	|v r|j!                  ||d	   f       .|d
   s|d   s9t        ||       |d   r|j                  d       |j#                  d |d   D               | j                  j$                  r| j&                  j(                  s| j&                  j*                  r+|d   D ]"  }t,        j/                  t1        d      ||       $ nC|d   D ];  }t,        j3                  t5        d      dz   dz   d|z  z   t5        d      z   |z          = |j                  d       |d
   s>|j                  d       t        |d
   j7                               D ]  \  }}	|	s|j                  d|z         | j                  j$                  s4| j&                  j(                  s| j&                  j*                  r!t,        j/                  t1        d      ||       t,        j3                  t5        d      dz   dz   d|z  z   t5        d      z   |z          |j                  d|z         |j#                  d |	D               | j                  j$                  s| j&                  j(                  s| j&                  j*                  r*|	D ]#  }
t,        j/                  t1        d      |||
       % T|	D ]A  }
t,        j3                  t5        d      dz   dz   d|dz   |
z   z  z   t5        d      z   |z          C  |j                  d        |r$t        |d       |j#                  d |D               d d d        y # 1 sw Y   y xY w)Nz
python.txtr   rq   rr   zUndocumented Python objectsr0   
Statisticsr   r   r   r   zFunctions:
c              3  &   K   | ]	  }d |z    yw) * %s
Nr=   r*   r+   s     r   r-   z4CoverageBuilder.write_py_coverage.<locals>.<genexpr>I  s     %Li!m%L   z&undocumented python function: %s :: %sr   zpy  z
function  r   z - in module z	Classes:
r   z#undocumented python class: %s :: %sz
class     z * %s -- missing methods:

c              3  &   K   | ]	  }d |z    yw)z   - %s
Nr=   r   s     r   r-   z4CoverageBuilder.write_py_coverage.<locals>.<genexpr>f  s     -O!kAo-Or   z*undocumented python method: %s :: %s :: %sz
method    r   zModules that failed to importc              3  &   K   | ]	  }d |z    yw)z * %s -- %s
Nr=   r   s     r   r-   z4CoverageBuilder.write_py_coverage.<locals>.<genexpr>x  s     Bao1Br   )r   r@   r   rx   rR   r   r   coverage_statistics_to_stdoutr   sysstdoutcoverage_statistics_to_reportr   r   re   r   r   
writelinesr   r   r   r   r    r!   r   r   r   rY   )r_   r   failedr   r   r"   r   func
class_namemethodsmeths              r   ri   z!CoverageBuilder.write_py_coverage.  s   ii\:+sW5 G	C{{22R!>D{{88))#**5{{88R.))"-$--,,./D 6'd+e#MM4w"89 +E'N  T*W~0%LU7^%LL;;BB#xx~~1H1H,1'N !4D$*NN(*+S(T(,d%4!4
 -2'N !^D$*KK4D0E0NQ]0]07$1?AD_AU1VX\1] %^!^ Y'.39 %i 0 6 6 84: U/J#* "Z)? @#';;#J#J'+xx~~9P9P(.,./T,U,0*)> )/C8H4IF4R4@5ACJZCW5X474H5IKO5P )Q !#)H:)U V "-Ow-O O#';;#J#J'+xx~~9P9P4; )HD,2NN02 4E 1F04j$-H)H 5< )UD,2KK<L8MPV8V8D9EGN9Cc9ID9PHR9R 9<O8L9M PT9T -U)U1U: m6'p R!@AB6BBOG	C G	C G	Cs!   G>P>1A P>C	P>CP>>Qc                
   t        j                  | j                  d      }t        |d      5 }t	        j
                  | j                  | j                  | j                  | j                  f|       d d d        y # 1 sw Y   y xY w)Nzundoc.picklewb)
r   r@   r   rx   pickledumpre   rj   rf   rg   )r_   
picklepathdumpfiles      r   finishzCoverageBuilder.finishz  sn    YYt{{N;
*d# 	NxKK--t/A/ACDLN	N 	N 	Ns   AA99BN)returnNone)r   str)rm   r   r   r   )r   r   r   bool)r   r	   r   r   )__name__r   __qualname__r   r"   r   r   sepepilogra   rc   r   rk   rl   r   rh   r   ri   r   r=   r   r   rI   rI   D   sl     D (*.((35BC DFV4#	 /4*
e>N"<JCXNr   rI   c                2   | j                  t               | j                  dg d       | j                  dg d       | j                  dg d       | j                  dg d       | j                  dg d       | j                  di d       | j                  di d       | j                  d	d
d       | j                  dd
dt        f       | j                  dd
dt        f       | j                  ddd       | j                  ddd       t        j
                  d
dS )NrM   FrO   rN   rP   rS   rX   rL   r   Tr   r   r   r   )versionparallel_read_safe)add_builderrI   add_config_valuer   sphinx__display_version__)r   s    r   setupr     s   OOO$2B>4b%@2B>4b%@*B6-r592B>2D%@8$wO8$wO8%G6uE11NNr   )r/   )r   zIO[str]r   r   r   r   r   r   )r"   r   r#   r   r   zlist[re.Pattern[str]])r5   zlist[list[str]]r   Iterator[str])r6   	list[int]r?   r   r   r   )rD   r   rG   z	list[str]r?   r   r   r   )r   r   r   zdict[str, Any])*r   
__future__r   rV   r   r   r   r   	importlibr   osr   typingr   r   r   r	   r   sphinx.buildersr
   sphinx.localer   sphinx.utilr   sphinx.util.consoler   sphinx.util.inspectr   collections.abcr   sphinx.applicationr   	getLoggerr   r    r   r&   r8   r3   r4   rI   r   r=   r   r   <module>r     s    #    	 
 #  1 1  #   # ,()			8	$'
-K+
{Ng {N|	Or   