
    EthG                     <   d Z ddlmZ ddlZddlZddlZ	 ddlmZ n# e	$ r	 ddl
mZ Y nw xY wg dZ	 eZn# e$ r eefZY nw xY wej        d         dk    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e$          Z%d Z&ddiZ'e(dk    rddlZ ej)                     dS 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   r   r   r   c                 2    | d S |                                  S N)stripvs    g/var/www/html/mycamper/aliexpress-site/backend/venv/lib/python3.11/site-packages/lxml/doctestcompare.pyr   r   ?   s    ytwwyy    c                 8    t                               d|           S )N )_norm_whitespace_resubr   s    r   norm_whitespacer   E   s    ""3***r   FT)recoverremove_blank_textc                 6    t          j        | t                    S r   )r   
fromstring_html_parserhtmls    r   html_fromstringr    J   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dS )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_parserW   s
    yr   c                 Z   t          | dd           }|
| j        }|} nt          j        }|                     |||          }|s || |||          S 	  ||          }n# t
          j        $ r Y dS w xY w	  ||          }n# t
          j        $ r Y dS w xY w|                     ||          S )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   r6   zLXMLOutputChecker.check_outputZ   s    4!6===LDD(5LsK88 	.<dC. . .	vd||HH# 	 	 	55		fSkkGG# 	 	 	55	  7333s$   A A10A15B BBc                    d }t           |z  rd S t          |z  rt          }nt          |z  rt          j        }n|                                                                                    d          r/|                                                    d          rt          }n>| 	                    |          r)| 	                    |          r| 
                                }|S )Nz<html)r   r   r    r   r   r-   r   lower
startswith_looks_like_markupr0   )r/   r:   r;   r<   r?   s        r   r7   zLXMLOutputChecker.get_parsero   s    K' 	4# 		/$FF$ 	/YFFjjll  ""--g66 	/))++((11	/$FF%%d++ 	/))#..	/,,..Fr   c                     |                                 }|                    d          ot                              |           S )N<)r   rD   _repr_research)r/   ss     r   rE   z$LXMLOutputChecker._looks_like_markup   s:    GGIIS!! + ***	,r   c                 &   |                      |j        |j                  sdS |                     |j        |j        d          sdS |                     |j        |j        d          sdS d|j        vrt          |j                                                  }t          |j                                                  }||k    rdS |D ]2}|                     |j        |         |j        |         d          s dS 3|j        dk    st          |          r|t          |          }t          |          }|s|rZ|r|sdS |
                    d          }|
                    d          }	|                     ||	          sdS |s|j        dk    rn|X|ZdS )NFTanyz...r   )tag_comparetagtext_comparetexttailattribsortedkeyslenlistpopr9   )
r/   r:   r;   	want_keysgot_keyskeywant_childrengot_children
want_first	got_firsts
             r   r9   zLXMLOutputChecker.compare_docs   s   #'22 	5  CHd;; 	5  CHd;; 	5##t{//1122Icjoo//00HH$$u  ! !((S)93:c?ERR ! 55!9T JJM99L < $ !L ! 5*..q11
(,,Q//	((Y?? ! 5# 
5(@(@   <  tr   c                 &   |pd}|pd}|rBt          |                                          }t          |                                          }dt          j        |          z  }|                    dd          }t          j        ||          rdS dS )N z^%s$z\.\.\.z.*TF)r   r   rer   replacerI   )r/   r:   r;   r   s       r   rO   zLXMLOutputChecker.text_compare   s    zriR 	/"4((..00D!#&&,,..C	$'||It,,9T3 	45r   c                 (   |dk    rdS t          |t                    rt          |t                    s||k    S |pd}|pd}|                    d          r8|                    d          d         |                    d          d         k    S ||k    S )NrL   Tr`   z{...}})
isinstance_basestringrD   split)r/   r:   r;   s      r   rM   zLXMLOutputChecker.tag_compare   s    5==44-- 	c;//	3;zriR??7## 	::c??2&#))C..*<<<3;r   c                    |j         }|                     |||          }g }|	  ||          }nF# t          j        $ r4 t	          j                    d         }|                    d|z             Y nw xY w	  ||          }	nF# t          j        $ r4 t	          j                    d         }|                    d|z             Y nw xY w||rKt                              | |||          }
|r*|                    |
           d	                    |          S |
S |t          u }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:   r7   r   r8   sysexc_infoappendr5   output_differencejoinr    
format_doccollect_diff)r/   exampler;   r<   r:   r?   errorsr@   erA   valuer   
diff_partss                r   rp   z#LXMLOutputChecker.output_difference   s   |sK884!6$<<' 4 4 4LNN1%.2333334: &++' : : :LNN1%4q899999: >V>!33gsK1 1E e$$$yy((((!ooha88oogtQ77'''4CCE
 yy$$$s#   0 A A32A37B A CCTc                 ^    |sdS |j         | j        vrdS |j        st          |          rdS dS )NFT)rN   
empty_tagsrP   rU   )r/   elr   s      r   html_empty_tagz LXMLOutputChecker.html_empty_tag   sD     	56((57 	c"gg 	5tr   r`   c           	         g }t          |          s?|                    d|z             |                    |           |                    |                     |                     |                     ||          sit	          |j                  r-|                    |                     |j                             |                    |                     |                     t	          |j                  r-|                    |                     |j                             |                    d           d	                    |          S |                    d|z             |                    |           |                    |                     |                     |                     ||          s
|                    d           t	          |j                  rZ|                    d|z             |                    |                     |j                             |                    d           |D ]/}|                    | 
                    |||dz                        0|                    d|z             |                    |                     |                     |                    d           t	          |j                  rZ|                    d|z             |                    |                     |j                             |                    d           d	                    |          S )Nr   rk   r`   rl   )rU   ro   
format_tagr|   r   rP   format_textformat_end_tagrQ   rq   rr   )r/   docr   indentprefixpartsr{   s          r   rr   zLXMLOutputChecker.format_doc   s   3xx 	"LLV$$$LL   LL--...&&sD11 7?? =LL!1!1#(!;!;<<<T0055666SX 9T--ch77888LL775>>!SZ   VT__S))***""3-- 
	LLSX #SZ(((T--ch77888T""" B BT__Rvax@@AAAALLV$$$LL,,S11222LL?? 	LLV$$$LL))#(33444LLwwu~~r   c                 V    |dS |r|                                 }t          |d          S )Nr`   rj   )r   html_escape)r/   rP   r   s      r   r   zLXMLOutputChecker.format_text	  s1    <2 	 ::<<D4###r   c           	      N   g }t          |t          j                  rdS t          |j                                                  D ]4\  }}|                    |d|                     |d          d           5|s
d|j        z  S d|j        dd	                    |          dS )	Nz<!--="F"<%s>rG   r   >)
rf   r   CommentBaserS   rR   itemsro   r   rN   rq   )r/   r{   attrsnamerw   s        r   r~   zLXMLOutputChecker.format_tag  s    b%+,, 	6!")//"3"344 	M 	MKD%LLdddD,<,<UE,J,J,J,JKLLLL 	#BF?"	#FFFCHHUOOOO44r   c                 N    t          |t          j                  rdS d|j        z  S )Nz--></%s>)rf   r   r   rN   )r/   r{   s     r   r   z LXMLOutputChecker.format_end_tag  s)    b%+,, 	5r   c           	         g }t          |          s t          |          s|                    d|z             |                    |                     ||                     |                     ||          s\|                    |                     |j        |j                             |                    |                     ||                     |                    |                     |j        |j                             |                    d           d                    |          S |                    d|z             |                    |                     ||                     |                    d           t          |j                  st          |j                  r`|                    d|z             |                    |                     |j        |j                             |                    d           t          |          }t          |          }|s|r|sB|                    |                     |                    d          ||dz   d                     H|sB|                    |                     |                    d          ||dz   d                     |                    |                     |                    d          |                    d          ||dz                        |||                    d|z             |                    |                     ||                     |                    d           t          |j                  st          |j                  r`|                    d|z             |                    |                     |j        |j                             |                    d           d                    |          S )Nr   rk   r`   r   rl   +-)rU   ro   collect_diff_tagr|   collect_diff_textrP   collect_diff_end_tagrQ   rq   r   rV   rr   rW   rs   )r/   r:   r;   r   r   r   r[   r\   s           r   rs   zLXMLOutputChecker.collect_diff!  s   4yy 	"S 	"LLV$$$LL..tS99:::&&sD11 CT33DIsxHHIIIT66tSAABBBLL//	38DDEEELL775>>!SZ   T**455666T 	uSX 	LLV$$$LL//	38DDEEELLT

Cyy 	L| 	L  T__\-=-=a-@-@$qRUVVWWW T__]->->q-A-A4PQSVWWXXXLL**!!!$$l&6&6q&9&94K K L L L  	L| 	L 	SZ   T..tS99:::T 	uSX 	LLV$$$LL//	38DDEEELLwwu~~r   c           
      H   |                      |j        |j                  s|j        d|j        d}n|j        }g }|j        dk    pd|j        v }t          |j                                                  D ]\  }}||j        vr3|s1|                    d|d|                     |d          d           A||j        v r#|                     |j        |         |d          }n|                     |d          }|                    |d|d           |sft          |j                                                  D ]?\  }}||j        v r|                    d|d|                     |d          d           @|rd	|d
d
                    |          d}nd|z  }|S )N (got: )rL   r   r   Fr   r   rG   r   r   r   )	rM   rN   rR   rS   r   ro   r   r   rq   )	r/   r:   r;   rN   r   rL   r   rw   rP   s	            r   r   z"LXMLOutputChecker.collect_diff_tagG  s   #'22 	$(HHHcggg6CC'Ch%75DK#7!#*"2"2"4"455 	7 	7KD%4;&&s&4441A1A%1O1O1O1OPQQQQ4;&&11$+d2CUERRDD++E599D$$$56666 	R%dk&7&7&9&9:: R Re3:%%4441A1A%1O1O1O1OPQQQQ 	 	"ssCHHUOOOO4CC3,C
r   c                 `    |j         |j         k    r|j         d|j         d}n|j         }d|z  S )Nr   r   r   )rN   )r/   r:   r;   rN   s       r   r   z&LXMLOutputChecker.collect_diff_end_tagb  s:    8sw$(HHHcggg6CC'C}r   c                     |                      |||          r|sdS |                     ||          S |d|d}|                     ||          S )Nr`   r   r   )rO   r   )r/   r:   r;   r   rP   s        r   r   z#LXMLOutputChecker.collect_diff_texti  sg    T3.. 	0 r##C///!%sss+e,,,r   N)T)r`   )__name__
__module____qualname__rz   r0   r6   r7   rE   r9   rO   rM   rp   r|   rr   r   r~   r   rs   r   r   r    r   r   r   r   Q   s1       'J  4 4 4*   , , ,
  :    % % %@   ! ! ! !F$ $ $ $	5 	5 	5     $ $ $L  6  - - - - - -r   r   c                       e Zd Zd ZdS )r	   c                     t           S r   )r    r.   s    r   r0   z%LHTMLOutputChecker.get_default_parserr  s    r   N)r   r   r   r0   r   r   r   r	   r	   q  s#            r   r	   c                 R    | rt           t          _        dS 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	   doctestr5   r   r   s    r   r
   r
   u  s(      2 2 1r   c                 `   | rt           }nt          }t                      }|j        d         } |            }|j        }||_        t
          r|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_locals_checker_IS_PYTHON_3__func__r6   im_funcr   r   _RestoreChecker)	r   
del_moduleCheckerframedt_selfcheckerold_checker
check_funcchecker_check_funcs	            r   r   r     s      $$#!!EnV$GgiiG"KG  :^G,5
$1:^G,4
$19 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
d	S )
r   c                     || _         || _        | j        | j        _        || j        _        || _        || _        || _        |                                  | 	                                 d S r   )
r   r   
call_superr4   r2   r   
clone_funcr   install_cloneinstall_dt_self)r/   r   r   new_checkerr   r   r   s          r   __init__z_RestoreChecker.__init__  se    "59_2+6($$$r   c                     t           r:| j        j        | _        | j        j        | _        | j        j        | j        _        d S | j        j        | _        | j        j        | _        | j        j        | j        _        d S r   )r   r   __code__	func_code__globals__func_globalsr   r.   s    r   r   z_RestoreChecker.install_clone  sg     	B!_5DN $ ;D'+'?DO$$$!_6DN $ <D(,(ADO%%%r   c                 \    t           r| j        | j        _        d S | j        | j        _        d S r   )r   r   r   r   r.   s    r   uninstall_clonez_RestoreChecker.uninstall_clone  s.     	7'+~DO$$$(,DO%%%r   c                 @    | j         j        | _        | | j         _        d S r   )r   _DocTestRunner__record_outcome	prev_funcr.   s    r   r   z_RestoreChecker.install_dt_self  s    D6:333r   c                 (    | j         | j        _        d S r   )r   r   r   r.   s    r   uninstall_dt_selfz!_RestoreChecker.uninstall_dt_self  s    6:n333r   c                     | j         rWdd l}|j        | j         = d| j         v r?| j                             dd          \  }}|j        |         }t	          ||           d S d S d S )Nr   .rj   )r   rm   modulesrsplitdelattr)r/   rm   packagemodulepackage_mods        r   uninstall_modulez _RestoreChecker.uninstall_module  s}    ? 	-JJJDO,do%%"&/"8"8a"@"@!k'2V,,,,,	- 	- &%r   c                     |                                   |                                  | j        `| j        ` | j        |i |}|                                  |S r   )r   r   r   r2   r4   r   r   )r/   argskwresults       r   __call__z_RestoreChecker.__call__  sc       L,L6,,,r   c                     |                                   	  | j        |i ||                                  S # |                                  w xY wr   )r   r   r   )r/   r   r   s      r   r   z_RestoreChecker.call_super  sZ    	!"4?D/B//    D    s	   7 AN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s        
 
 
B B B7 7 7
; ; ;E E E- - -  ! ! ! ! !r   r   c                  x    dd l }  | j        d          }|r|j        }d|v r|S |j        }|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     sd    JJJCM!E
 NQ;;L   LN 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   ra   r   r   r   r   ImportErrorcgi__all__
basestringrg   	NameErrorstrbytesversion_infor   register_optionflagr   r   r   r5   r   r   
HTMLParserr   r    compilerH   r   r   r	   r
   r   objectr   r   __test__r   testmodr   r   r   <module>r      s  # #J       



 				 ******** * * *))))))))*< < <KK   ,KKK "a'(W(66
'G'44	,,-=>>%  + + +  uFFF0 0 0 2:-.. bj!344 ^- ^- ^- ^- ^- ^- ^- ^-@	    *   
2 
2 
2 
2%  %  %  % N4! 4! 4! 4! 4!f 4! 4! 4!l
N 
N 
N  
	 zNNNGO s    ++6 	AA