£Á°è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   )
Z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   r/   _repr_research)r   sr   r   r   r0      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   replacer3   )r   r(   r)   r   r   r   r   r8      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 )Nr5   TrD   z{...}})
isinstance_basestringr/   split)r   r(   r)   r   r   r   r6      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   rR      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)r7   
empty_tagsr9   r>   )r   elr   r   r   r   html_empty_tag   s    z LXMLOutputChecker.html_empty_tagrD   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   rM   rD   rN   )r>   rQ   
format_tagr[   r   r9   format_textformat_end_tagr:   rS   rT   )r   docr   indentprefixpartsrZ   r   r   r   rT      s@    










zLXMLOutputChecker.format_docc             C   s"   |d krdS |r|  }t|dS )NrD   rL   )r   html_escape)r   r9   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   )
rI   r   CommentBaser<   r;   itemsrQ   r]   r7   rS   )r   rZ   attrsnamerX   r   r   r   r\     s    
zLXMLOutputChecker.format_tagc             C   s   t |tjrdS d|j S )Nz-->z</%s>)rI   r   rd   r7   )r   rZ   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   rM   rD   r   rN   +-)r>   rQ   collect_diff_tagr[   collect_diff_textr9   collect_diff_end_tagr:   rS   r   r?   rT   r@   rU   )r   r(   r)   r   r`   rb   rB   rC   r   r   r   rU   !  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)r5   z+%s="%s"Fz%s="%s"z-%s="%s"z<%s %s>r   z<%s>)	r6   r7   r;   r<   re   rQ   r]   rk   rS   )	r   r(   r)   r7   rf   r5   rg   rX   r9   r   r   r   rj   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>)r7   )r   r(   r)   r7   r   r   r   rl   b  s    z&LXMLOutputChecker.collect_diff_end_tagc             C   s:   |  |||r"|sdS | ||S d||f }| ||S )NrD   z%s (got: %s))r8   r]   )r   r(   r)   r   r9   r   r   r   rk   i  s    z#LXMLOutputChecker.collect_diff_textN)T)rD   )T)T)__name__
__module____qualname__rY   r   r$   r%   r0   r'   r8   r6   rR   r[   rT   r]   r\   r^   rU   rj   rl   rk   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)rm   rn   ro   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   rp   _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 )rv   c             C   sD   || _ || _| j| j_|| j_|| _|| _|| _|   | 	  d S )N)
ry   rz   
call_superr"   r    r|   
clone_funcrw   install_cloneinstall_dt_self)r   ry   r{   Znew_checkerr|   r~   rw   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)rt   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)rt   r   r|   r   )r   r   r   r   uninstall_clone  s    z_RestoreChecker.uninstall_clonec             C   s   | j j| _| | j _d S )N)ry   _DocTestRunner__record_outcome	prev_func)r   r   r   r   r     s    
z_RestoreChecker.install_dt_selfc             C   s   | j | j_d S )N)r   ry   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   .rL   )rw   rO   modulesrsplitdelattr)r   rO   packagemoduleZpackage_modr   r   r   uninstall_module  s    


z _RestoreChecker.uninstall_modulec             O   s4   |    |   | j`| j`| j||}|   |S )N)r   r   rz   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)rm   rn   ro   r   r   r   r   r   r   r   r}   r   r   r   r   rv     s   	rv   c              C   s@   dd l } | d}x |r2|j}d|kr*|S |j}qW tdd S )Nr   rL   ZBOOMzBCould not find doctest (only use this function *inside* a doctest))rO   	_getframers   f_backLookupError)rO   rx   lr   r   r   rr     s    

rr   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__Zlxmlr   rO   rE   rp   r   r   rc   ImportErrorZcgi__all__Z
basestringrJ   	NameErrorstrbytesversion_infort   Zregister_optionflagr   r   r   r#   r   r   Z
HTMLParserr   r   compiler2   r   r   r   r	   r
   objectrv   rr   Z__test__rm   Ztestmodr   r   r   r   <module>$   sL   





  "

'6

