o $ag7 @sdZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z m Z mZmZmZddlZddlmZddlmZddlmZdd lmZdd lmZdd lmZeeZ dd e de!de!ddfddZ"de!de!de efddZ#GdddeZ$dede e!e ffddZ%dS)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-2021 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. N) import_module)path)IOAnyDictListPatternSetTuple)Sphinx)Builder)__)logging)red) safe_getattr-ftextcharreturncCs(||d||t|ddS)N )writelen)rrrr5/usr/lib/python3/dist-packages/sphinx/ext/coverage.py write_header srnameexpsc CsJg}|D]}z |t|Wqty"ttd||Yqw|S)Nzinvalid regex %r in %s)appendrecompile Exceptionloggerwarningr )rrlstexprrrcompile_regex_list%s r&c@seZdZdZdZedejdZdddZ de fd d Z d e ddfd d Z dddZdddZde defddZdddZdddZdddZdS)CoverageBuilderz: Evaluates coverage of code in the documentation. coveragezNTesting of coverage in the sources finished, look at the results in %(outdir)sz python.txt.rNc Csg|_|jjD]}t|j|}|jt|qg|_|jj D]"\}}z |j |t |fWq#tyEttd|Yq#wi|_|jj D] \}}td||j|<qOtd|jj|_td|jj|_td|jj|_td|jj|_dS)Nz&invalid regex %r in coverage_c_regexescoverage_ignore_c_itemscoverage_ignore_modulescoverage_ignore_classescoverage_ignore_functionscoverage_ignore_pyobjects) c_sourcefilesconfigcoverage_c_pathrjoinsrcdirextendglob c_regexescoverage_c_regexesitemsrrr r!r"r#r c_ignorexpsr)r&r* mod_ignorexpsr+ cls_ignorexpsr, fun_ignorexpsr- py_ignorexps)selfpatternrr%rrrrinit7s8    zCoverageBuilder.initcCsdS)Nzcoverage overviewr)r=rrrget_outdated_docsQsz!CoverageBuilder.get_outdated_docsignoredcGs0i|_||i|_||dS)N)py_undocbuild_py_coveragewrite_py_coveragec_undocbuild_c_coveragewrite_c_coverage)r=rArrrrTs  zCoverageBuilder.writec Cs|jjdd}|jD]W}t}t|?}|D]4}|jD].\}}||}|rJ|d} | |vrI|j |gD] } | | rAnq8| || fqqqWdn1sVwY|rb||j |<q dS)Ncobjectsr) env domaindatar.setopenr5matchgroupsr8getaddrE) r= c_objectsfilenameundocrlinekeyregexrNrr%rrrrF]s0      z CoverageBuilder.build_c_coveragec Cst|jd}t|dn}|jjrt|dd|d|j D]P\}}t||t |D]=\}}|d||f|jj rk|j j sG|j jrRttd|||q.ttdd d d |d |td |q.|dq!WddS1s}wYdS)Nzc.txtwzUndocumented C API elements=rz * %-50s [%9s] z&undocumented c api: %s [%s] in file %sundocumented zc z api %-30sz [%9s]z - in file )rr1outdirrMr/coverage_write_headlinerrrEr7sortedcoverage_show_missing_itemsappquietwarningiserrorr"r#r infor)r= output_fileoprSrTtyprrrrrGrs2      "z CoverageBuilder.write_c_coverage full_namecCs |jD] }||r dSqdS)NTF)r<search)r=rgr%rrr ignore_pyobjs  zCoverageBuilder.ignore_pyobjc Cs^|jjdd}|jjdd}|jj}|D]}d}|jD] }||r)d}nq|s1||r2qzt|}Wn"tyZ}zt t d||d|i|j |<WYd}~qd}~wwg} i} t |D]\} } | dd kroqdt| d suqd| j|kr{qdd || f} || rqdt | r| |vr|jD] }|| rn q|r| jsqd| | qdt | r#|jD] }|| rnhq| |vr|r| jsqdg| | <qdg}t| D]J}|| jvrqzt| |}Wn tyYqwt |st |sq|dd krq|r|jsqd | |f}||rq||vr||q|r#|| | <qd| | d |j |<qdS) NpyrImodulesFTz#module %s could not be imported: %serrorr_ __module__z%s.%s)funcsclasses)rJrKr/coverage_skip_undoc_in_sourcer9rNrir ImportErrorr"r#r rBinspect getmembershasattrrn isfunctionr;__doc__risclassr:dir__dict__rAttributeErrorismethod)r=rIrk skip_undocmod_nameignorer%moderrrorprobjrgattrs attr_nameattrfull_attr_namerrrrCs                            z!CoverageBuilder.build_py_coveragec Cst|jd}g}t|dO}|jjrt|ddt|j }|D]}|j|}d|vr9| ||dfq#|dsB|dsBq#t|||dr| d| d d |dD|jj r|jjsh|jjry|dD] }ttd ||qln|dD]}ttd d dd|td|q}| d|dr;| dt|dD]\}} | s| d||jj r|jjs|jjrttd||qttd d dd|td|q| d|| dd | D|jj r5|jjs|jjr| D] } ttd||| qq| D]} ttd d dd|d| td|qq| dq#|rVt|d| dd |DWddSWddS1sbwYdS)Nz python.txtrXzUndocumented Python objectsrYrlrproz Functions: cs|]}d|VqdS) * %s Nr.0xrrr z4CoverageBuilder.write_py_coverage..z&undocumented python function: %s :: %srZzpy z function r[z - in module rz Classes: rz#undocumented python class: %s :: %sz class z * %s -- missing methods: csr)z - %s Nrrrrrrrz*undocumented python method: %s :: %s :: %sz method .zModules that failed to importcsr)z * %s -- %s Nrrrrrr)r)rr1r\rMr/r]rr^rBkeysrr writelinesr_r`rarbr"r#r rcrr7) r=rdfailedrerrrTfunc class_namemethodsmethrrrrDs                 <$z!CoverageBuilder.write_py_coveragecCsRt|jd}t|d}t|j|jf|WddS1s"wYdS)Nz undoc.picklewb)rr1r\rMpickledumprBrE)r= picklepathdumpfilerrrfinish+s "zCoverageBuilder.finish)rN)__name__rn __qualname__rwrr rsepepilogr?strr@rrrFrGboolrirCrDrrrrrr'/s"    [Cr'r`cCs|t|dgd|dgd|dgd|dgd|dgd|did|did|d d d|d dd|d ddtjd d S)Nr*Fr,r+r-r0r6r)r]Trqr_)versionparallel_read_safe) add_builderr'add_config_valuesphinx__display_version__)r`rrrsetup2s  r)r)&rwr4rsrr importlibrosrtypingrrrrrr r rsphinx.applicationr sphinx.buildersr sphinx.localer sphinx.utilrsphinx.util.consolersphinx.util.inspectr getLoggerrr"rrr&r'rrrrrs,   $