bgG<dZddlmZddlZddlZddlZ ddlmZn#e $r ddl mZYnwxYwgdZ e Z n#e$reefZ YnwxYwejddkZejdZejdZejd ZejZd Zd Zejd d ZdZejdZejdZGddeZ Gdde Z!ddZ"ddZ#Gdde$Z%dZ&ddiZ'e(dkrddlZej)dSdS) 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_XMLNOPARSE_MARKUPLXMLOutputCheckerLHTMLOutputCheckerinstall temp_installrrrc2|dS|SN)stripvs f/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib64/python3.11/site-packages/lxml/doctestcompare.pyrr?sytwwyyc8td|S)N )_norm_whitespace_resubrs rnorm_whitespacerEs  " "3 * **rFT)recoverremove_blank_textc6tj|tSr)r fromstring _html_parserhtmls rhtml_fromstringr Js  D, / //rz^<[^>]+ (at|object) z[ \t\n][ \t\n]+ceZdZdZdZdZdZdZdZdZ dZ d Z dd Z dd Z ddZdZdZdZdZdZddZdS)r) paramimgareabrbasefontinputbasemetalinkcolctjSr)rXMLselfs rget_default_parserz$LXMLOutputChecker.get_default_parserWs yrcZt|dd}| |j}|}n tj}||||}|s|||||S ||}n#t j$rYdSwxYw ||}n#t j$rYdSwxYw|||S)N_temp_override_selfF)getattr_temp_call_super_check_output OutputChecker check_output get_parserrXMLSyntaxError compare_docs) r/wantgot optionflagsalt_self super_methodparserwant_docgot_docs rr6zLXMLOutputChecker.check_outputZs4!6==  =LDD(5LsK88 .<dC.. . vd||HH#   55  fSkkGG#   55   7333s$ AA10A15 BBBcd}t|zrdSt|zrt}nt|zr tj}n|dr/|drt}n>| |r)| |r| }|S)NzV>!33gsK11E  e$$$yy((( (!ooha88oogtQ77'''4CC E yy$$$s# 0AA32A37 BACCTc^|sdS|j|jvrdS|jst|rdSdS)NFT)rN empty_tagsrPrU)r/elrs rhtml_empty_tagz LXMLOutputChecker.html_empty_tagsD 5 6 ( (5 7 c"gg 5trr`c g}t|s?|d|z||||||||sit |jr-|||j|||t |jr-|||j|dd |S|d|z||||||||s |dt |jrZ|d|z|||j|d|D]/}|| |||dz0|d|z||||dt |jrZ|d|z|||j|dd |S)Nrrkr`rl) rUro format_tagr|rrP format_textformat_end_tagrQrqrr)r/docrindentprefixpartsr{s rrrzLXMLOutputChecker.format_docs3xx " LLV $ $ $ LL LL-- . . .&&sD11 7??=LL!1!1#(!;!;<<< T0055666SX 9 T--ch77888 LL   775>> ! SZ    V T__S))***""3--  LL   SX # SZ((( T--ch77888 T""" B B T__Rvax@@AAAA LLV $ $ $ LL,,S11 2 2 2 LL    ??  LLV $ $ $ LL))#(33 4 4 4 LL   wwu~~rcV|dS|r|}t|dS)Nr`rj)r html_escape)r/rPrs rrzLXMLOutputChecker.format_text s1 <2  ::<rGr>) rfr CommentBaserSrRitemsrorrNrq)r/r{attrsnamerws rr~zLXMLOutputChecker.format_tags b%+ , , 6!")//"3"344 M MKD% LLdddD,<,)rfrrrN)r/r{s rrz LXMLOutputChecker.format_end_tags) b%+ , , 5rc  g}t|s t|s|d|z|||||||s\|||j|j|||||||j|j|dd|S|d|z|||||dt|jst|jr`|d|z|||j|j|dt|}t|}|s|r|sB|| | d||dzdH|sB|| | d||dzd|| | d| d||dz|||d|z|||||dt|jst|jr`|d|z|||j|j|dd|S)Nrrkr`rrl+-)rUrocollect_diff_tagr|collect_diff_textrPcollect_diff_end_tagrQrqrrVrrrWrs)r/r:r;rrrr[r\s rrszLXMLOutputChecker.collect_diff!s4yy "S " LLV $ $ $ LL..tS99 : : :&&sD11 C T33DIsxHHIII T66tSAABBB LL// 38DD E E E LL   775>> ! SZ    T**455666 T    uSX  LLV $ $ $ LL// 38DD E E E LL   T Cyy  L| L   T__\-=-=a-@-@$qRUVVWWW  T__]->->q-A-A4PQSVWWXXX LL**!!!$$l&6&6q&9&94KK L L L L| L  SZ    T..tS99::: T    uSX  LLV $ $ $ LL// 38DD E E E LL   wwu~~rc H||j|js|jd|jd}n|j}g}|jdkpd|jv}t|jD]\}}||jvr3|s1|d|d||ddA||jvr#||j||d}n||d}||d|d|sft|jD]?\}}||jvr|d|d||dd@|rd |d d |d }nd |z}|S) N (got: )rLrrFrrrGrrr) rMrNrRrSrrorrrq) r/r:r;rNrrLrrwrPs rrz"LXMLOutputChecker.collect_diff_tagGs#'22 $(HHHcggg6CC'Ch%75DK#7!#*"2"2"4"455 7 7KD%4;&&s& 4441A1A%1O1O1O1OPQQQQ4;&&11$+d2CUERRDD++E599D $$$56666 R%dk&7&7&9&9:: R R e3:%% 4441A1A%1O1O1O1OPQQQQ   "ssCHHUOOOO4CC3,C rc`|j|jkr|jd|jd}n|j}d|zS)Nrrr)rN)r/r:r;rNs rrz&LXMLOutputChecker.collect_diff_end_tagbs: 8sw  $(HHHcggg6CC'C}rc||||r|sdS|||S|d|d}|||S)Nr`rr)rOr)r/r:r;rrPs rrz#LXMLOutputChecker.collect_diff_textisg   T3 . . 0 r##C// /!%sss+e,,,rN)T)r`)__name__ __module__ __qualname__rzr0r6r7rEr9rOrMrpr|rrrr~rrsrrrrrrrQs1'J444* ,,, :      %%%@!!!!F$$$$ 5 5 5   $$$L6------rrceZdZdZdS)r ctSr)r r.s rr0z%LHTMLOutputChecker.get_default_parserrsrN)rrrr0rrrr r qs#rr cR|rtt_dStt_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 doctestr5rrs rr r us( 2 2 1rc`|rt}nt}t}|jd}|}|j}||_t r|jdj}|jj}n|jdj}|jj}tt_ 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) r r_find_doctest_framef_locals_checker _IS_PYTHON_3__func__r6im_funcrr_RestoreChecker) r del_moduleCheckerframedt_selfchecker old_checker check_funcchecker_check_funcs rr r s $$#  ! !EnV$GgiiG"KG:^G,5 $1:^G,4 $19GMG[' 2     rc>eZdZdZdZdZdZdZdZdZ dZ d S) rc||_||_|j|j_||j_||_||_||_|| dSr) rr call_superr4r2r clone_funcr install_cloneinstall_dt_self)r/rr new_checkerrrrs r__init__z_RestoreChecker.__init__se " 59_ 2+6 ($$$  rctr:|jj|_|jj|_|jj|j_dS|jj|_|jj|_|jj|j_dSr)rr__code__ func_code __globals__ func_globalsrr.s rrz_RestoreChecker.install_clonesg  B!_5DN $ ;D '+'?DO $ $ $!_6DN $ >> temp_install() >>> print """stuff""" ... >>> print """""" >>> print """blahblahblah""" # doctest: +NOPARSE_MARKUP, +ELLIPSIS ...foo /> __main__)F)FN)*__doc__lxmlrrmrarrrr ImportErrorcgi__all__ basestringrg NameErrorstrbytes version_inforregister_optionflagrrrr5rr HTMLParserrr compilerHrrr r r objectrr__test__rtestmodrrrrs##J ***********))))))))* < < <KK,KKK"a' (W ( 6 6 'G ' 4 4 ,,-=>>%  +++ uFFF 000 2:- . . bj!344^-^-^-^-^- ^-^-^-@ * 2 2 2 2% % % % N4!4!4!4!4!f4!4!4!l N N N   zNNNGOs ++6 AA