
    gg$                        d Z ddlm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m
Z
 ddlmZ d	d
lmZ ddlmZ erddlmZ ddlmZ ddZddZe G d d             Zy)z4Helper functions for writing to terminals and files.    )annotationsN)final)Literal)Sequence)TextIO)TYPE_CHECKING   )assert_never   )wcswidth)	Formatter)Lexerc                 F    t        j                  d      \  } }| dk  rd} | S )N)P      )fallback(   r   )shutilget_terminal_size)width_s     O/var/www/openai/venv/lib/python3.12/site-packages/_pytest/_io/terminalwriter.pyget_terminal_widthr      s)    '':HE1 rzL    c                   t         j                  j                  d      dk(  ryt         j                  j                  d      dk(  ryt         j                  j                  d      ryt         j                  j                  d      ryt        | d      xr4 | j	                         xr" t         j                  j                  d	      d
k7  S )N	PY_COLORS1T0FNO_COLORFORCE_COLORisattyTERMdumb)osenvirongethasattrr!   )files    r   should_do_markupr)   $   s    	zz~~k"c)	zz~~k"c)	zz~~j!	zz~~m$hVDKKMVbjjnnV6LPV6Vr   c                  \   e Zd Z ed5i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(Zd:d;d*Zed<d+       Zej                  d=d,       Zed<d-       Z	d>d.Z
	 	 d?	 	 	 	 	 	 	 	 	 d@d/Zd0d1dAd2ZdBdCd3ZdDd4ZdEdFd6ZdGd7ZdHd8Z	 dI	 	 	 	 	 dJd9Zy))KTerminalWriterblack   red   green    yellow!   blue"   purple#   cyan$   white%   Blackr   Red)   Green*   Yellow+   Blue,   Purple-   Cyan.   White/   boldr   lightr	   blink   invert   Nc                D   |t         j                  }t        |d      rG|j                         r7t         j                  dk(  r$	 dd l}|j                  |      j                  }|J || _	        t        |      | _        d| _        d | _        d| _        y # t        $ r Y 8w xY w)Nr!   win32r    T)sysstdoutr'   r!   platformcoloramaAnsiToWin32streamImportError_filer)   	hasmarkup_current_line_terminal_widthcode_highlight)selfr(   rW   s      r   __init__zTerminalWriter.__init__K   s    <::D4"t{{}9P(  ++D188'''
)$/+/"  s   B 	BBc                F    | j                   | j                   S t               S N)r^   r   r`   s    r   	fullwidthzTerminalWriter.fullwidth\   s#    +'''!##r   c                    || _         y rc   )r^   )r`   values     r   re   zTerminalWriter.fullwidthb   s
    $r   c                ,    t        | j                        S )z;Return an estimate of the width so far in the current line.)r   r]   rd   s    r   width_of_current_linez$TerminalWriter.width_of_current_linef   s     **++r   c                   |D ]  }|| j                   vst        d|       | j                  rR|j                         D cg c]  \  }}|s	| j                   |    }}}|rdj	                  d |D              |z   dz   }|S c c}}w )Nzunknown markup: rS   c              3  (   K   | ]
  }d | d  yw)z[mN ).0cods     r   	<genexpr>z(TerminalWriter.markup.<locals>.<genexpr>r   s     =#se1~s   [0m)	_esctable
ValueErrorr\   itemsjoin)r`   textmarkupnameonescs         r   rw   zTerminalWriter.markupk   s    D4>>) #3D8!<==  >>8>MHD""4>>$'CMww===DyP Ns   
BBc                   || j                   }t        j                  dk(  r|dz  }|:t        |t	        |      z
  dz
  dt	        |      z  z  d      }||z  }| d| d| }n||t	        |      z  z  }t	        |      t	        |j                               z   |k  r||j                         z  } | j                  |fi | y )NrR   r   r	    )re   rT   rV   maxlenrstripline)r`   sepchartitlere   rw   Nfillr   s           r   sepzTerminalWriter.sepu   s     I <<7"
 NI
 YU+a/QW5EFJAQ;DV1UG1TF+D i3w<78D t9s7>>+,,	9GNN$$D		$!&!r   F)flushc                  |ry|j                  dd      d   }d|v r|| _        n| xj                  |z  c_         | j                  |fi |}	 | j                  j	                  |       |r| j                          y y y # t
        $ r> |j                  d      j                  d      }| j                  j	                  |       Y [w xY w)N
r   zunicode-escapeascii)	rsplitr]   rw   r[   writeUnicodeEncodeErrorencodedecoder   )r`   msgr   rw   current_lines        r   r   zTerminalWriter.write   s    ::dA.r2Ls{%1"""l2"$++c,V,C
&

  % 

 +  & & jj!1299'B

  %&s   A= =ACCc                L     | j                   |fi | | j                  d       y )Nr   )r   )r`   srw   s      r   r   zTerminalWriter.line   s!    

1

4r   c                8    | j                   j                          y rc   )r[   r   rd   s    r   r   zTerminalWriter.flush   s    

r   rm   c                P   |r;t        |      t        |      k7  r$t        dt        |       dt        |       d      |sdgt        |      z  }dj                  |      }| j                  |      j	                         }t        ||      D ]  \  }}| j                  ||z           y)aI  Write lines of source code possibly highlighted.

        Keeping this private for now because the API is clunky. We should discuss how
        to evolve the terminal writer so we can have more precise color support, for example
        being able to write part of a line in one color and the rest in another, and so on.
        zindents size (z") should have same size as lines ()rS   r   N)r~   rs   ru   
_highlight
splitlineszipr   )r`   linesindentssource	new_linesindentnew_lines          r   _write_sourcezTerminalWriter._write_source   s     s7|s5z1 W.PQTUZQ[P\\]^  dSZ'G5!OOF+668	 #GY 7FHIIfx'( !8r   c                    	 |dk(  rddl m}  |       S |dk(  rddlm}  |       S t	        |       y # t
        $ r Y y w xY w)Npythonr   )PythonLexerdiff)	DiffLexer)pygments.lexers.pythonr   pygments.lexers.diffr   r
   ModuleNotFoundError)r`   lexerr   r   s       r   _get_pygments_lexerz"TerminalWriter._get_pygments_lexer   sF    	 >"}$&: {"U#" 		s   2 2 2 	>>c                \   	 dd l }ddlm} t	        j
                  d      }t	        j
                  dd      }	 ddlm}  |||      S # t        $ r Y y w xY w# |j                  j                  $ r} |d| d	      |d }~w|j                  j                  $ r} |d
| d      |d }~ww xY w)Nr   )
UsageErrorPYTEST_THEMEPYTEST_THEME_MODEdark)TerminalFormatter)bgstylez9PYTEST_THEME environment variable has an invalid value: 'zC'. Hint: See available pygments styles with `pygmentize -L styles`.z>PYTEST_THEME_MODE environment variable has an invalid value: 'z7'. The allowed values are 'dark' (default) and 'light'.)pygments.utilr   _pytest.config.exceptionsr   r$   getenvpygments.formatters.terminalr   utilClassNotFoundOptionError)r`   pygmentsr   theme
theme_moder   es          r   _get_pygments_formatterz&TerminalWriter._get_pygments_formatter   s    	  	9		.)YY2F;
	F$
%@@ # 		 }}** 	KE7 SS S  }}(( 	PQ[P\ ]G G 	s4   A A 	AAB+0A==B+B&&B+c                    |r| j                   r| j                  s|S | j                  |      }||S | j                         }||S ddlm}  ||||      }|d   dk(  r|d   dk7  r|dd }d|z   }|S )z5Highlight the given source if we have markup support.Nr   )	highlightr   r   rq   )r\   r_   r   r   r   r   )r`   r   r   pygments_lexerpygments_formatterr   highlighteds          r   r   zTerminalWriter._highlight   s     T^^43F3FM11%8!M!99;%M&$V^=OP r?d"vbzT'9%cr*K
  +-r   rc   )r(   zTextIO | NonereturnNoner   int)rg   r   r   r   )rv   strrw   boolr   r   )NN)
r   r   r   z
str | Nonere   z
int | Nonerw   r   r   r   )r   r   r   r   rw   r   r   r   )rS   )r   r   rw   r   r   r   )r   r   )rm   )r   Sequence[str]r   r   r   r   )r   zLiteral['python', 'diff']r   zLexer | None)r   zFormatter | None)r   )r   r   r   zLiteral['diff', 'python']r   r   )__name__
__module____qualname__dictrr   ra   propertyre   setterri   rw   r   r   r   r   r   r   r   r   rm   r   r   r+   r+   2   s      	
             !" #$ %& '( )I.#" $ $
 % % , , ! $	#"#" #" 	#"
 #" 
#"J 05 2)$8 ?G";	r   r+   r   )r(   r   r   r   )__doc__
__future__r   r$   r   rT   typingr   r   r   r   r   compatr
   wcwidthr   pygments.formatterr   pygments.lexerr   r   r)   r+   rm   r   r   <module>r      sZ    : " 	  
       !  ,$ _ _ _r   