
    Ri#X                       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	Z	ddl
Z
ddlmZ ddl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mZmZmZ ddlmZm Z m!Z! ddl"m#Z# ddl$m%Z%  ejL                  e'      Z(dddZ)ddZ*ddZ+ddZ,	 	 	 	 	 	 	 	 ddZ-	 	 	 	 	 	 ddZ.	 	 	 	 	 	 	 	 	 	 d dZ/ G d de      Z0d!dZ1y)"zCheck Python modules and C API for coverage.

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

)writelen)ftextchars      K/home/agent/.friday_env/lib/python3.12/site-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>5   s     /AQvY/s      -=)ranger   max	_add_line_add_row)tabler/   sizesrows    `  r   _write_tabler;   4   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)r1   r=   N )r-   size	separators     r   r0   z_add_line.<locals>.<genexpr>?   s     JD)tax0C7Js   )join)r9   rB   s    `r   r6   r6   >   s    JEJJJJr   c              #  ~    K   dj                   fdt        |      D              }| d t         |       y w)Nr>   c              3  >   K   | ]  \  }}d |d|    d  yw)z| z <r>   Nr@   )r-   ir/   
col_widthss      r   r0   z_add_row.<locals>.<genexpr>E   s,     ViaBvbAp/01Vs   |)rC   	enumerater6   )rG   columnsrB   r:   s   `   r   r7   r7   B   s:      ''V9WCUV
VCE)O
J	
**s   :=c                v    t         fd|D              r
t               S t               } h}|j                  |S |j                  j                  }t        j                  |      D ]N  \  }}dk(  r|r|t          d |      z  }$t        fd|D              r9|j                    d        P |S )am  Recursively load all submodules.

    :param mod_name: The name of a module to load submodules for.
    :param ignored_module_exps: A list of regexes for modules to ignore.
    :returns: A set of modules names including the provided module name,
        ``mod_name``
    :raises ImportError: If the module indicated by ``mod_name`` could not be
        loaded.
    c              3  @   K   | ]  }|j                          y wr,   match)r-   r(   mod_names     r   r0   z _load_modules.<locals>.<genexpr>V   s     
>3399X
>   __main__.c              3  @   K   | ]  }|j                          y wr,   rM   )r-   r(   sub_mod_names     r   r0   z _load_modules.<locals>.<genexpr>g   s     Js399\*JrP   )	anysetr   __spec__submodule_search_locationspkgutiliter_modules_load_modulesadd)rO   ignored_module_expsmodmodulessearch_locations_sub_mod_ispkgrT   s   `      @r   r[   r[   J   s     
>*=
>>u 
!CjG
||||>>*1*>*>?O*P 	6&<:%}z<.%ACVWWGJ6IJJKK8*Al^45	6 Nr   c                   | st        |      S t               }| D ]  }	 |t        ||      z  } ||z
  x}r.t        j                  t        d      dj                  |             ||z
  x}r.t        j                  t        d      dj                  |             t        |      S # t        $ r1}t        j                  t        d      ||       d|i||<   Y d}~d}~ww xY w)a3  Return a sorted list of modules to check for coverage.

    Figure out which of the two operating modes to use:

    - If 'coverage_modules' is not specified, we check coverage for all modules
      seen in the documentation tree. Any objects found in these modules that are
      not documented will be noted. This will therefore only identify missing
      objects, but it requires no additional configuration.

    - If 'coverage_modules' is specified, we check coverage for all modules
      specified in this configuration value. Any objects found in these modules
      that are not documented will be noted. In addition, any objects from other
      modules that are documented will be noted. This will therefore identify both
      missing modules and missing objects, but it requires manual configuration.
    #module %s could not be imported: %serrorNzSthe following modules are documented but were not specified in coverage_modules: %sz, zSthe following modules are specified in coverage_modules but were not documented: %s)sortedrV   r[   ImportErrorr#   r$   r   rC   )	coverage_modulesseen_modulesr]   py_undocr_   rO   erradditional_modulesmissing_moduless	            r   _determine_py_coverage_modulesrn   n   s    * l##G$ 	}X/BCCG *G333* II()	
 "L000. IIo&	
 '?5  	NN2CDhPST")3HX		s   B$$	C-'CCc                      e Zd ZdZdZ ed      j                  ej                  j                        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)CoverageBuilderz0Evaluates coverage of code in the documentation.coveragez^Testing of coverage in the sources finished, look at the results in %(outdir)s{sep}python.txt.)sepc           	        g | _         | j                  j                  D ]H  }| j                  |z  }| j                   j	                  t        j
                  t        |                   J g | _        | j                  j                  j                         D ]6  \  }}	 | j                  j                  |t        j                  |      f       8 | j                  j"                  j                         D ci c]  \  }}|t%        d|       c}}| _        t%        d| j                  j(                        | _        t%        d| j                  j,                        | _        t%        d| j                  j0                        | _        t%        d| j                  j4                        | _        y # t        $ r# t        j                  t!        d      |       Y @w xY wc c}}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_pathsrcdirextendglobstr	c_regexescoverage_c_regexesitemsr   r    r!   r"   r#   r$   r   rt   r)   c_ignorexpsru   mod_ignorexpsrv   cls_ignorexpsrw   fun_ignorexpsrx   py_ignorexps)selfpatternr%   r(   r&   s        r   initzCoverageBuilder.init   s   (*{{22 	?GkkG+G%%diiG&=>	? =?77==? 	RID#R%%tRZZ_&=>	R #kkAAGGI>
d $%>EE>
 0%t{{'J'J
 0%t{{'J'J
 0')N)N
 /')N)N
!  Rr"JKSQR>
s   0F)4G)(GGc                     y)Nzcoverage overviewr@   )r   s    r   get_outdated_docsz!CoverageBuilder.get_outdated_docs   s    "r   c                    i | _         i | _        i | _        | j                          | j	                          i | _        | j                          | j                          y r,   )rj   py_undocumentedpy_documentedbuild_py_coveragewrite_py_coveragec_undocbuild_c_coveragewrite_c_coverage)r   	_docnamess     r   write_documentszCoverageBuilder.write_documents   sP    354624  8:r   c                t   i }| j                   j                  j                  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                  |d      D ]  }|j                  |
      s n |j                  ||
f         	 d d d        |s|| j                  |<    y # 1 sw Y   xY w)Nr1      utf-8encodingr   r@   )envdomainsc_domainget_objectsry   rV   openr   rN   groupsr\   r   getr   )r   	c_objectsobjfilenameundocr   linekeyregexrN   r%   r(   s               r   r   z CoverageBuilder.build_c_coverage   sD   	88##,,88: 	'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.6D..D7	c                   | j                   dz  }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                  dk  r"t        j                  t        d      |||       rt        j                  t        d      d| d
|dddz   t        d      z   |z           |j                  d        	 d d d        y # 1 sw Y   y xY w)Nzc.txtwr   r   zUndocumented C API elementsr3   r    * z<50z [z>9z]
r   z&undocumented c api: %s [%s] in file %sundocumented  zc   api       ]<30z - in file )outdirr   rz   coverage_write_headliner   r   r   r   rf   coverage_show_missing_items	verbosityr#   r$   r   infor   )r   output_fileopr   r   typr%   s          r   r   z CoverageBuilder.write_c_coverage   sR   kkG++sW5 	{{22R!>DHHTN#'<<#5#5#7 %R*!' ICHHs4*Bs2hc:;{{>>;;0014"NN "#K L $ # (	 #KK #$4 5$2dV2c"XQ3G2L"M!N"%m"4!5 #+!+" '	 	 	s   B"EBEEc                @    t        fd| j                  D              S )Nc              3  @   K   | ]  }|j                          y wr,   )search)r-   r(   	full_names     r   r0   z/CoverageBuilder.ignore_pyobj.<locals>.<genexpr>  s     FS3::i(FrP   )rU   r   )r   r   s    `r   ignore_pyobjzCoverageBuilder.ignore_pyobj  s    FD4E4EFFFr   c                   t        | j                  j                  d   d         }t        | j                  j                  d   d         }| j                  j                  }t        | j                  j                  || 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|j1                  |       |j3                  |       |
j3                  |       t#        j4                  |      s| j6                  D ]  }|j                  |      s  ||vr|r|j.                  sg ||<   g }t9        |      D ]  }||j:                  vr	 t=        ||      }t#        j@                  |      st#        j*                  |      sJ|d   d	k(  rS|r|j.                  sb| d| }| j                  |      r{||vr#|j1                  |       |j3                  |       |
j3                  |        |s|||<    ||d| j                  |<   || jB                  |<   |
| jD                  |<    y # t        $ r<}	t        j                  t        d      ||	       d|	i| j                  |<   Y d }	~	d }	~	ww xY w# t>        $ r Y Iw xY w)Npyobjectsr_   FTrd   re   r   ra   
__module__rR   )funcsclasses)#	frozensetr   
domaindatarz   coverage_skip_undoc_in_sourcern   rh   r   rj   rN   r   r   rg   r#   r$   r   rV   inspect
getmembershasattrr   
isfunctionr   __doc__r   r\   isclassr   dir__dict__r
   AttributeErrorismethodr   r   )r   seen_objectsri   
skip_undocr_   rO   ignorer(   r^   rk   documented_objectsundocumented_objectsr   r   r%   r   r   attrs	attr_nameattrfull_attr_names                        r   r   z!CoverageBuilder.build_py_coverage  s    !4!4T!:9!EF !4!4T!:9!EF[[>>
0KK((MM	
   ^	>HF)) 99X&!F **84#H- ,/5-0U E,.G$//4 D2	c7c>sL1>>X-'j$0	$$Y/%%c* 4#'#5#5 @C"yy %@  *#++ (!LL.044Y?*..y9__S)#11 '299T?!'2 %L8)#++ (,.GDM$+-),S GI(< ()'3C'C %,$4$4T$:g>P>PQU>V ((|s2 ()$,, (09{!I;-GN#00@ (-\A %Y 7 4 8 8 H 2 6 6~ F-G0 !,1GDMID2L 16'&JDMM(#-AD  *+=Dx(}^	>  r"GH(TWX+2C.h't $2 ) ()s*   L1M91	M6:1M11M69	N	N	c                X   t        | j                  j                         | j                  j                         z        }t	               }t	               }|D ]6  }|| j                  |   | j                  |   z  z  }|| j                  |   z  }8 g dg}t        |      D ]  }| j                  |   | j                  |   z  }t        |      r(dt        | j                  |         z  t        |      z  }nd}|j                  ||ddt        t        | j                  |               g        |rG|j                  ddt        |      z  t        |      z  ddt        |      t        |      z
   g       n|j                  g d       |j                  d t        |      D               y	)
zOutputs the table of ``op``.)ModuleCoverageUndocumentedg      Y@z.2f%TOTALd   )r   1000c              3  &   K   | ]	  }| d   yw)r   Nr@   )r-   r   s     r   r0   z7CoverageBuilder._write_py_statistics.<locals>.<genexpr>  s     BdbkBs   N)r   r   keysr   rV   rf   r   r   r   
writelinesr;   )	r   r   all_modulesall_objectsall_documented_objectsmoduler8   module_objectsvalues	            r   _write_py_statisticsz$CoverageBuilder._write_py_statistics  s    2 2 7 7 9D<P<P<U<U<W WX #+.5! 	AF4--f58L8LV8TTTK"d&8&8&@@"	A
 88[) 	F!//7$:N:Nv:VVN>"D$6$6v$> ??#nBUULL+QC,,V456 	 LL344s;7GGLAN{#c*@&AAB  LL./
Bl5.ABBr   c                   | j                   dz  }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"                  dk  r+|d   D ]"  }t$        j'                  t)        d      ||       $ n>|d   D ]6  }t$        j+                  t-        d      d|dz   t-        d      z   |z          8 |j                  d       |d
   s&|j                  d       t        |d
   j/                               D ]j  \  }}	|	s|j                  d| d       | j                  j                   s5| j                  j"                  dk  r!t$        j'                  t)        d      ||       ot$        j+                  t-        d      d|dz   t-        d      z   |z          |j                  d| d       |j                  d |	D               | j                  j                   s| j                  j"                  dk  r*|	D ]#  }
t$        j'                  t)        d      |||
       % +|	D ];  }
t$        j+                  t-        d      d| d|
 dz   t-        d      z   |z          = m |j                  d        |r$t	        |d       |j                  d |D               d d d        y # 1 sw Y   y xY w)Nz
python.txtr   r   r   zUndocumented Python objectsr3   
Statisticsr   re   r   r   zFunctions:
c              3  (   K   | ]
  }d | d  yw)r   r   Nr@   r-   r.   s     r   r0   z4CoverageBuilder.write_py_coverage.<locals>.<genexpr>  s     %JaA3bk%J   r   z&undocumented python function: %s :: %sr   zpy  function  r   z - in module z	Classes:
r   z#undocumented python class: %s :: %szpy  class     z -- missing methods:

c              3  (   K   | ]
  }d | d  yw)z   - r   Nr@   r   s     r   r0   z4CoverageBuilder.write_py_coverage.<locals>.<genexpr>  s     -MaSm-Mr   z*undocumented python method: %s :: %s :: %szpy  method    rR   zModules that failed to importc              3  4   K   | ]  \  }}d | d| d  yw)r   z -- r   Nr@   )r-   r%   rk   s      r   r0   z4CoverageBuilder.write_py_coverage.<locals>.<genexpr>  s#     N)$D6cU"5Ns   )r   r   rz   r   r   coverage_statistics_to_stdoutr   sysstdoutcoverage_statistics_to_reportr   rf   rj   r   r   r   r   r   r#   r$   r   r   r   r   )r   r   failedr   r   r%   r   func
class_namemethodsmeths              r   r   z!CoverageBuilder.write_py_coverage  s   kkL0+sW5 X	O{{22R!>D{{88))#**5{{88R.))"-$--,,./D G'd+e#MM4w"89 +E'N  T*W~0%J5>%JJ;;BB#{{44q8,1'N !&D$*NN(*+S(T(,(,%&!& -2'N !&D$*KK(+,<(=,:4**E)F*-o*>)? +/)/%&!& Y'.39%	:J:P:P:R3S './J#* "3zl")= >#';;#J#J'+{{'<'<q'@(.,./T,U,0,6)* )/,/0@,A0>z#>N.O-P.1/.B-C /3-3)* !#3zl:R)S T "-MW-M M#';;#J#J'+{{'<'<q'@4; 	).D,2NN025F12 150:04-.	). 5< ).D,2KK034D0E4Bj\QRSWRXCYZ]B^2_1`25o2F1G 3717-.).C'.P OG'R R!@ANvNNqX	O X	O X	Os!   G&O&A!O&*B2O&C O&&O/c                    | j                   dz  }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   pickledumprj   r   r   r   )r   
picklepathdumpfiles      r   finishzCoverageBuilder.finish  s`    [[>1
*d# 	xKKd.B.BDDVDVW	 	 	s   AA((A1N)returnNone)r  r   )r   Set[str]r  r  )r   r   r  bool)r   r   r  r  )__name__r   __qualname__r   r%   r   formatospathrr   epilogr   r   r   r   r   r   r   r   r   r  r@   r   r   rp   rp      sl    :D	0 ff 

<#	 /48Gj>X!CF[Ozr   rp   c           	        | j                  t               | j                  dddt        t        t
        h             | j                  dg dt        t        t
        h             | j                  dg dt        t        t
        h             | j                  dg dt        t        t
        h             | j                  dg dt        t        t
        h             | j                  d	g dt        t        t
        h             | j                  d
i dt        t        h             | j                  di dt        t        h             | j                  dddt        t        h             | j                  dddt        t        h             | j                  dddt        t        h             | j                  dddt        t        h             | j                  dddt        t        h             t        j                  ddS )Nrh   r@   r>   )typesru   rw   rv   rx   r{   r   rt   r   Tr   r   r   Fr   )versionparallel_read_safe)
add_builderrp   add_config_valuer   listtupledictr  sphinx__display_version__)apps    r   setupr    s   OOO$+R9dE];ST!2rD%=1I   #R9dE]3K   !2rD%=1I   #R9dE]3K   *B)T5M:RS-r2Yv=NO2B)TFBST2D"ItfDUV'rD69J   'rD69J   ')TF:K   %ub	4&8I   --" r   )r2   )r   zIO[str]r   r   r   r   r  r  )r%   r   r&   r   r  zlist[re.Pattern[str]])r8   zlist[list[str]]r  Iterator[str])r9   	list[int]rB   r   r  r   )rG   r  rJ   	list[str]rB   r   r  r  )rO   r   r]   Iterable[re.Pattern[str]]r  r  )
rh   zSequence[str]ri   r  r]   r  rj   zdict[str, dict[str, Any]]r  r  )r  r   r  r   )2r   
__future__r   r~   r   os.pathr
  r   rY   r    r   	importlibr   typingr   r  sphinx._cli.util.colourr   sphinx.buildersr   sphinx.localer   sphinx.utilr	   sphinx.util.inspectr
   collections.abcr   r   r   r   r   r   r   sphinx.applicationr   sphinx.util.typingr   	getLoggerr  r#   r   r)   r;   r6   r7   r[   rn   rp   r  r@   r   r   <module>r+     s   #      	 
 #    ' #   ,AA&&)4			8	$'
-K++$-+:=++!!(A!!H6#66 36 (	6
 6rag aH"r   