3

T'íc»6ã@sdZddlZddlZddlZddlZddlmZddlmZddl	m
Z
mZmZm
Z
mZmZmZddlZddlmZddlmZddlmZdd	lmZdd
lmZddlmZejeƒZ de
e!e!dd
œdd„Z"e!e!e
edœdd„Z#Gdd„deƒZ$eee!efdœdd„Z%dS)zCheck 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ÚreturncCs(|j|dƒ|j|t|ƒdƒdS)NÚ
)ÚwriteÚlen)rrr©rú5/tmp/pip-build-gk9425m9/sphinx/sphinx/ext/coverage.pyÚwrite_headersr)ÚnameÚexpsrcCsRg}xH|D]@}y|jtj|ƒƒWq
tk
rHtjtdƒ||ƒYq
Xq
W|S)Nzinvalid regex %r in %s)ÚappendÚreÚcompileÚ	ExceptionÚloggerÚwarningr
)rrÚlstÚexprrrÚcompile_regex_list s
r&c@s¨eZdZdZdZedejdƒZddœdd„Z	e
dœd	d
„Zeddœdd
„Z
ddœdd„Zddœdd„Ze
edœdd„Zddœdd„Zddœdd„Zddœdd„ZdS)ÚCoverageBuilderz:
    Evaluates coverage of code in the documentation.
    ZcoveragezNTesting of coverage in the sources finished, look at the results in %(outdir)szpython.txt.N)rcCsg|_x0|jjD]$}tj|j|ƒ}|jjtj|ƒƒqWg|_xX|jj	j
ƒD]H\}}y|jj|tj
|ƒfƒWqLtk
r’tjtdƒ|ƒYqLXqLWi|_x(|jjj
ƒD]\}}td|ƒ|j|<q¬Wtd|jjƒ|_td|jjƒ|_td|jjƒ|_td|jjƒ|_dS)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Úitemsrrr r!r"r#r
Úc_ignorexpsr(r&r)Ú
mod_ignorexpsr*Ú
cls_ignorexpsr+Ú
fun_ignorexpsr,Úpy_ignorexps)ÚselfÚpatternrr%rrrrÚinit2s,zCoverageBuilder.initcCsdS)Nzcoverage overviewr)r<rrrÚget_outdated_docsLsz!CoverageBuilder.get_outdated_docs)ÚignoredrcGs0i|_|jƒ|jƒi|_|jƒ|jƒdS)N)Úpy_undocÚbuild_py_coverageÚwrite_py_coverageÚc_undocÚbuild_c_coverageÚwrite_c_coverage)r<r@rrrrOszCoverageBuilder.writec
CsÄ|jjdd}x®|jD]¤}tƒ}t|ƒ~}xv|D]n}xh|jD]^\}}|j|ƒ}|r>|jƒd}	|	|kr>x0|jj	|gƒD]}
|
j|	ƒrxPqxW|j
||	fƒq>q>Wq2WWdQRX|r||j|<qWdS)NÚcÚobjectsr)ÚenvÚ
domaindatar-ÚsetÚopenr4ÚmatchÚgroupsr7ÚgetÚaddrD)r<Z	c_objectsÚfilenameÚundocrÚlineÚkeyÚregexrMrr%rrrrEXs"



z CoverageBuilder.build_c_coveragecCsútj|jdƒ}t|dƒØ}|jjr.t|ddƒ|jdƒx²|jj	ƒD]¤\}}t||ƒx†t
|ƒD]z\}}|jd||fƒ|jjr`|jj
s’|jjr¨tjtdƒ|||ƒq`tjtdƒd	d
d|d|td
ƒ|ƒq`W|jdƒqDWWdQRXdS)Nzc.txtÚwzUndocumented C API elementsú=rz * %-50s [%9s]
z&undocumented c api: %s [%s] in file %szundocumented  zc   z
api       z%-30sz [%9s]z - in file )rr0ÚoutdirrLr.Úcoverage_write_headlinerrrDr6ÚsortedÚcoverage_show_missing_itemsÚappÚquietÚwarningiserrorr"r#r
Úinfor)r<Úoutput_fileÚoprQrRÚtyprrrrrFms 


2z CoverageBuilder.write_c_coverage)Ú	full_namercCs"x|jD]}|j|ƒrdSqWdS)NTF)r;Úsearch)r<rcr%rrrÚignore_pyobj‚s
zCoverageBuilder.ignore_pyobjcCs°|jjdd}|jjdd}|jj}x€|D]v}d}x|jD]}|j|ƒrBd}PqBW|s0|j|ƒrjq0yt|ƒ}WnDtk
rº}z(t	j
tdƒ||ƒd|i|j|<w0WYdd}~XnXg}	i}
xÐt
j|ƒD]À\}}|dd	krêqÒt|d
ƒsöqÒ|j|krqÒd||f}
|j|
ƒrqÒt
j|ƒrr|
|kr”x:|jD]}|j|ƒr<Pq<W|rf|jrfqÒ|	j|ƒqÒt
j|ƒrҐx|jD]}|j|ƒr†Pq†W|
|krÄ|rº|jrºqÒg|
|<qÒg}x¾t|ƒD]²}||jkræqÒyt||ƒ}Wntk
rwÒYnXt
j|ƒp$t
j|ƒs,qÒ|dd	kr>qÒ|rR|jrRqÒd|
|f}|j|ƒrnqÒ||krÒ|j|ƒqÒW|rÒ||
|<qÒW|	|
dœ|j|<q0WdS)
NÚpyrHÚmodulesFTz#module %s could not be imported: %sÚerrorrÚ_Ú
__module__z%s.%s)ÚfuncsÚclasses)rIrJr.Úcoverage_skip_undoc_in_sourcer8rMrerÚImportErrorr"r#r
rAÚinspectÚ
getmembersÚhasattrrjÚ
isfunctionr:Ú__doc__rÚisclassr9ÚdirÚ__dict__rÚAttributeErrorÚismethod)r<rHrgZ
skip_undocÚmod_nameÚignorer%ÚmodÚerrrkrlrÚobjrcÚattrsÚ	attr_nameÚattrZfull_attr_namerrrrBˆsŠ






z!CoverageBuilder.build_py_coveragecCsÜtj|jdƒ}g}t|dƒ´}|jjr4t|ddƒt|jj	ƒƒ}xd|D]Z}|j|}d|krv|j
||dfƒqJ|drŒ|drŒqJt||ƒ|drL|jdƒ|jd	d
„|dDƒƒ|jj
rB|jjsÞ|jjrxb|dD]}tjtdƒ||ƒqèWn>x<|dD]0}tjtdƒd
dd|tdƒ|ƒqW|jdƒ|drJ|jdƒx:t|djƒƒD]$\}}	|	sî|jd|ƒ|jj
r–|jjs®|jjrÂtjtdƒ||ƒn*tjtdƒd
dd|tdƒ|ƒn¨|jd|ƒ|jdd
„|	Dƒƒ|jj
rr|jjs.|jjrTxf|	D]}
tjtdƒ|||
ƒq4WnBx@|	D]8}
tjtdƒd
dd|d|
tdƒ|ƒqZWqrW|jdƒqJW|rÎt|dƒ|jdd
„|DƒƒWdQRXdS)Nz
python.txtrVzUndocumented Python objectsrWrhrlrkzFunctions:
css|]}d|VqdS)z * %s
Nr)Ú.0Úxrrrú	<genexpr>õsz4CoverageBuilder.write_py_coverage.<locals>.<genexpr>z&undocumented python function: %s :: %szundocumented  zpy  z
function  z%-30sz
 - in module rz	Classes:
z * %s
z#undocumented python class: %s :: %sz
class     z * %s -- missing methods:

css|]}d|VqdS)z   - %s
Nr)rr‚rrrrƒszundocumented python method:z %s :: %s :: %sz
method    Ú.zModules that failed to importcss|]}d|VqdS)z * %s -- %s
Nr)rr‚rrrrƒ$sz*undocumented python method: %s :: %s :: %s)rr0rXrLr.rYrrZrAÚkeysrrÚ
writelinesr[r\r]r^r"r#r
r_rr6)r<r`Úfailedrar…rrRÚfuncÚ
class_nameÚmethodsÚmethrrrrCãsn




,



(


:
z!CoverageBuilder.write_py_coveragec
Cs<tj|jdƒ}t|dƒ}tj|j|jf|ƒWdQRXdS)Nzundoc.pickleÚwb)rr0rXrLÚpickleÚdumprArD)r<Z
picklepathZdumpfilerrrÚfinish&szCoverageBuilder.finish)Ú__name__rjÚ__qualname__rsrr
rÚsepÚepilogr>Ústrr?rrrErFÚboolrerBrCrrrrrr'*s	[Cr')r\rcCs¢|jtƒ|jdgdƒ|jdgdƒ|jdgdƒ|jdgdƒ|jdgdƒ|jdidƒ|jdidƒ|jd	d
dƒ|jdddƒ|jdddƒtjd
d
œS)Nr)Fr+r*r,r/r5r(rYTrmr[)ÚversionZparallel_read_safe)Zadd_builderr'Zadd_config_valueÚsphinxZ__display_version__)r\rrrÚsetup-s
r˜)r)&rsr3rorrÚ	importlibrÚosrÚtypingrrrrrr	r
r—Zsphinx.applicationrZsphinx.buildersrZ
sphinx.localer
Zsphinx.utilrZsphinx.util.consolerZsphinx.util.inspectrÚ	getLoggerrr"r”rr&r'r˜rrrrÚ<module>s*$