
    gn                        d dl mZ d dlZd dlmZ d dlZd dlZd dlZd dlZd dl	m
Z
 d dl	mZ d dl	mZ d dlZ G d d      Zdd	Zddd
ZddZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZy)    )annotationsN)bisect_right)Iterable)Iterator)overloadc                      e Zd ZdZdddZddZdZedd       Zedd       ZddZddZ	dd	Z
dd
ZdddZddZddZddZddZy)SourcezvAn immutable object holding a source code fragment.

    When using Source(...), the source lines are deindented.
    Nc                   |sg | _         y t        |t              r|j                   | _         y t        |t        t        f      rt        d |D              | _         y t        |t              r t        |j                  d            | _         y 	 t        |      }t        j                  |      }t        |j                  d            | _         y # t        $ r t        j                  |      }Y @w xY w)Nc              3  >   K   | ]  }|j                  d         yw
N)rstrip.0xs     I/var/www/openai/venv/lib/python3.12/site-packages/_pytest/_code/source.py	<genexpr>z"Source.__init__.<locals>.<genexpr>   s     !>#Q!((4.#s   r   )lines
isinstancer	   tuplelistdeindentstrsplit
getrawcodeinspect	getsource	TypeError)selfobjrawcodesrcs       r   __init__zSource.__init__   s    $&DJV$DJeT]+!!>#!>>DJS!!#))D/2DJ-$S/''0 "#))D/2DJ  -'',-s    C C-,C-c                `    t        |t              st        S | j                  |j                  k(  S N)r   r	   NotImplementedr   )r   others     r   __eq__zSource.__eq__'   s%    %(!!zzU[[((    c                     y r%    r   keys     r   __getitem__zSource.__getitem__/   s    ,/r)   c                     y r%   r+   r,   s     r   r.   zSource.__getitem__2   s    14r)   c                    t        |t              r| j                  |   S |j                  dvrt	        d      t               }| j                  |j                  |j                   |_        |S )N)N   z!cannot slice a Source with a step)r   intr   step
IndexErrorr	   startstop)r   r-   	newsources      r   r.   zSource.__getitem__5   sY    c3::c?"xxy( !DEEI"jjSXX>IOr)   c                ,    t        | j                        S r%   )iterr   r   s    r   __iter__zSource.__iter__?   s    DJJr)   c                ,    t        | j                        S r%   )lenr   r:   s    r   __len__zSource.__len__B   s    4::r)   c                   dt        |       }}||k  rE| j                  |   j                         s(|dz  }||k  r| j                  |   j                         s(||kD  rK| j                  |dz
     j                         s+|dz  }||kD  r!| j                  |dz
     j                         s+t               }| j                  || |j                  dd |S )zGReturn new Source object with trailing and leading blank lines removed.r   r1   N)r=   r   stripr	   )r   r5   endsources       r   r@   zSource.stripE   s    D	sck$**U"3"9"9";QJE ck$**U"3"9"9";Ek$**S1W"5";";"=1HC Ek$**S1W"5";";"=**U3/Qr)   c                h    t               }| j                  D cg c]  }||z   	 c}|_        |S c c}w )z^Return a copy of the source object with all lines indented by the
        given indent-string.)r	   r   )r   indentr7   lines       r   rD   zSource.indentP   s5     H	7;zzBztFTMzB	 Cs   /c                4    | j                  |      \  }}| || S )zUReturn Source statement which contains the given linenumber
        (counted from 0).)getstatementrange)r   linenor5   rA   s       r   getstatementzSource.getstatementW   s$     ++F3
sE#r)   c                    d|cxk  rt        |       k  st        d       t        d      t        ||       \  }}}||fS )zmReturn (start, end) tuple which spans the minimal statement region
        which containing the given lineno.r   zlineno out of range)r=   r4   getstatementrange_ast)r   rH   astr5   rA   s        r   rG   zSource.getstatementrange]   sN     V'c$i'233 (233/=UCczr)   c                ^    t               }t        | j                        |j                  dd |S )z&Return a new Source object deindented.N)r	   r   r   )r   r7   s     r   r   zSource.deindente   s&    H	%djj1	r)   c                8    dj                  | j                        S Nr   )joinr   r:   s    r   __str__zSource.__str__k   s    yy$$r)   r%   )r    objectreturnNone)r'   rR   rS   bool)r-   r2   rS   r   )r-   slicerS   r	   )r-   zint | slicerS   zstr | Source)rS   zIterator[str])rS   r2   )rS   r	   )z    )rD   r   rS   r	   )rH   r2   rS   r	   )rH   r2   rS   ztuple[int, int])rS   r   )__name__
__module____qualname____doc__r#   r(   __hash__r   r.   r;   r>   r@   rD   rI   rG   r   rQ   r+   r)   r   r	   r	      sa    
3") H/ /4 4 	%r)   r	   c                    	 t        j                  |       \  }}t               }|D cg c]  }|j	                          c}|_        ||fS # t        $ r Y yw xY wc c}w )N)N)r   
findsource	Exceptionr	   r   r   )r    sourcelinesrH   rB   rE   s        r   r^   r^   t   sc    %005V XF.9:kdDKKMk:FL6>	   ;s   A A	AAc                    	 | j                   S # t        $ r Y nw xY w|r,t        | dd      }|rt        | t              st        |d      S t        d|       )z&Return code object for given function.__call__NF)trycallzcould not get code object for )__code__AttributeErrorgetattrr   typer   r   )r    rc   calls      r   r   r   ~   s`    || sJ-
3-dE22
4SG<
==s    	c                f    t        j                  dj                  |             j                         S rO   )textwrapdedentrP   
splitlines)r   s    r   r   r      s#    ??499U+,7799r)   c                   g }t        j                  |      D ]  }t        |t         j                  t         j                  f      s.t        |t         j
                  t         j                  t         j                  f      r/|j                  D ]   }|j                  |j                  dz
         " |j                  |j                  dz
         dD ]6  }t        ||d       }|s|j                  |d   j                  dz
  dz
         8  |j                          t        ||       }||dz
     }|t        |      k\  rd }	||	fS ||   }	||	fS )Nr1   )	finalbodyorelser   )rL   walkr   stmtExceptHandlerClassDefFunctionDefAsyncFunctionDefdecorator_listappendrH   rf   sortr   r=   )
rH   nodevaluesr   dnamevalinsert_indexr5   rA   s
             r   get_statement_startend2r      s    FXXd^a#((C$5$567!cllCOOS=Q=QRS))AMM!((Q,/ *MM!((Q,'/-4Qd-CMM#a&--!"3a"78	 0  KKM/L<!#$Es6{" #: \"#:r)   c                L  
 |Tt        |      }t        j                         5  t        j                  d       t	        j
                  |dd      }d d d        t        | |      \  }}|t        |j                        }||dz   kD  rt        j                         }t        |j                  |         xr  |j                  |   d   j                         |_        d |j                  || D        
	 t        j                  
fd      D ]  } |j                   |   	 |r=|j                  |dz
     j+                         }	|	j-                  d      s|	s|dz  }nn|r=|||fS # 1 sw Y   xY w# t        j"                  t$        f$ r |j&                  |z   }Y {t(        $ r Y w xY w)	NignorerB   execr1   r   c              3  &   K   | ]	  }|d z     ywr   r+   r   s     r   r   z(getstatementrange_ast.<locals>.<genexpr>   s     :"9Qq4x"9s   c                     t               S r%   )next)its   r   <lambda>z'getstatementrange_ast.<locals>.<lambda>   s	    Rr)   #)r   warningscatch_warningssimplefilterrL   parser   r=   r   r   BlockFinderrU   isspacestartedtokenizegenerate_tokens
tokeneater
EndOfBlockIndentationErrorlastr_   lstrip
startswith)rH   rB   	assertionastnodecontentr5   rA   block_findertokrE   r   s             @r   rK   rK      s    f+ $$&!!(+ii6:G ' )9JE3
 {&,,
UQY **, e$%J&,,u*=a*@*H*H*J 	 ;&,,uS"9:	//0@A'''- B ||C!G$++-??3t1HC  E3I '&0 ""$45 	,##e+C 		s#   -E!0,E. !E+.(F#F#"F#)rS   ztuple[Source | None, int])T)r    rR   rc   rU   rS   ztypes.CodeType)r   zIterable[str]rS   z	list[str])rH   r2   ry   zast.ASTrS   ztuple[int, int | None])FN)
rH   r2   rB   r	   r   rU   r   zast.AST | NonerS   ztuple[ast.AST, int, int])
__future__r   rL   bisectr   r   rj   r   typestypingr   r   r   r   r	   r^   r   r   r   rK   r+   r)   r   <module>r      s    " 
         \% \%H
>:: "	... . 	.
 .r)   