B þ|/\£Gã@spdZddlmZddlZddlZddlZyddlmZWn e k rXddl mZYnXddddd d d gZ ye Z Wnek reefZ YnXejdd kZe d¡Ze d¡Ze d¡ZejZd d„Zdd„ZejdddZdd„Ze d¡Ze d¡ZGdd„deƒZ Gdd „d e ƒZ!d#dd „Z"d$dd „Z#Gdd„de$ƒZ%dd„Z&d d!iZ'e(d"krlddlZe )¡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écCs|dkr dS| ¡SdS)N)Ústrip)Úv©rúF/opt/alt/python37/lib64/python3.7/site-packages/lxml/doctestcompare.pyr ?sr cCs t d|¡S)Nú )Ú_norm_whitespace_reÚsub)r rrrÚnorm_whitespaceEsrFT)ZrecoverZremove_blank_textcCs t |t¡S)N)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ÚcolcCstjS)N)rÚXML)ÚselfrrrÚget_default_parserWsz$LXMLOutputChecker.get_default_parserc Csšt|ddƒ}|dk r |j}|}ntj}| |||¡}|sF|||||ƒSy ||ƒ}Wntjk rhdSXy ||ƒ}Wntjk rŒdSX| ||¡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)rÚelrrrrÚhtml_empty_tagÜs z LXMLOutputChecker.html_empty_tagrDc Cs¢g}t|ƒsœ| d|¡| |¡| | |¡¡| ||¡slt|jƒr\| | |j¡¡| | |¡¡t|jƒrˆ| | |j¡¡| d¡d  |¡S| d|¡| |¡| | |¡¡| ||¡sb| d¡t|jƒr| d|¡| | |j¡¡| d¡x&|D]}| |  |||d¡¡qW| d|¡| | |¡¡| d¡t|jƒr˜| d|¡| | |j¡¡| d¡d  |¡S)NrrMrDrN) r>rQÚ format_tagr[r r9Ú format_textÚformat_end_tagr:rSrT)rÚdocrÚindentÚprefixÚpartsrZrrrrTæs@              zLXMLOutputChecker.format_doccCs"|dkr dS|r| ¡}t|dƒS)NrDrL)r Ú html_escape)rr9r rrrr] s zLXMLOutputChecker.format_textc Cslg}t|tjƒrdSx4t|j ¡ƒD]"\}}| d|| |d¡f¡q$W|sXd|jSd|jd  |¡fS)Nzz)rIrrdr7)rrZrrrr^s 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 |ƒ}xŒ|s|rš|sF| |  |  d¡||dd¡¡q|sp| |  |  d¡||dd¡¡q| |  |  d¡|  d¡||d¡¡qW| d|¡| | ||¡¡| d¡t |jƒsÞt |jƒr | d|¡| | |j|j¡¡| d¡d |¡S)NrrMrDrrNú+ú-)r>rQÚcollect_diff_tagr[Úcollect_diff_textr9Úcollect_diff_end_tagr:rSr r?rTr@rU)rr(r)rr`rbrBrCrrrrU!sH       $  zLXMLOutputChecker.collect_diffc Cs2| |j|j¡s"d|j|jf}n|j}g}|jdkp>d|jk}x‚t|j ¡ƒD]p\}}||jkr‚|s‚| d|| |d¡f¡qP||jkr¢| |j||d¡}n | |d¡}| d||f¡qPW|s x@t|j ¡ƒD].\}}||jkrîqÚ| d|| |d¡f¡qÚW|r&d|d |¡f}nd |}|S) Nz %s (got: %s)r5z+%s="%s"Fz%s="%s"z-%s="%s"z<%s %s>rz<%s>) r6r7r;r<rerQr]rkrS) rr(r)r7rfr5rgrXr9rrrrjGs*   z"LXMLOutputChecker.collect_diff_tagcCs,|j|jkrd|j|jf}n|j}d|S)Nz %s (got: %s)z)r7)rr(r)r7rrrrlbs z&LXMLOutputChecker.collect_diff_end_tagcCs:| |||¡r"|sdS| ||¡Sd||f}| ||¡S)NrDz %s (got: %s))r8r])rr(r)r r9rrrrkis   z#LXMLOutputChecker.collect_diff_textN)T)rD)T)T)Ú__name__Ú __module__Ú __qualname__rYrr$r%r0r'r8r6rRr[rTr]r\r^rUrjrlrkrrrrrQs$  #  &c@seZdZdd„ZdS)rcCstS)N)r)rrrrrrsz%LHTMLOutputChecker.get_default_parserN)rmrnrorrrrrrqscCs|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#r)rrrrr usc 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. rZcheckN) rrÚ_find_doctest_frameÚf_localsZ_checkerÚ _IS_PYTHON_3Ú__func__r$Zim_funcrrpÚ_RestoreChecker) rÚ del_moduleZCheckerÚframeÚdt_selfÚcheckerÚ old_checkerÚ check_funcZchecker_check_funcrrrr s"     c@sLeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dS)rucCsD||_||_|j|j_||j_||_||_||_| ¡|  ¡dS)N) rxryÚ call_superr"r r{Ú clone_funcrvÚ install_cloneÚinstall_dt_self)rrxrzZ new_checkerr{r}rvrrrÚ__init__©s z_RestoreChecker.__init__cCsJtr&|jj|_|jj|_|jj|j_n |jj|_|jj|_|jj|j_dS)N)rsr{Ú__code__Ú func_codeÚ __globals__Z func_globalsr})rrrrr~´s    z_RestoreChecker.install_clonecCstr|j|j_n |j|j_dS)N)rsr‚r{r)rrrrÚuninstall_clone½s z_RestoreChecker.uninstall_clonecCs|jj|_||j_dS)N)rxÚ_DocTestRunner__record_outcomeÚ prev_func)rrrrrÂs z_RestoreChecker.install_dt_selfcCs|j|j_dS)N)r†rxr…)rrrrÚuninstall_dt_selfÅsz!_RestoreChecker.uninstall_dt_selfcCsL|jrHddl}|j|j=d|jkrH|j dd¡\}}|j|}t||ƒdS)NrÚ.rL)rvrOÚmodulesÚrsplitÚdelattr)rrOÚpackageÚmoduleZ package_modrrrÚuninstall_moduleÇs   z _RestoreChecker.uninstall_modulecOs4| ¡| ¡|j`|j`|j||Ž}| ¡|S)N)r„r‡ryr r"r†rŽ)rÚargsÚkwÚresultrrrÚ__call__Ïs z_RestoreChecker.__call__cOs$| ¡z |j||ŽS| ¡XdS)N)r„r{r~)rrrrrrr|×s z_RestoreChecker.call_superN) rmrnror€r~r„rr‡rŽr’r|rrrrru¨s  rucCs@ddl}| d¡}x |r2|j}d|kr*|S|j}qWtdƒ‚dS)NrrLZBOOMzBCould not find doctest (only use this function *inside* a doctest))rOÚ _getframerrÚf_backÚ LookupError)rOrwÚlrrrrqÞs  rqZbasicai >>> temp_install() >>> print """stuff""" ... >>> print """""" >>> print """blahblahblah""" # doctest: +NOPARSE_MARKUP, +ELLIPSIS ...foo /> Ú__main__)F)FN)*Ú__doc__ZlxmlrrOrErprrrcÚ ImportErrorZcgiÚ__all__Z basestringrJÚ NameErrorÚstrÚbytesÚ version_inforsZregister_optionflagrrrr#r rZ HTMLParserrrÚcompiler2rrrr r ÚobjectrurqZ__test__rmZtestmodrrrrÚ$sL       " '6