£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
    |/\G                 @   sp  d Z ddlmZ ddlZddlZddlZyddlmZ W n  e	k
rX   ddl
mZ Y nX ddddd	d
dgZyeZW n ek
r   eefZY nX ejd dkZedZedZedZejZdd Zdd ZejdddZdd ZedZedZG dd deZ G dd	 d	e Z!d#dd
Z"d$ddZ#G dd de$Z%dd Z&d d!iZ'e(d"krlddlZe)  dS )%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_install   c             C   s   | d krd S |   S d S )N)strip)v r   F/opt/alt/python37/lib64/python3.7/site-packages/lxml/doctestcompare.pyr   ?   s    r   c             C   s   t d| S )N )_norm_whitespace_resub)r   r   r   r   norm_whitespaceE   s    r   FT)ZrecoverZremove_blank_textc             C   s   t | tS )N)r   Z
fromstring_html_parser)htmlr   r   r   html_fromstringJ   s    r   z^<[^>]+ (at|object) z[ \t\n][ \t\n]+c               @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zd'ddZd(ddZd)ddZdd Zdd Zdd Zd d! Zd"d# Zd*d$d%Zd&S )+r   )
paramZimgZareabrZbasefontinputbasemetalinkcolc             C   s   t jS )N)r   XML)selfr   r   r   get_default_parserW   s    z$LXMLOutputChecker.get_default_parserc       	      C   s   t | dd }|d k	r | j}|} ntj}| |||}|sF|| |||S y||}W n tjk
rh   dS X y||}W n tjk
r   dS X | ||S )N_temp_override_selfF)getattr_temp_call_super_check_outputOutputCheckercheck_output
get_parserr   XMLSyntaxErrorcompare_docs)	r   wantgotoptionflagsZalt_selfZsuper_methodparserwant_docgot_docr   r   r   r%   Z   s$    zLXMLOutputChecker.check_outputc             C   st   d }t |@ rd S t|@ rt}nRt|@ r.tj}nB|  drT| drTt}n| 	|rp| 	|rp| 
 }|S )Nz<html)r   r   r   r   r   r   r   lower
startswith_looks_like_markupr    )r   r)   r*   r+   r,   r   r   r   r&   o   s    

zLXMLOutputChecker.get_parserc             C   s   |  }|dot| S )N<)r   r0   _repr_research)r   sr   r   r   r1      s    
z$LXMLOutputChecker._looks_like_markupc       
      C   s  |  |j|jsdS | |j|jds*dS | |j|jds@dS d|jkrt|j }t|j }||krrdS x*|D ]"}| |j| |j| dsxdS qxW |jdkst|rt	|}t	|}xN|s|r|r|sdS |
d}|
d}	| ||	sdS |s|jdkrP qW dS )NFTanyz...r   )tag_comparetagtext_comparetexttailattribsortedkeyslenlistpopr(   )
r   r)   r*   Z	want_keysZgot_keyskeywant_childrengot_childrenZ
want_firstZ	got_firstr   r   r   r(      s6    



zLXMLOutputChecker.compare_docsc             C   s^   |pd}|pd}|r,t | }t | }dt| }|dd}t||rVdS dS d S )N z^%s$z\.\.\.z.*TF)r   r   rer   replacer4   )r   r)   r*   r   r   r   r   r9      s    zLXMLOutputChecker.text_comparec             C   sj   |dkrdS t |tr t |ts(||kS |p.d}|p6d}|dr^|dd |dd kS ||kS d S )Nr6   TrE   z{...}})
isinstance_basestringr0   split)r   r)   r*   r   r   r   r7      s    


zLXMLOutputChecker.tag_comparec             C   s  |j }| |||}g }|d k	ry||}W n0 tjk
r\   t d }|d|  Y nX y||}	W n0 tjk
r   t d }|d|  Y nX |d ks|rt| |||}
|r||
 d	|S |
S |t
k}d| ||dd| |	|dd| ||	|dg}d	|S )	N   zIn example: %szIn actual output: %s
z	Expected:   zGot:zDiff:)r)   r&   r   r'   sysexc_infoappendr$   output_differencejoinr   
format_doccollect_diff)r   Zexampler*   r+   r)   r,   errorsr-   er.   valuer   Z
diff_partsr   r   r   rS      s:    

z#LXMLOutputChecker.output_differenceTc             C   s.   |sdS |j | jkrdS |js&t|r*dS dS )NFT)r8   
empty_tagsr:   r?   )r   elr   r   r   r   html_empty_tag   s    z LXMLOutputChecker.html_empty_tagrE   c          	   C   s  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  qW |d|  || | |d t|jr|d|  || |j |d d	|S )Nr   rN   rE   rO   )r?   rR   
format_tagr\   r   r:   format_textformat_end_tagr;   rT   rU   )r   docr   indentprefixpartsr[   r   r   r   rU      s@    










zLXMLOutputChecker.format_docc             C   s"   |d krdS |r|  }t|dS )NrE   rM   )r   html_escape)r   r:   r   r   r   r   r^   	  s
    zLXMLOutputChecker.format_textc          	   C   sl   g }t |tjrdS x4t|j D ]"\}}|d|| |df  q$W |sXd|j S d|jd	|f S )Nz<!--z%s="%s"Fz<%s>z<%s %s>r   )
rJ   r   CommentBaser=   r<   itemsrR   r^   r8   rT   )r   r[   attrsnamerY   r   r   r   r]     s    
zLXMLOutputChecker.format_tagc             C   s   t |tjrdS d|j S )Nz-->z</%s>)rJ   r   re   r8   )r   r[   r   r   r   r_     s    z LXMLOutputChecker.format_end_tagc          	   C   s  g }t |st |s|d|  || || | ||sh|| |j|j || || || |j|j |d d|S |d|  || || |d t	|jst	|jr|d|  || |j|j |d t
|}t
|}x|s|r|sF|| |d||d d q|sp|| |d||d d q|| |d|d||d  qW |d|  || || |d t	|jst	|jr|d|  || |j|j |d d|S )Nr   rN   rE   r   rO   +-)r?   rR   collect_diff_tagr\   collect_diff_textr:   collect_diff_end_tagr;   rT   r   r@   rU   rA   rV   )r   r)   r*   r   ra   rc   rC   rD   r   r   r   rV   !  sH    



  $

zLXMLOutputChecker.collect_diffc       	   	   C   s2  |  |j|js"d|j|jf }n|j}g }|jdkp>d|jk}xt|j D ]p\}}||jkr|s|d|| |df  qP||jkr| |j| |d}n| |d}|d||f  qPW |sx@t|j D ].\}}||jkrq|d|| |df  qW |r&d|d|f }nd	| }|S )
Nz%s (got: %s)r6   z+%s="%s"Fz%s="%s"z-%s="%s"z<%s %s>r   z<%s>)	r7   r8   r<   r=   rf   rR   r^   rl   rT   )	r   r)   r*   r8   rg   r6   rh   rY   r:   r   r   r   rk   G  s*    

z"LXMLOutputChecker.collect_diff_tagc             C   s,   |j |j krd|j |j f }n|j }d| S )Nz%s (got: %s)z</%s>)r8   )r   r)   r*   r8   r   r   r   rm   b  s    z&LXMLOutputChecker.collect_diff_end_tagc             C   s:   |  |||r"|sdS | ||S d||f }| ||S )NrE   z%s (got: %s))r9   r^   )r   r)   r*   r   r:   r   r   r   rl   i  s    z#LXMLOutputChecker.collect_diff_textN)T)rE   )T)T)__name__
__module____qualname__rZ   r    r%   r&   r1   r(   r9   r7   rS   r\   rU   r^   r]   r_   rV   rk   rm   rl   r   r   r   r   r   Q   s$    


#
&c               @   s   e Zd Zdd ZdS )r   c             C   s   t S )N)r   )r   r   r   r   r    r  s    z%LHTMLOutputChecker.get_default_parserN)rn   ro   rp   r    r   r   r   r   r   q  s   c             C   s   | rt t_ntt_dS )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   )r   r   r   r   r	   u  s    c       	      C   sz   | r
t }nt}t }|jd }| }|j}||_trJ|jd j}|jj}n|jd j}|jj}t	t
_	t|||||| dS )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_localsZ_checker_IS_PYTHON_3__func__r%   Zim_funcr   rq   _RestoreChecker)	r   
del_moduleZCheckerframedt_selfcheckerold_checker
check_funcZchecker_check_funcr   r   r   r
     s"    


c               @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )rw   c             C   sD   || _ || _| j| j_|| j_|| _|| _|| _|   | 	  d S )N)
rz   r{   
call_superr#   r!   r}   
clone_funcrx   install_cloneinstall_dt_self)r   rz   r|   Znew_checkerr}   r   rx   r   r   r   __init__  s    
z_RestoreChecker.__init__c             C   sJ   t r&| jj| _| jj| _| jj| j_n | jj| _| jj| _| jj| j_d S )N)ru   r}   __code__	func_code__globals__Zfunc_globalsr   )r   r   r   r   r     s    



z_RestoreChecker.install_clonec             C   s   t r| j| j_n
| j| j_d S )N)ru   r   r}   r   )r   r   r   r   uninstall_clone  s    z_RestoreChecker.uninstall_clonec             C   s   | j j| _| | j _d S )N)rz   _DocTestRunner__record_outcome	prev_func)r   r   r   r   r     s    
z_RestoreChecker.install_dt_selfc             C   s   | j | j_d S )N)r   rz   r   )r   r   r   r   uninstall_dt_self  s    z!_RestoreChecker.uninstall_dt_selfc             C   sL   | j rHdd l}|j| j = d| j krH| j dd\}}|j| }t|| d S )Nr   .rM   )rx   rP   modulesrsplitdelattr)r   rP   packagemoduleZpackage_modr   r   r   uninstall_module  s    


z _RestoreChecker.uninstall_modulec             O   s4   |    |   | j`| j`| j||}|   |S )N)r   r   r{   r!   r#   r   r   )r   argskwresultr   r   r   __call__  s    z_RestoreChecker.__call__c             O   s$   |    z| j||S |   X d S )N)r   r}   r   )r   r   r   r   r   r   r~     s    z_RestoreChecker.call_superN)rn   ro   rp   r   r   r   r   r   r   r   r~   r   r   r   r   rw     s   	rw   c              C   s@   dd l } | d}x |r2|j}d|kr*|S |j}qW tdd S )Nr   rM   ZBOOMzBCould not find doctest (only use this function *inside* a doctest))rP   	_getframert   f_backLookupError)rP   ry   lr   r   r   rs     s    

rs   Z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   rP   rF   rq   r   r   rd   ImportErrorcgi__all__
basestringrK   	NameErrorstrbytesversion_inforu   Zregister_optionflagr   r   r   r$   r   r   Z
HTMLParserr   r   compiler3   r   r   r   r	   r
   objectrw   rs   Z__test__rn   Ztestmodr   r   r   r   <module>$   sL   





  "

'6

