B
    öÀ„\/+  ã               @   s°   d 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
 ddl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„Zdd„ ZG dd„ deƒZdd„ ZdS )a-  
    sphinx.ext.coverage
    ~~~~~~~~~~~~~~~~~~~

    Check Python modules and C API for coverage.  Mostly written by Josip
    Dzolonga for the Google Highly Open Participation contest.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
é    N)Úpath)Ú	iteritems)ÚcPickle)ÚBuilder)Ú__)Úlogging)Úsafe_getattrú-c             C   s(   |   |d ¡ |   |t|ƒ d ¡ d S )NÚ
)ÚwriteÚlen)ÚfÚtextÚchar© r   ú2lib/python3.7/site-packages/sphinx/ext/coverage.pyÚwrite_header$   s    r   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   )ÚnameÚexpsZlstÚexpr   r   r   Úcompile_regex_list*   s    
r   c               @   sf   e Zd ZdZdZedej 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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.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(t| jjƒD ]\}}td|ƒ| j|< q¬W 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)Úc_sourcefilesÚconfigÚcoverage_c_pathr   ÚjoinZsrcdirÚextendÚglobÚ	c_regexesÚcoverage_c_regexesÚitemsr   r   r   r   r   r   r   Úc_ignorexpsr   r   r   r   Úmod_ignorexpsr    Úcls_ignorexpsr!   Úfun_ignorexps)ÚselfÚpatternr   r   r   r   r   r   Úinit=   s(    zCoverageBuilder.initc             C   s   dS )Nzcoverage overviewr   )r/   r   r   r   Úget_outdated_docsV   s    z!CoverageBuilder.get_outdated_docsc             G   s0   i | _ |  ¡  |  ¡  i | _|  ¡  |  ¡  d S )N)Úpy_undocÚbuild_py_coverageÚwrite_py_coverageÚc_undocÚbuild_c_coverageÚwrite_c_coverage)r/   Zignoredr   r   r   r   Z   s    zCoverageBuilder.writec          
   C   sÆ   | j jd d }x°| jD ]¦}tƒ }t|dƒ~}xv|D ]n}xh| jD ]^\}}| |¡}|r@| ¡ d }	|	|kr@x0| j 	|g ¡D ]}
|
 |	¡rzP qzW | 
||	f¡ q@q@W q4W W d Q R X |r|| j|< qW d S )NÚcÚobjectsÚrr   )ÚenvÚ
domaindatar"   ÚsetÚopenr(   ÚmatchÚgroupsr+   ÚgetÚaddr6   )r/   Z	c_objectsÚfilenameÚundocr   ÚlineÚkeyZregexr@   r   r   r   r   r   r7   d   s"    


z CoverageBuilder.build_c_coveragec          	   C   sš   t  | jd¡}t|dƒx}| jjr.t|ddƒ | d¡ xRt| j	ƒD ]D\}}t||ƒ x&t
|ƒD ]\}}| d||f ¡ q`W | d¡ qDW W d Q R X d S )Nzc.txtÚwzUndocumented C API elementsú=r
   z * %-50s [%9s]
)r   r%   Úoutdirr?   r#   Úcoverage_write_headliner   r   r   r6   Úsorted)r/   Úoutput_fileÚoprD   rE   Útypr   r   r   r   r8   z   s    

z CoverageBuilder.write_c_coveragec             C   s†  | j jd d }| j jd d }| jj}xV|D ]L}d}x| jD ]}| |¡rBd}P qBW |r`q0yt|dgd}W nD tk
r¶ } z&t 	t
dƒ||¡ d	|i| j|< w0W d d }~X Y nX g }	i }
xªt |¡D ]š\}}|d
 dkræqÎt|dƒsòqÎ|j|krþqÎd||f }t |¡r\||krjx8| jD ]}| |¡r(P q(W |rP|jsPqÎ|	 |¡ qÎt |¡rÎx | jD ]}| |¡rpP qpW ||kr¬|r¢|js¢qÎg |
|< qÎg }x¬t|ƒD ] }||jkrÎqºyt||ƒ}W n tk
rö   wºY nX t |¡st |¡sqº|d
 dkr&qº|r8|js8qºd||f }||krº| |¡ qºW |rÎ||
|< qÎW |	|
dœ| j|< q0W d S )NÚpyr:   ÚmodulesFTZfoo)Úfromlistz#module %s could not be imported: %sÚerrorr   Ú_Ú
__module__z%s.%s)ÚfuncsÚclasses)r<   r=   r#   Úcoverage_skip_undoc_in_sourcer,   r@   Ú
__import__ÚImportErrorr   r   r   r3   ÚinspectZ
getmembersÚhasattrrU   Z
isfunctionr.   Ú__doc__r   Zisclassr-   ÚdirÚ__dict__r   ÚAttributeErrorZismethod)r/   r:   rQ   Z
skip_undocÚmod_nameÚignorer   ÚmodÚerrrV   rW   r   ÚobjZ	full_nameZattrsZ	attr_nameÚattrZfull_attr_namer   r   r   r4   ˆ   s‚    







z!CoverageBuilder.build_py_coveragec          	   C   sj  t  | jd¡}g }t|dƒB}| jjr4t|ddƒ t| j 	¡ ƒ}xô|D ]ì}| j| }d|krr| 
||d f¡ qH|d s„|d s„qHt||ƒ |d rÂ| d¡ | d	d
„ |d D ƒ¡ | d¡ |d rH| d¡ xTtt|d ƒƒD ]@\}}|s| d| ¡ qæ| d| ¡ | dd
„ |D ƒ¡ qæW | d¡ qHW |r\t|dƒ | dd
„ |D ƒ¡ W d Q R X d S )Nz
python.txtrH   zUndocumented Python objectsrI   rS   rW   rV   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>r
   z	Classes:
z * %s
z * %s -- missing methods:

c             s   s   | ]}d | V  qdS )z   - %s
Nr   )rg   rh   r   r   r   ri   ÿ   s    zModules that failed to importc             s   s   | ]}d | V  qdS )z * %s -- %s
Nr   )rg   rh   r   r   r   ri     s    )r   r%   rJ   r?   r#   rK   r   rL   r3   Úkeysr   r   Ú
writelinesr   )r/   rM   ZfailedrN   rj   r   rE   Úmethodsr   r   r   r5   â   s:    






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   r%   rJ   r?   ÚpickleÚdumpr3   r6   )r/   Z
picklepathZdumpfiler   r   r   Úfinish  s    zCoverageBuilder.finishN)Ú__name__rU   Ú__qualname__r]   r   r   r   ÚsepZepilogr1   r2   r   r7   r8   r4   r5   rp   r   r   r   r   r   5   s   
Z$r   c             C   s†   |   t¡ |  dg d¡ |  dg d¡ |  dg d¡ |  dg d¡ |  di d¡ |  di d¡ |  dd	d¡ |  d
dd¡ tjd	dœS )Nr   Fr!   r    r$   r)   r   rK   TrX   )ÚversionZparallel_read_safe)Zadd_builderr   Zadd_config_valueÚsphinxZ__display_version__)Zappr   r   r   Úsetup  s    
rv   )r	   )r]   r'   r[   r   Úosr   Zsixr   Z	six.movesr   rn   ru   Zsphinx.buildersr   Zsphinx.localer   Zsphinx.utilr   Zsphinx.util.inspectr   Z	getLoggerrq   r   r   r   r   rv   r   r   r   r   Ú<module>   s"   

 Z