]Nc@sdZddlmZddlZddlZddlZddlZdddddd d gZy eZ Wne k re e fZ nXej d d kZejdZejdZejdZejZd ZdZejdedeZdZejdZejdZdefdYZdefdYZedZ ee!dZ"de#fdYZ$dZ%idd6Z&e'dkrddlZej(ndS(s 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`` i(tetreeNt PARSE_HTMLt PARSE_XMLtNOPARSE_MARKUPtLXMLOutputCheckertLHTMLOutputCheckertinstallt temp_installiicCs|dkrdS|jSdS(N(tNonetstrip(tv((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyR <s cCstjd|S(Nt (t_norm_whitespace_retsub(R ((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pytnorm_whitespaceBstrecovertremove_blank_textcCstj|tS(N(Rt fromstringt _html_parser(thtml((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pythtml_fromstringGss^<[^>]+ (at|object) s[ \t\n][ \t\n]+c BseZdZd Zd Zd Zd ZdZdZdZ dZ e dZ ddZ e dZdZdZdZdZdZe dZRS(tparamtimgtareatbrtbasefonttinputtbasetmetatlinktcolcCstjS(N(RtXML(tself((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pytget_default_parserTsc Cst|dd}|dk r0|j}|}n tj}|j|||}|sg|||||Sy||}Wntjk rtSXy||}Wntjk rtSX|j ||S(Nt_temp_override_self( tgetattrRt_temp_call_super_check_outputt OutputCheckert check_outputt get_parserRtXMLSyntaxErrortFalset compare_docs( R twanttgott optionflagstalt_selft super_methodtparsertwant_doctgot_doc((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyR&Ws$    cCsd}t|@rdSt|@r't}n|t|@r=tj}nf|jjj drv|jj drvt}n-|j |r|j |r|j }n|S(NsRDR?(R telR((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pythtml_empty_tagsRNcCs;g}t|s|jd||j||j|j||j||st|jr|j|j|jn|j|j|nt|jr|j|j|jn|jddj |S|jd||j||j|j||j||s|jdt|jr}|jd||j|j|j|jdnx.|D]&}|j|j |||dqW|jd||j|j||jdnt|jr.|jd||j|j|j|jdndj |S(NR s RNi( RDRXt format_tagRdR R>t format_texttformat_end_tagR@RZR[(R tdocRtindenttprefixtpartsRc((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyR[s@       $cCs5|dkrdS|r%|j}ntj|dS(NRNi(RR tcgiRP(R R>R ((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRfs  cCsg}t|tjrdSxFt|jjD]/\}}|jd||j|tfq2W|svd|j Sd|j dj |fS(Nss(RSRRmR<(R Rc((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRgsc Csg}t| rt| r|jd||j|j|||j||s|j|j|j|j|j|j||n|j|j|j|j|jddj|S|jd||j|j|||jdt |js%t |jre|jd||j|j|j|j|jdnt |}t |}x|s|r4|s|j|j |j d||ddqn|s|j|j |j d||ddqn|j|j |j d|j d||dqW|jd||j|j|||jdt |jst |jr|jd||j|j|j|j|jdndj|S(NR s RNiit-t+(RDRXtcollect_diff_tagRdtcollect_diff_textR>tcollect_diff_end_tagR@RZR RER[RFR\(R R+R,RRiRkRJRK((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyR\sH     ,, - c Cs|j|j|js1d|j|jf}n |j}g}|jdkp[d|jk}xt|jjD]\}}||jkr| r|jd||j|tfqt||jkr|j||j|t}n|j|t}|jd||fqtW|s~x^t|jjD]D\}}||jkrTq3n|jd||j|tfq3Wn|rd|dj |f}n d|}|S( Ns %s (got: %s)R:s-%s="%s"s%s="%s"s+%s="%s"s<%s %s>R s<%s>( R;R<RARBRnRXRfR)RtRZ( R R+R,R<RoR:RpR`R>((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRsEs* "&"* cCs<|j|jkr+d|j|jf}n |j}d|S(Ns %s (got: %s)s(R<(R R+R,R<((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRu`s cCsO|j|||r/|sdS|j||Sd||f}|j||S(NRNs %s (got: %s)(R=Rf(R R+R,R R>((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRtgs ( RRRRRsinputsbaseRslinkR(t__name__t __module__RbR!R&R'R5R*R=R;RYR?RdR[RfReRgR\RsRuRt(((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRNs&       ! #   &  cBseZdZRS(cCstS(N(R(R ((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyR!ps(RvRwR!(((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRoscCs|rtt_n tt_dS(s 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(RtdoctestR%R(R((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRss c Cs|rt}nt}t}|jd}|}|j}||_trk|jdj}|jj}n|jdj}|jj}t t _ t ||||||dS(s 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 tcheckN( RRt_find_doctest_frametf_localst_checkert _IS_PYTHON_3t__func__R&tim_funcRRxt_RestoreChecker( Rt del_moduletCheckertframetdt_selftcheckert old_checkert check_functchecker_check_func((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRs"         RcBsPeZdZdZdZdZdZdZdZdZ RS(cCs`||_||_|j|j_||j_||_||_||_|j|j dS(N( RRt call_superR$R"Rt clone_funcRt install_clonetinstall_dt_self(R RRt new_checkerRRR((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyt__init__s       cCsmtr9|jj|_|jj|_|jj|j_n0|jj|_|jj|_|jj|j_dS(N(R}Rt__code__t func_codet __globals__t func_globalsR(R ((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRscCs+tr|j|j_n|j|j_dS(N(R}RRR(R ((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pytuninstall_clonescCs|jj|_||j_dS(N(Rt_DocTestRunner__record_outcomet prev_func(R ((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRscCs|j|j_dS(N(RRR(R ((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pytuninstall_dt_selfscCsp|jrlddl}|j|j=d|jkrl|jjdd\}}|j|}t||qlndS(Nit.i(RRVtmodulestrsplittdelattr(R RVtpackagetmodulet package_mod((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pytuninstall_modules    cOsF|j|j|j`|j`|j||}|j|S(N(RRRR"R$RR(R targstkwtresult((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyt__call__s     cOs0|jz|j||SWd|jXdS(N(RRR(R RR((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRs ( RvRwRRRRRRRR(((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRs     cCsZddl}|jd}x,|rI|j}d|kr=|S|j}qWtddS(NiitBOOMsBCould not find doctest (only use this function *inside* a doctest)(RVt _getframeR{tf_backt LookupError(RVRtl((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyRzs     si >>> temp_install() >>> print """stuff""" ... >>> print """""" >>> print """blahblahblah""" # doctest: +NOPARSE_MARKUP, +ELLIPSIS ...foo /> tbasict__main__()t__doc__tlxmlRRVRORxRlt__all__t basestringRTt NameErrortstrtbytest version_infoR}tregister_optionflagRRRR%R Rt HTMLParserR)R?RRtcompileR7R RRRRRtobjectRRzt__test__Rvttestmod(((s9/usr/lib64/python2.7/site-packages/lxml/doctestcompare.pyt$sD           " '6