
    ,hCE                        d Z ddlmZ ddlZddlZddlZ	 ddlmZ g dZ ej                  d      Z ej                  d      Z ej                  d      Zej                   Zd	 Zd
 Z ej&                  dd      Zd Z ej,                  d      Z ej,                  d      Z G d de      Z G d de      ZddZddZ G d d      Zd ZddiZe dk(  rddlZ ejB                          yy# e	$ r	 ddl
mZ Y w xY w)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 ``<html``).  You can also use the
``PARSE_HTML`` and ``PARSE_XML`` flags to force parsing.

Some rough wildcard-like things are allowed.  Whitespace is generally
ignored (except in attributes).  In text (attributes and text in the
body) you can use ``...`` as a wildcard.  In an example it also
matches any trailing tags in the element, though it does not match
leading tags.  You may create a tag ``<any>`` 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_installr   r   r   c                 (    | y | j                         S N)stripvs    U/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/lxml/doctestcompare.pyr   r   8   s    ywwy    c                 .    t         j                  d|       S )N )_norm_whitespace_resubr   s    r   norm_whitespacer   >   s    ""3**r   FT)recoverremove_blank_textc                 6    t        j                  | t              S r   )r   
fromstring_html_parserhtmls    r   html_fromstringr   C   s    D,//r   z^<[^>]+ (at|object) z[ \t\n][ \t\n]+c                   ~    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zdd
ZddZddZd Zd Zd Zd Zd ZddZy)r   )
paramimgareabrbasefontinputbasemetalinkcolc                 "    t         j                  S r   )r   XMLselfs    r   get_default_parserz$LXMLOutputChecker.get_default_parserP   s    yyr   c                 J   t        | dd       }|| j                  }|} nt        j                  }| j	                  |||      }|s || |||      S 	  ||      }	  ||      }| j                  ||      S # t
        j                  $ r Y yw xY w# t
        j                  $ r Y yw xY w)N_temp_override_selfF)getattr_temp_call_super_check_outputOutputCheckercheck_output
get_parserr   XMLSyntaxErrorcompare_docs)	r.   wantgotoptionflagsalt_selfsuper_methodparserwant_docgot_docs	            r   r5   zLXMLOutputChecker.check_outputS   s    4!6===LD(55LsK8dC. .	d|H	SkG   733 ## 		 ## 		s$   A3 B 3B	B	B"!B"c                    d }t         |z  ry t        |z  rt        }|S t        |z  rt        j
                  }|S |j                         j                         j                  d      r'|j                         j                  d      rt        }|S | j                  |      r!| j                  |      r| j                         }|S )Nz<html)r   r   r   r   r   r,   r   lower
startswith_looks_like_markupr/   )r.   r9   r:   r;   r>   s        r   r6   zLXMLOutputChecker.get_parserh   s    K'#$F  $YYF  jjl  "--g6))+((1$F  %%d+))#.,,.Fr   c                 t    |j                         }|j                  d      xr t        j                  |       S )N<)r   rC   _repr_research)r.   ss     r   rD   z$LXMLOutputChecker._looks_like_markupx   s2    GGIS! + **	,r   c                     | j                  |j                  |j                        sy| j                  |j                  |j                  d      sy| j                  |j                  |j                  d      syd|j
                  vrt        |j
                  j                               }t        |j
                  j                               }||k7  ry|D ]1  }| j                  |j
                  |   |j
                  |   d      r1 y |j                  dk7  st        |      rmt        |      }t        |      }|s|rS|r|sy|j                  d      }|j                  d      }	| j                  ||	      sy|s|j                  dk(  r	 y|rP|rSy)NFTanyz...r   )tag_comparetagtext_comparetexttailattribsortedkeyslenlistpopr8   )
r.   r9   r:   	want_keysgot_keyskeywant_childrengot_children
want_first	got_firsts
             r   r8   zLXMLOutputChecker.compare_docs}   sU   #''2  CHHd;  CHHd;#t{{//12Icjjoo/0HH$  !((S)93::c?ER ! 99T JM9L<$L *..q1
(,,Q/	((Y? #
5(@  < r   c                    |xs d}|xs d}|r2t        |      j                         }t        |      j                         }dt        j                  |      z  }|j	                  dd      }t        j
                  ||      ryy)N z^%s$z\.\.\.z.*TF)r   r   rer   replacerH   )r.   r9   r:   r   s       r   rN   zLXMLOutputChecker.text_compare   ss    zriR"4(..0D!#&,,.C		$'||It,99T3r   c                    |dk(  ryt        |t        t        f      rt        |t        t        f      s||k(  S |xs d}|xs d}|j                  d      r)|j	                  d      d   |j	                  d      d   k(  S ||k(  S )NrK   Tr_   z{...}})
isinstancestrbytesrC   split)r.   r9   r:   s      r   rL   zLXMLOutputChecker.tag_compare   s    5=4#u.!#U|43;zriR??7#::c?2&#))C.*<<<3;r   c                    |j                   }| j                  |||      }g }|	  ||      }	  ||      }	||r>t        j                  | |||      }
|r"|j                  |
       dj                  |      S |
S |t        u }d| j                  |d      d| j                  	|d      d| j                  ||	|d      g}dj                  |      S # t        j                  $ r. t	        j
                         d   }|j                  d|z         Y w xY w# t        j                  $ r/ t	        j
                         d   }|j                  d|z         Y w xY w)	N   zIn example: %szIn actual output: %s
z	Expected:   zGot:zDiff:)r9   r6   r   r7   sysexc_infoappendr4   output_differencejoinr   
format_doccollect_diff)r.   exampler:   r;   r9   r>   errorsr?   er@   valuer   
diff_partss                r   rp   z#LXMLOutputChecker.output_difference   sZ   ||sK84!$<: + >V!33gsK1Ee$yy(((!ooha8oogtQ7'''4CE
 yy$$/ '' 4LLN1%.234
 '' :LLN1%4q89:s"   C D >DD>EEc                 l    |sy|j                   | j                  vry|j                  st        |      ryy)NFT)rM   
empty_tagsrO   rT   )r.   elr   s      r   html_empty_tagz LXMLOutputChecker.html_empty_tag   s.    66(77c"gr   c           	         g }t        |      s|j                  d|z         |j                  |       |j                  | j                  |             | j                  ||      s_t	        |j
                        r*|j                  | j                  |j
                               |j                  | j                  |             t	        |j                        r*|j                  | j                  |j                               |j                  d       dj                  |      S |j                  d|z         |j                  |       |j                  | j                  |             | j                  ||      s|j                  d       t	        |j
                        rO|j                  d|z         |j                  | j                  |j
                               |j                  d       |D ]'  }|j                  | j                  |||dz                ) |j                  d|z         |j                  | j                  |             |j                  d       t	        |j                        rO|j                  d|z         |j                  | j                  |j                               |j                  d       dj                  |      S )Nr   rk   r_   rl   )rT   ro   
format_tagr|   r   rO   format_textformat_end_tagrP   rq   rr   )r.   docr   indentprefixpartsr{   s          r   rr   zLXMLOutputChecker.format_doc   s   3xLLV$LL LL-.&&sD1?LL!1!1#((!;<T0056SXXT--chh78LL775>!SZ VT__S)*""3-LLSXXSZ(T--chh78T" BT__Rvax@ABLLV$LL,,S12LL?LLV$LL))#((34LLwwu~r   c                 D    |y|r|j                         }t        |d      S )Nr_   rj   )r   html_escape)r.   rO   r   s      r   r   zLXMLOutputChecker.format_text  s%    <::<D4##r   c           	      F   g }t        |t        j                        ryt        |j                  j                               D ],  \  }}|j                  |d| j                  |d      d       . |sd|j                  z  S d|j                  ddj                  |      dS )	Nz<!--="F"<%s>rF   r   >)
re   r   CommentBaserR   rQ   itemsro   r   rM   rq   )r.   r{   attrsnamerw   s        r   r~   zLXMLOutputChecker.format_tag	  s    b%++,!"))//"34 	MKD%LLdD,<,<UE,JKL	MBFF?" FFCHHUO44r   c                 V    t        |t        j                        ryd|j                  z  S )Nz--></%s>)re   r   r   rM   )r.   r{   s     r   r   z LXMLOutputChecker.format_end_tag  s$    b%++,r   c           	         g }t        |      st        |      s|j                  d|z         |j                  | j                  ||             | j                  ||      sV|j                  | j	                  |j
                  |j
                               |j                  | j                  ||             |j                  | j	                  |j                  |j                               |j                  d       dj                  |      S |j                  d|z         |j                  | j                  ||             |j                  d       t        |j
                        st        |j
                        rZ|j                  d|z         |j                  | j	                  |j
                  |j
                               |j                  d       t        |      }t        |      }|s|r|s6|j                  | j                  |j                  d      ||dz   d             <|s6|j                  | j                  |j                  d      ||dz   d             t|j                  | j                  |j                  d      |j                  d      ||dz                |r|r|j                  d|z         |j                  | j                  ||             |j                  d       t        |j                        st        |j                        rZ|j                  d|z         |j                  | j	                  |j                  |j                               |j                  d       dj                  |      S )Nr   rk   r_   r   rl   +-)rT   ro   collect_diff_tagr|   collect_diff_textrO   collect_diff_end_tagrP   rq   r   rU   rr   rV   rs   )r.   r9   r:   r   r   r   rZ   r[   s           r   rs   zLXMLOutputChecker.collect_diff  s   4ySLLV$LL..tS9:&&sD1T33DIIsxxHIT66tSABLL//		388DELL775>!SZ T**456TuSXXLLV$LL//		388DELLT
Cy| T__\-=-=a-@$qRUVWT__]->->q-A4PQSVWXLL**!!!$l&6&6q&94K L | 	SZ T..tS9:TuSXXLLV$LL//		388DELLwwu~r   c           
      h   | j                  |j                  |j                        s|j                  d|j                  d}n|j                  }g }|j                  dk(  xs d|j                  v }t        |j                  j	                               D ]  \  }}||j                  vr+|s)|j                  d|d| j                  |d      d       ?||j                  v r!| j                  |j                  |   |d      }n| j                  |d      }|j                  |d|d        |sbt        |j                  j	                               D ]<  \  }}||j                  v r|j                  d|d| j                  |d      d       > |rd	|d
d
j                  |      d}|S d|z  }|S )N (got: )rK   r   r   Fr   r   rF   r   r   r   )	rL   rM   rQ   rR   r   ro   r   r   rq   )	r.   r9   r:   rM   r   rK   r   rw   rO   s	            r   r   z"LXMLOutputChecker.collect_diff_tag@  sz   #''2$(HHcgg6C''Chh%75DKK#7!#**"2"2"45 	7KD%4;;&s41A1A%1OPQ4;;&11$++d2CUERD++E59D$56	7 %dkk&7&7&9: Re3::%41A1A%1OPQR "CHHUO4C 
 3,C
r   c                     |j                   |j                   k7  r!|j                   d|j                   d}d|z  S |j                   }d|z  S )Nr   r   r   )rM   )r.   r9   r:   rM   s       r   r   z&LXMLOutputChecker.collect_diff_end_tag[  sE    88sww$(HHcgg6C } ''C}r   c                     | j                  |||      r|sy| j                  ||      S |d|d}| j                  ||      S )Nr_   r   r   )rN   r   )r.   r9   r:   r   rO   s        r   r   z#LXMLOutputChecker.collect_diff_textb  sJ    T3.##C//!%s+e,,r   N)T)r_   )__name__
__module____qualname__rz   r/   r5   r6   rD   r8   rN   rL   rp   r|   rr   r   r~   r   rs   r   r   r    r   r   r   r   J   sa    'J4* ,
:%@!F$	5 $L6-r   r   c                       e Zd Zd Zy)r	   c                     t         S r   )r   r-   s    r   r/   z%LHTMLOutputChecker.get_default_parserk  s    r   N)r   r   r   r/   r   r   r   r	   r	   j  s    r   r	   c                 F    | rt         t        _        yt        t        _        y)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	   doctestr4   r   r   s    r   r
   r
   n  s      2 1r   c                 $   | rt         }nt        }t               }|j                  d   } |       }|j                  }||_        |j                  d   j
                  }|j                  j
                  }t        t        _        t        ||||||       y)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_framef_locals_checker__func__r5   r   r   _RestoreChecker)	r   
del_moduleCheckerframedt_selfcheckerold_checker
check_funcchecker_check_funcs	            r   r   r   z  s     $#!EnnV$GiG""KG (11J --66 GMG[' 2 r   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
r   c                     || _         || _        | j                  | j                  _        || j                  _        || _        || _        || _        | j                          | j                          y r   )
r   r   
call_superr3   r1   r   
clone_funcr   install_cloneinstall_dt_self)r.   r   r   new_checkerr   r   r   s          r   __init__z_RestoreChecker.__init__  sY    "59__2+6($$$r   c                     | j                   j                  | _        | j                   j                  | _        | j
                  j                  | j                   _        y r   )r   __code__	func_code__globals__func_globalsr   r-   s    r   r   z_RestoreChecker.install_clone  s;    11 OO77#'??#;#; r   c                 :    | j                   | j                  _        y r   )r   r   r   r-   s    r   uninstall_clonez_RestoreChecker.uninstall_clone  s    #'>> r   c                 \    | j                   j                  | _        | | j                   _        y r   )r   _DocTestRunner__record_outcome	prev_funcr-   s    r   r   z_RestoreChecker.install_dt_self  s    DD6:3r   c                 :    | j                   | j                  _        y r   )r   r   r   r-   s    r   uninstall_dt_selfz!_RestoreChecker.uninstall_dt_self  s    6:nn3r   c                     | j                   redd l}|j                  | j                   = d| j                   v r;| j                   j                  dd      \  }}|j                  |   }t	        ||       y y y )Nr   .rj   )r   rm   modulesrsplitdelattr)r.   rm   packagemodulepackage_mods        r   uninstall_modulez _RestoreChecker.uninstall_module  sd    ??DOO,doo%"&//"8"8a"@!kk'2V, & r   c                     | j                          | j                          | j                  `| j                  ` | j
                  |i |}| j                          |S r   )r   r   r   r1   r3   r   r   )r.   argskwresults       r   __call__z_RestoreChecker.__call__  sT     LL,LL6,,r   c                     | j                          	  | j                  |i || j                          S # | j                          w xY wr   )r   r   r   )r.   r   r   s      r   r   z_RestoreChecker.call_super  s?    	!"4??D/B/ D s	   4 AN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s+    
<2;E-!r   r   c                      dd l }  | j                  d      }|r!|j                  }d|v r|S |j                  }|r!t	        d      )Nr   rj   BOOMzBCould not find doctest (only use this function *inside* a doctest))rm   	_getframer   f_backLookupError)rm   r   ls      r   r   r     sO    CMM!E
NNQ;L  LN Nr   basicai  
    >>> temp_install()
    >>> print """<xml a="1" b="2">stuff</xml>"""
    <xml b="2" a="1">...</xml>
    >>> print """<xml xmlns="http://example.com"><tag   attr="bar"   /></xml>"""
    <xml xmlns="...">
      <tag attr="..." />
    </xml>
    >>> print """<xml>blahblahblah<foo /></xml>""" # doctest: +NOPARSE_MARKUP, +ELLIPSIS
    <xml>...foo /></xml>
    __main__)F)FN)"__doc__lxmlr   rm   r`   r   r   r   r   ImportErrorcgi__all__register_optionflagr   r   r   r4   r   r   
HTMLParserr   r   compilerG   r   r   r	   r
   r   r   r   __test__r   testmodr   r   r   <module>r      s2  #J  
 	 **< )W((6
'G''4	,,,-=>%%+  uF0 2::-. bjj!34 ^- ^-@	* 
2! F,! ,!\
N  
	 zGOO q  *)*s   C. .C<;C<