
    NgCE                        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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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_installr   r   r   c                 2    | d S |                                  S N)stripvs    O/var/www/html/ai-engine/env/lib/python3.11/site-packages/lxml/doctestcompare.pyr   r   8   s    ytwwyy    c                 8    t                               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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_parserP   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   r5   zLXMLOutputChecker.check_outputS   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_markupr/   )r.   r9   r:   r;   r>   s        r   r6   zLXMLOutputChecker.get_parserh   s    K' 	4# 		/$FF$ 	/YFFjjll  ""--g66 	/))++((11	/$FF%%d++ 	/))#..	/,,..Fr   c                     |                                 }|                    d          ot                              |           S )N<)r   rC   _repr_research)r.   ss     r   rD   z$LXMLOutputChecker._looks_like_markupx   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popr8   )
r.   r9   r:   	want_keysgot_keyskeywant_childrengot_children
want_first	got_firsts
             r   r8   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   replacerH   )r.   r9   r:   r   s       r   rN   zLXMLOutputChecker.text_compare   s    zriR 	/"4((..00D!#&&,,..C	$'||It,,9T3 	45r   c                 D   |dk    rdS t          |t          t          f          rt          |t          t          f          s||k    S |pd}|pd}|                    d          r8|                    d          d         |                    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4#u.. 	!#U|44	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:)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   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)rM   
empty_tagsrO   rT   )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   )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   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.   rO   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>rF   r   >)
re   r   CommentBaserR   rQ   itemsro   r   rM   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>)re   r   r   rM   )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   +-)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   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: )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@  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   )rM   )r.   r9   r:   rM   s       r   r   z&LXMLOutputChecker.collect_diff_end_tag[  s:    8sw$(HHHcggg6CC'C}r   c                     |                      |||          r|sdS |                     ||          S |d|d}|                     ||          S )Nr_   r   r   )rN   r   )r.   r9   r:   r   rO   s        r   r   z#LXMLOutputChecker.collect_diff_textb  sg    T3.. 	0 r##C///!%sss+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   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   r/   z%LHTMLOutputChecker.get_default_parserk  s    r   N)r   r   r   r/   r   r   r   r	   r	   j  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	   doctestr4   r   r   s    r   r
   r
   n  s(      2 2 1r   c                    | rt           }nt          }t                      }|j        d         } |            }|j        }||_        |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__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nV$GgiiG"KG (1J -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
d	S )
r   c                     || _         || _        | j        | j        _        || j        _        || _        || _        || _        |                                  | 	                                 d S 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__  se    "59_2+6($$$r   c                 v    | j         j        | _        | j         j        | _        | j        j        | j         _        d S r   )r   __code__	func_code__globals__func_globalsr   r-   s    r   r   z_RestoreChecker.install_clone  s0    1 O7#'?#;   r   c                 (    | j         | j        _        d S r   )r   r   r   r-   s    r   uninstall_clonez_RestoreChecker.uninstall_clone  s    #'>   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   r1   r3   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        
 
 
< < <2 2 2; ; ;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   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      sR  # #J       



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