U
    \Sh6                     @  s   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mZ ddl	m
Z
 ddl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 ddlmZ eeZddddddddZddddddZG dd deZ dddddZ!dS ) 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Any)Sphinx)Builder)__)logging)red)safe_getattr-zIO[str]strNone)ftextcharreturnc                 C  s(   |  |d  |  |t| d  d S )N
)writelen)r   r   r    r   F/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/ext/coverage.pywrite_header   s    r   zlist[re.Pattern[str]])nameexpsr   c              	   C  sN   g }|D ]@}z| t| W q tk
rF   ttd||  Y qX q|S )Nzinvalid regex %r in %s)appendrecompile	Exceptionloggerwarningr	   )r   r   lstexpr   r   r   compile_regex_list"   s    r$   c                   @  s   e Zd ZdZdZedej d ZddddZ	d	dd
dZ
dddddZddddZddddZd	ddddZddddZddddZddddZdS )CoverageBuilderz:
    Evaluates coverage of code in the documentation.
    ZcoveragezNTesting of coverage in the sources finished, look at the results in %(outdir)szpython.txt.r   )r   c              	   C  s   g | _ | jjD ]$}t| j|}| j t| qg | _| jj	
 D ]H\}}z| j|t|f W qF tk
r   ttd| Y qFX qFi | _| jj
 D ]\}}td|| j|< qtd| jj| _td| jj| _td| jj| _td| jj| _d S )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   joinsrcdirextendglob	c_regexescoverage_c_regexesitemsr   r   r   r   r    r!   r	   c_ignorexpsr&   r$   r'   mod_ignorexpsr(   cls_ignorexpsr)   fun_ignorexpsr*   py_ignorexps)selfpatternr   r#   r   r   r   r   init4   s6    zCoverageBuilder.initr   c                 C  s   dS )Nzcoverage overviewr   )r:   r   r   r   get_outdated_docsN   s    z!CoverageBuilder.get_outdated_docsr   )ignoredr   c                 G  s0   i | _ |   |   i | _|   |   d S N)py_undocbuild_py_coveragewrite_py_coveragec_undocbuild_c_coveragewrite_c_coverage)r:   r>   r   r   r   r   Q   s    zCoverageBuilder.writec              
   C  s   | j jd d }| jD ]}t }t|ddt}|D ]h}| jD ]\\}}||}|r<| d }	|	|kr<| j	|g D ]}
|
|	rt q<qt|
||	f q<q<q2W 5 Q R X |r|| j|< qd S )Ncobjectsutf-8encodingr   )env
domaindatar+   setopenr2   matchgroupsr5   getaddrC   )r:   Z	c_objectsfilenameundocr   linekeyregexrO   r   r#   r   r   r   rD   Z   s"    


z CoverageBuilder.build_c_coveragec              
   C  s   t | jd}t|ddd}| jjr2t|dd |d | j	 D ]\}}t|| t
|D ]z\}}|d||f  | jjr`| jjs| jjrttd	||| q`ttd
d d d|d|    td |  q`|d qFW 5 Q R X d S )Nzc.txtwrH   rI   zUndocumented C API elements=r   z * %-50s [%9s]
z&undocumented c api: %s [%s] in file %sundocumented  zc   z
api       %-30sz [%9s]z - in file )r   r.   outdirrN   r,   coverage_write_headliner   r   rC   r4   sortedcoverage_show_missing_itemsappquietwarningiserrorr    r!   r	   infor   )r:   output_fileoprS   rT   typr   r   r   r   rE   o   s0    


  z CoverageBuilder.write_c_coveragebool)	full_namer   c                   s   t  fdd| jD S )Nc                 3  s   | ]}|  V  qd S r?   )search).0r#   rh   r   r   	<genexpr>   s   z/CoverageBuilder.ignore_pyobj.<locals>.<genexpr>)anyr9   )r:   rh   r   rk   r   ignore_pyobj   s    zCoverageBuilder.ignore_pyobjc                 C  s  | j jd d }| j jd d }| jj}|D ]j}d}| jD ]}||r<d} qTq<|s,| |rdq,zt|}W nJ tk
r } z,t	
td|| d|i| j|< W Y q,W 5 d }~X Y nX g }	i }
t|D ]\}}|d d	krqt|d
sq|j|krq| d| }| |rqt|rl||kr| jD ]}||r6 qq6|r`|js`q|	| qt|r| jD ]}||r| qΐq|||kr|r|jsqg |
|< qg }t|D ]}||jkrؐqzt||}W n tk
r   Y qY nX t|s t|s q|d d	kr2q|rD|jsDq| d| }| |rbq||kr|| q|r||
|< q|	|
d| j|< q,d S )NpyrG   modulesFTz#module %s could not be imported: %serrorr   _
__module__.)funcsclasses)rK   rL   r,   coverage_skip_undoc_in_sourcer6   rO   rn   r   ImportErrorr    r!   r	   r@   inspect
getmembershasattrrs   
isfunctionr8   __doc__r   isclassr7   dir__dict__r   AttributeErrorismethod)r:   rG   rp   Z
skip_undocmod_nameignorer#   moderrru   rv   r   objrh   attrs	attr_nameattrZfull_attr_namer   r   r   rA      s    












z!CoverageBuilder.build_py_coveragec              
   C  s  t | jd}g }t|ddd}| jjr8t|dd t| j	 }|D ]>}| j| }d|krv|
||d f qJ|d s|d	 sqJt|| |d	 r>|d
 |dd |d	 D  | jjr4| jjs| jjr|d	 D ]}ttd|| qn:|d	 D ]0}ttdd d d|  td |  q|d |d rJ|d t|d  D ]\}}	|	s|d|  | jjr|| jjs| jjrttd|| n*ttdd d d|  td |  n|d|  |dd |	D  | jjr`| jjs| jjr>|	D ]}
ttd|||
 q n>|	D ]8}
ttdd d d|d |
   td |  qBq`|d qJ|rt|d |dd |D  W 5 Q R X d S )Nz
python.txtrX   rH   rI   zUndocumented Python objectsrY   rq   rv   ru   zFunctions:
c                 s  s   | ]}d | V  qdS ) * %s
Nr   rj   xr   r   r   rl      s     z4CoverageBuilder.write_py_coverage.<locals>.<genexpr>z&undocumented python function: %s :: %srZ   zpy  z
function  r[   z - in module r   z	Classes:
r   z#undocumented python class: %s :: %sz
class     z * %s -- missing methods:

c                 s  s   | ]}d | V  qdS )z   - %s
Nr   r   r   r   r   rl     s     z*undocumented python method: %s :: %s :: %sz
method    rt   zModules that failed to importc                 s  s   | ]}d | V  qdS )z * %s -- %s
Nr   r   r   r   r   rl   &  s     )r   r.   r\   rN   r,   r]   r   r^   r@   keysr   r   
writelinesr_   r`   ra   rb   r    r!   r	   rc   r   r4   )r:   rd   Zfailedre   r   r   rT   func
class_namemethodsmethr   r   r   rB      s    





 




 
  


z!CoverageBuilder.write_py_coveragec              	   C  s<   t | jd}t|d}t| j| jf| W 5 Q R X d S )Nzundoc.picklewb)r   r.   r\   rN   pickledumpr@   rC   )r:   Z
picklepathZdumpfiler   r   r   finish(  s    zCoverageBuilder.finishN)__name__rs   __qualname__r}   r   r	   r   sepepilogr<   r=   r   rD   rE   rn   rA   rB   r   r   r   r   r   r%   ,   s    	[Cr%   r   zdict[str, Any])r`   r   c                 C  s   |  t | dg d | dg d | dg d | dg d | dg d | di d | di d | d	d
d | ddd | ddd tjd
dS )Nr'   Fr)   r(   r*   r-   r3   r&   r]   Trw   r_   )versionZparallel_read_safe)Zadd_builderr%   Zadd_config_valuesphinxZ__display_version__)r`   r   r   r   setup/  s    
r   )r   )"r}   
__future__r   r1   ry   r   r   	importlibr   osr   typingr   r   r   Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.localer	   Zsphinx.utilr
   Zsphinx.util.consoler   Zsphinx.util.inspectr   	getLoggerr   r    r   r$   r%   r   r   r   r   r   <module>   s,   

  