B
    d7                 @   s  d 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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 ddlmZ eeZ de
e! e!e!ddddZ"e!e!eee!  dddZ#G dd deZ$eee!ef 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.
    N)import_module)path)IOAnyDictListPatternSetTuple)Sphinx)Builder)__)logging)red)safe_getattr-)ftextcharreturnc             C   s(   |  |d  |  |t| d  d S )N
)writelen)r   r   r    r   `/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/ext/coverage.pywrite_header   s    r   )nameexpsr   c          	   C   sR   g }xH|D ]@}y| t| W q
 tk
rH   ttd||  Y q
X q
W |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	e
dd	d
ZeddddZddddZddddZe
e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.N)r   c          	   C   s  g | _ x0| jjD ]$}t| j|}| j t| qW g | _xX| jj	
 D ]H\}}y| j|t|f W qL tk
r   ttd| Y qLX qLW i | _x(| jj
 D ]\}}td|| j|< qW t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   init2   s,    zCoverageBuilder.initc             C   s   dS )Nzcoverage overviewr   )r<   r   r   r   get_outdated_docsL   s    z!CoverageBuilder.get_outdated_docs)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   O   s    zCoverageBuilder.writec          
   C   s   | j jd d }x| jD ]}t }t|dd~}xv|D ]n}xh| jD ]^\}}||}|rB| d }	|	|krBx0| j	|g D ]}
|
|	r|P q|W |
||	f qBqBW q6W W d Q R X |r|| j|< qW d S )Ncobjectszutf-8)encodingr   )env
domaindatar-   setopenr4   matchgroupsr7   getaddrD   )r<   Z	c_objectsfilenameundocr   linekeyregexrN   r   r%   r   r   r   rE   X   s"    


z CoverageBuilder.build_c_coveragec          
   C   s   t | jd}t|ddd}| jjr2t|dd |d x| j	 D ]\}}t|| xt
|D ]z\}}|d||f  | jjrd| jjs| jjrttd	||| qdttd
d d d|d|    td |  qdW |d qHW W d Q R X d S )Nzc.txtwzutf-8)rI   zUndocumented C API elements=r   z * %-50s [%9s]
z&undocumented c api: %s [%s] in file %szundocumented  zc   z
api       z%-30sz [%9s]z - in file )r   r0   outdirrM   r.   coverage_write_headliner   r   rD   r6   sortedcoverage_show_missing_itemsappquietwarningiserrorr"   r#   r   infor   )r<   output_fileoprR   rS   typr   r   r   r   rF   m   s     


2z CoverageBuilder.write_c_coverage)	full_namer   c             C   s"   x| j D ]}||rdS qW dS )NTF)r;   search)r<   rd   r%   r   r   r   ignore_pyobj   s    
zCoverageBuilder.ignore_pyobjc             C   s  | j jd d }| j jd d }| jj}xz|D ]p}d}x| jD ]}||rBd}P qBW |s0| |rjq0yt|}W nD tk
r } z&t	
td|| d|i| j|< w0W d d }~X Y nX g }	i }
xt|D ]\}}|d d	krqt|d
sq|j|krqd||f }| |rqt|rp||krx8| jD ]}||r<P q<W |rd|jsdq|	| qt|rҐx| jD ]}||rP qW ||kr|r|jsqg |
|< qg }xt|D ]}||jkrqyt||}W n tk
r
   wY nX t|s(t|s(q|d d	kr:q|rL|jsLqd||f }| |rhq||kr|| qW |r||
|< qW |	|
d| j|< q0W d S )NpyrH   modulesFTz#module %s could not be imported: %serrorr   _
__module__z%s.%s)funcsclasses)rJ   rK   r.   coverage_skip_undoc_in_sourcer8   rN   rf   r   ImportErrorr"   r#   r   rA   inspect
getmembershasattrrk   
isfunctionr:   __doc__r   isclassr9   dir__dict__r   AttributeErrorismethod)r<   rH   rh   Z
skip_undocmod_nameignorer%   moderrrl   rm   r   objrd   attrs	attr_nameattrZfull_attr_namer   r   r   rB      s    






z!CoverageBuilder.build_py_coveragec          
   C   s  t | jd}g }t|ddd}| jjr8t|dd t| j	 }x`|D ]V}| j| }d|krz|
||d f qN|d s|d	 sqNt|| |d	 rL|d
 |dd |d	 D  | jjrB| jjs| jjrxb|d	 D ]}ttd|| qW n>x<|d	 D ]0}ttdd d d|  td |  qW |d |d rN|d x: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rr| jjs.| jjrTxf|	D ]}
ttd|||
 q4W nBx@|	D ]8}
ttdd d d|d |
   td |  qZW qrW |d qNW |rt|d |dd |D  W d Q R X d S )Nz
python.txtrW   zutf-8)rI   zUndocumented Python objectsrX   ri   rm   rl   zFunctions:
c             s   s   | ]}d | V  qdS )z * %s
Nr   ).0xr   r   r   	<genexpr>   s    z4CoverageBuilder.write_py_coverage.<locals>.<genexpr>z&undocumented python function: %s :: %szundocumented  zpy  z
function  z%-30sz - in module r   z	Classes:
z * %s
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   r   r     s    z*undocumented python method: %s :: %s :: %sz
method    .zModules that failed to importc             s   s   | ]}d | V  qdS )z * %s -- %s
Nr   )r   r   r   r   r   r   $  s    )r   r0   rY   rM   r.   rZ   r   r[   rA   keysr   r   
writelinesr\   r]   r^   r_   r"   r#   r   r`   r   r6   )r<   ra   failedrb   r   r   rS   func
class_namemethodsmethr   r   r   rC      sl    




,



(


:
z!CoverageBuilder.write_py_coveragec          	   C   s<   t | jd}t|d}t| j| jf| W d Q R X d S )Nzundoc.picklewb)r   r0   rY   rM   pickledumprA   rD   )r<   Z
picklepathZdumpfiler   r   r   finish&  s    zCoverageBuilder.finish)__name__rk   __qualname__rt   r   r   r   sepepilogr>   strr?   r   r   rE   rF   boolrf   rB   rC   r   r   r   r   r   r'   *   s   	[Cr'   )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/   r5   r(   rZ   Trn   r\   )versionZparallel_read_safe)Zadd_builderr'   Zadd_config_valuesphinxZ__display_version__)r]   r   r   r   setup-  s    
r   )r   )&rt   r3   rp   r   r   	importlibr   osr   typingr   r   r   r   r   r	   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   r   <module>   s*   $

  