a õ¶a£Gã@sbdZddlmZddlZddlZddlZzddlmZWne yVddl mZYn0gd¢Z ze Z Wney‚eefZ Yn0ejddkZe d¡Ze d¡Ze d ¡ZejZd d „Zd d „ZejdddZdd„Ze d¡Ze d¡ZGdd„deƒZ Gdd„de ƒZ!d$dd„Z"d%dd„Z#Gdd„de$ƒZ%dd „Z&d!d"iZ'e(d#kr^ddlZe )¡dS)&aÑ lxml-based doctest output comparison. Note: normally, you should just import the `lxml.usedoctest` and `lxml.html.usedoctest` modules from within a doctest, instead of this one:: >>> import lxml.usedoctest # for XML output >>> import lxml.html.usedoctest # for HTML output To use this module directly, you must call ``lxmldoctest.install()``, which will cause doctest to use this in all subsequent calls. This changes the way output is checked and comparisons are made for XML or HTML-like content. XML or HTML content is noticed because the example starts with ``<`` (it's HTML if it starts with ```` or include an ``any`` attribute in the tag. An ``any`` tag matches any tag, while the attribute matches any and all attributes. When a match fails, the reformatted example and gotten text is displayed (indented), and a rough diff-like output is given. Anything marked with ``+`` is in the output but wasn't supposed to be, and similarly ``-`` means its in the example but wasn't in the output. You can disable parsing on one line with ``# doctest:+NOPARSE_MARKUP`` é)ÚetreeN)Úescape)Ú PARSE_HTMLÚ PARSE_XMLÚNOPARSE_MARKUPÚLXMLOutputCheckerÚLHTMLOutputCheckerÚinstallÚ temp_installérrrcCs|dur dS| ¡SdS©N)Ústrip©Úv©rú9/usr/lib64/python3.9/site-packages/lxml/doctestcompare.pyr ?sr cCs t d|¡S)Nú )Ú_norm_whitespace_reÚsubrrrrÚnorm_whitespaceEsrFT)ZrecoverZremove_blank_textcCs t |t¡Sr )rZ fromstringÚ _html_parser©ÚhtmlrrrÚhtml_fromstringJsrz^<[^>]+ (at|object) z[ \t\n][ \t\n]+c@s eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z d'dd„Z d(dd„Z d)dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd*d$d%„Zd&S)+r) ZparamZimgZareaÚbrZbasefontÚinputÚbaseÚmetaÚlinkÚcolcCstjSr )rÚXML©ÚselfrrrÚget_default_parserWsz$LXMLOutputChecker.get_default_parserc Csšt|ddƒ}|dur |j}|}ntj}| |||¡}|sF|||||ƒSz ||ƒ}WntjyhYdS0z ||ƒ}WntjyŒYdS0| ||¡S)NÚ_temp_override_selfF)ÚgetattrÚ_temp_call_super_check_outputÚ OutputCheckerÚ check_outputÚ get_parserrÚXMLSyntaxErrorÚ compare_docs) r"ÚwantÚgotÚ optionflagsZalt_selfZ super_methodÚparserÚwant_docÚgot_docrrrr(Zs& ÿ  zLXMLOutputChecker.check_outputcCstd}t|@rdSt|@rt}nRt|@r.tj}nB| ¡ ¡ d¡rT| ¡ d¡rTt}n|  |¡rp|  |¡rp|  ¡}|S)Nz     ÿ    ûz#LXMLOutputChecker.output_differenceTcCs.|sdS|j|jvrdS|js&t|ƒr*dSdS)NFT)r;Ú empty_tagsr=rB)r"ÚelrrrrÚhtml_empty_tagÜs z LXMLOutputChecker.html_empty_tagrHc Csžg}t|ƒsœ| d|¡| |¡| | |¡¡| ||¡slt|jƒr\| | |j¡¡| | |¡¡t|jƒrˆ| | |j¡¡| d¡d  |¡S| d|¡| |¡| | |¡¡| ||¡s^| d¡t|jƒr| d|¡| | |j¡¡| d¡|D]}| |  |||d¡¡q| d|¡| | |¡¡| d¡t|jƒr”| d|¡| | |j¡¡| d¡d  |¡S)NrrQrHrR) rBrUÚ format_tagr_r r=Ú format_textÚformat_end_tagr>rWrX)r"ÚdocrÚindentÚprefixÚpartsr^rrrrXæs@             zLXMLOutputChecker.format_doccCs"|dur dS|r| ¡}t|dƒS)NrHrP)r Ú html_escape)r"r=r rrrra s zLXMLOutputChecker.format_textc Cshg}t|tjƒrdSt|j ¡ƒD]"\}}| d|| |d¡f¡q"|sTd|jSd|jd  |¡fS)Nzú)rMrrkr;)r"r^rrrrbs z LXMLOutputChecker.format_end_tagc Csg}t|ƒs’t|ƒs’| d|¡| | ||¡¡| ||¡sh| | |j|j¡¡| | ||¡¡| | |j|j¡¡| d¡d |¡S| d|¡| | ||¡¡| d¡t |jƒsÐt |jƒrþ| d|¡| | |j|j¡¡| d¡t |ƒ}t |ƒ}|s|r˜|sD| |  |  d¡||dd¡¡q|sn| |  |  d¡||dd¡¡q| |  |  d¡|  d¡||d¡¡q| d|¡| | ||¡¡| d¡t |jƒsÚt |jƒr| d|¡| | |j|j¡¡| d¡d |¡S)NrrQrHrrRú+ú-)rBrUÚcollect_diff_tagr_Úcollect_diff_textr=Úcollect_diff_end_tagr>rWr rCrXrDrY)r"r,r-rrdrfrFrGrrrrY!sJ        ÿ   zLXMLOutputChecker.collect_diffc Cs*| |j|j¡s"d|j|jf}n|j}g}|jdkp>d|jv}t|j ¡ƒD]p\}}||jvr€|s€| d|| |d¡f¡qN||jvr | |j||d¡}n | |d¡}| d||f¡qN|st|j ¡ƒD].\}}||jvrèqÔ| d|| |d¡f¡qÔ|rd|d |¡f}nd |}|S) Nú %s (got: %s)r9z+%s="%s"Frhz-%s="%s"rjrri) r:r;r?r@rlrUrarsrW) r"r,r-r;rmr9rnr\r=rrrrrGs*   z"LXMLOutputChecker.collect_diff_tagcCs,|j|jkrd|j|jf}n|j}d|S)Nruro)r;)r"r,r-r;rrrrtbs z&LXMLOutputChecker.collect_diff_end_tagcCs:| |||¡r"|sdS| ||¡Sd||f}| ||¡S)NrHru)r<ra)r"r,r-r r=rrrrsis   z#LXMLOutputChecker.collect_diff_textN)T)rH)T)T)Ú__name__Ú __module__Ú __qualname__r]r#r(r)r4r+r<r:rVr_rXrar`rbrYrrrtrsrrrrrQs$  #  &rc@seZdZdd„ZdS)rcCstSr )rr!rrrr#rsz%LHTMLOutputChecker.get_default_parserN)rvrwrxr#rrrrrqsrcCs|r tt_ntt_dS)z£ Install doctestcompare for all future doctests. If html is true, then by default the HTML parser will be used; otherwise the XML parser is used. N)rÚdoctestr'rrrrrr usr c Csz|r t}nt}tƒ}|jd}|ƒ}|j}||_trJ|jdj}|jj}n|jdj}|jj}t t _ t ||||||ƒdS)zÁ Use this *inside* a doctest to enable this checker for this doctest only. If html is true, then by default the HTML parser will be used; otherwise the XML parser is used. r"ÚcheckN) rrÚ_find_doctest_frameÚf_localsZ_checkerÚ _IS_PYTHON_3Ú__func__r(Zim_funcrryÚ_RestoreChecker) rÚ del_moduleZCheckerÚframeÚdt_selfÚcheckerÚ old_checkerÚ check_funcZchecker_check_funcrrrr s$     þr c@sLeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dS)rcCsD||_||_|j|j_||j_||_||_||_| ¡|  ¡dSr ) r‚rƒÚ call_superr&r$r…Ú clone_funcr€Ú install_cloneÚinstall_dt_self)r"r‚r„Z new_checkerr…r‡r€rrrÚ__init__©s z_RestoreChecker.__init__cCsJtr&|jj|_|jj|_|jj|j_n |jj|_|jj|_|jj|j_dSr )r}r…Ú__code__Ú func_codeÚ __globals__Z func_globalsr‡r!rrrrˆ´s    z_RestoreChecker.install_clonecCstr|j|j_n |j|j_dSr )r}rŒr…r‹r!rrrÚuninstall_clone½s z_RestoreChecker.uninstall_clonecCs|jj|_||j_dSr )r‚Ú_DocTestRunner__record_outcomeÚ prev_funcr!rrrr‰Âs z_RestoreChecker.install_dt_selfcCs|j|j_dSr )rr‚rr!rrrÚuninstall_dt_selfÅsz!_RestoreChecker.uninstall_dt_selfcCsL|jrHddl}|j|j=d|jvrH|j dd¡\}}|j|}t||ƒdS)NrÚ.rP)r€rSÚmodulesÚrsplitÚdelattr)r"rSÚpackageÚmoduleZ package_modrrrÚuninstall_moduleÇs   z _RestoreChecker.uninstall_modulecOs8| ¡| ¡|j`|j`|j|i|¤Ž}| ¡|Sr )rŽr‘rƒr$r&rr˜)r"ÚargsÚkwÚresultrrrÚ__call__Ïsz_RestoreChecker.__call__cOs2| ¡z|j|i|¤ŽW| ¡S| ¡0dSr )rŽr…rˆ)r"r™ršrrrr†×s þz_RestoreChecker.call_superN) rvrwrxrŠrˆrŽr‰r‘r˜rœr†rrrrr¨s  rcCs<ddl}| d¡}|r0|j}d|vr(|S|j}qtdƒ‚dS)NrrPZBOOMzBCould not find doctest (only use this function *inside* a doctest))rSÚ _getframer|Úf_backÚ LookupError)rSrÚlrrrr{Þs ÿr{Zbasicai >>> temp_install() >>> print """stuff""" ... >>> print """""" >>> print """blahblahblah""" # doctest: +NOPARSE_MARKUP, +ELLIPSIS ...foo /> Ú__main__)F)FN)*Ú__doc__ZlxmlrrSrIryrrrgÚ ImportErrorZcgiÚ__all__Z basestringrNÚ NameErrorÚstrÚbytesÚ version_infor}Zregister_optionflagrrrr'r rZ HTMLParserrrÚcompiler6rrrr r Úobjectrr{Z__test__rvZtestmodrrrrÚsJ%        " '6 ÿ