hCEdZddlmZddlZddlZddlZ ddlmZn#e $r ddl mZYnwxYwgdZ ej dZ ej dZej dZejZd Zd Zejd d ZdZejdZejdZGddeZGddeZddZddZGddZdZddiZe 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 c/home/jenkins/workspace/simtester-sanitize/venv/lib/python3.11/site-packages/lxml/doctestcompare.pyrr8sytwwyyc8td|S)N )_norm_whitespace_resubrs rnorm_whitespacer>s  " "3 * **rFT)recoverremove_blank_textc6tj|tSr )r fromstring _html_parserhtmls rhtml_fromstringrCs  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_parserPs 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 rr5zLXMLOutputChecker.check_outputSs4!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)Nzs rr6zLXMLOutputChecker.get_parserhs K ' 4  # /$FF  $ /YFFjjll  ""--g66 /))++((11 /$FF%%d++ /))#.. /,,..F rc|}|dot| S)N<)rrC_repr_research)r.ss rrDz$LXMLOutputChecker._looks_like_markupxs: GGII S!!+ *** ,rc&||j|jsdS||j|jdsdS||j|jdsdSd|jvrt |j}t |j}||krdS|D]2}||j||j|dsdS3|jdkst|r|t|}t|}|s|rZ|r|sdS| d}| d} | || sdS|s |jdkrn|X|ZdS)NFTanyz...r) tag_comparetag text_comparetexttailattribsortedkeyslenlistpopr8) r.r9r: want_keysgot_keyskey want_children got_children want_first got_firsts rr8zLXMLOutputChecker.compare_docs}s#'22 5  CHd;; 5  CHd;; 5  # #t{//1122Icjoo//00HH$$u  ! !((S)93:c?ERR! 55! 9  T  JJM99L < $!L! 5*..q11 (,,Q// ((Y??! 5# 5(@(@  < trc&|pd}|pd}|rBt|}t|}dtj|z}|dd}tj||rdSdS)Nz^%s$z\.\.\.z.*TF)rrrerreplacerH)r.r9r:rs rrNzLXMLOutputChecker.text_compareszriR  /"4((..00D!#&&,,..C $'||It,, 9T3   45rcD|dkrdSt|ttfrt|ttfs||kS|pd}|pd}|dr8|dd|ddkS||kS)NrKTr_z{...}}) isinstancestrbytesrCsplit)r.r9r:s rrLzLXMLOutputChecker.tag_compares 5==44#u.. !#U|44 3; zriR ??7 # # ::c??2&#))C..*<< <3; rc |j}||||}g}| ||}nF#tj$r4t jd}|d|zYnwxYw ||} nF#tj$r4t jd}|d|zYnwxYw||rKt||||} |r*|| d |S| S|tu} d| || dd| | | dd| || | dg} d | S) NzIn example: %szIn actual output: %s z Expected:zGot:zDiff:) r9r6rr7sysexc_infoappendr4output_differencejoinr format_doc collect_diff) r.exampler:r;r9r>errorsr?er@valuer diff_partss rrpz#LXMLOutputChecker.output_differences|sK88   4!6$<<' 4 4 4LNN1% .233333 4 : &++' : : :LNN1% 4q899999 : >V>!33gsK11E  e$$$yy((( (!ooha88oogtQ77'''4CC E yy$$$s# 0AA32A37 BACCTc^|sdS|j|jvrdS|jst|rdSdS)NFT)rM empty_tagsrOrT)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) rTro format_tagr|rrO format_textformat_end_tagrPrqrr)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.rOrs rrzLXMLOutputChecker.format_texts1 <2  ::<rFr>) rer CommentBaserRrQitemsrorrMrq)r.r{attrsnamerws rr~zLXMLOutputChecker.format_tag s b%+ , , 6!")//"3"344 M MKD% LLdddD,<,)rerrrM)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+-)rTrocollect_diff_tagr|collect_diff_textrOcollect_diff_end_tagrPrqrrUrrrVrs)r.r9r:rrrrZr[s rrszLXMLOutputChecker.collect_diffs4yy "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: )rKrrFrrrFrrr) rLrMrQrRrrorrrq) r.r9r:rMrrKrrwrOs rrz"LXMLOutputChecker.collect_diff_tag@s#'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)rM)r.r9r:rMs rrz&LXMLOutputChecker.collect_diff_end_tag[s: 8sw  $(HHHcggg6CC'C}rc||||r|sdS|||S|d|d}|||S)Nr_rr)rNr)r.r9r:rrOs rrz#LXMLOutputChecker.collect_diff_textbsg   T3 . . 0 r##C// /!%sss+e,,,rN)T)r_)__name__ __module__ __qualname__rzr/r5r6rDr8rNrLrpr|rrrr~rrsrrrrrrrJs1'J444* ,,, :      %%%@!!!!F$$$$ 5 5 5   $$$L6------rrceZdZdZdS)r ctSr )rr-s rr/z%LHTMLOutputChecker.get_default_parserksrN)rrrr/rrrr r js#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 doctestr4rrs rr r ns( 2 2 1rc|rt}nt}t}|jd}|}|j}||_|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__func__r5rr_RestoreChecker) r del_moduleCheckerframedt_selfchecker old_checker check_funcchecker_check_funcs rr r zs $$#  ! !EnV$GgiiG"KG(1J -6GMG[' 2     rc>eZdZdZdZdZdZdZdZdZ dZ d S) rc||_||_|j|j_||j_||_||_||_|| dSr ) rr call_superr3r1r clone_funcr install_cloneinstall_dt_self)r.rr new_checkerrrrs r__init__z_RestoreChecker.__init__se " 59_ 2+6 ($$$  rcv|jj|_|jj|_|jj|j_dSr )r__code__ func_code __globals__ func_globalsrr-s rrz_RestoreChecker.install_clones01 O7#'?#;   rc(|j|j_dSr )rrrr-s runinstall_clonez_RestoreChecker.uninstall_clones#'>   rc@|jj|_||j_dSr )r_DocTestRunner__record_outcome prev_funcr-s rrz_RestoreChecker.install_dt_selfsD6: 333rc(|j|j_dSr )rrrr-s runinstall_dt_selfz!_RestoreChecker.uninstall_dt_selfs6:n 333rc|jrWddl}|j|j=d|jvr?|jdd\}}|j|}t ||dSdSdS)Nr.rj)rrmmodulesrsplitdelattr)r.rmpackagemodule package_mods runinstall_modulez _RestoreChecker.uninstall_modules} ? - JJJ DO,do%%"&/"8"8a"@"@!k'2  V,,,,,  - -&%rc|||j`|j`|j|i|}||Sr )rrrr1r3rr)r.argskwresults r__call__z_RestoreChecker.__call__sc     L , L 6,,,  rc| |j|i||S#|wxYwr )rrr)r.rrs rrz_RestoreChecker.call_supersZ  !"4?D/B//    D   s 7A N) rrrrrrrrrrrrrrrrs   <<<222;;;EEE---!!!!!rrcxddl}|jd}|r|j}d|vr|S|j}|t d)NrrjBOOMzBCould not find doctest (only use this function *inside* a doctest))rm _getframerf_back LookupError)rmrls rrrsdJJJ CM!  E  N Q;;L   L N NNrbasicai >>> temp_install() >>> print """stuff""" ... >>> print """""" >>> print """blahblahblah""" # doctest: +NOPARSE_MARKUP, +ELLIPSIS ...foo /> __main__)F)FN)"__doc__lxmlrrmr`rrrr ImportErrorcgi__all__register_optionflagrrrr4rr HTMLParserrrcompilerGrrr r r rr__test__rtestmodrrrrsR##J ***********))))))))* < < <)W ( 6 6 'G ' 4 4 ,,-=>>%  +++ uFFF 000 2:- . . bj!344^-^-^-^-^- ^-^-^-@ * 2 2 2 2! ! ! ! F,!,!,!,!,!,!,!,!\ N N N   zNNNGOs  ++