U
    `»{jg$  ã                   @  sÌ   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œdd„Zdddœdd„ZeG dd„ dƒƒZdS )z4Helper functions for writing to terminals and files.é    )ÚannotationsN)Úfinal)ÚLiteral)ÚSequence)ÚTextIO)ÚTYPE_CHECKINGé   )Úassert_neveré   )Úwcswidth)Ú	Formatter)ÚLexerÚint©Úreturnc                  C  s    t jdd�\} }| dk rd} | S )N)éP   é   )Úfallbacké(   r   )ÚshutilÚget_terminal_size)ÚwidthÚ_© r   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/_pytest/_io/terminalwriter.pyÚget_terminal_width   s    r   r   Úbool©Úfiler   c                 C  sj   t j d¡dkrdS t j d¡dkr(dS t j d¡r8dS t j d¡rHdS t| dƒoh|  ¡ oht j d	¡d
kS )NZ	PY_COLORSÚ1TÚ0FÚNO_COLORÚFORCE_COLORÚisattyÚTERMÚdumb)ÚosÚenvironÚgetÚhasattrr#   )r   r   r   r   Úshould_do_markup$   s     ÿr*   c                   @  s4  e Zd Zeddddddddd	d
ddddddddddd�ZdKdddœdd„Zeddœdd„ƒZejddd œd!d„ƒZeddœd"d#„ƒZ	d$d%d$d&œd'd(„Z
dLd$d)d*d%dd+œd,d-„Zd.d/œd$d%d%dd0œd1d2„ZdMd$d%dd4œd5d6„Zddœd7d8„ZdNd:d:dd;œd<d=„Zd>d?d@œdAdB„ZdCdœdDdE„ZdOd$dGd$dHœdIdJ„ZdS )PÚTerminalWriteré   é   é    é!   é"   é#   é$   é%   r   é)   é*   é+   é,   é-   é.   é/   r
   r   é   é   )ÚblackÚredÚgreenÚyellowÚblueÚpurpleÚcyanÚwhiteZBlackÚRedZGreenZYellowZBlueZPurpleZCyanZWhiteÚboldZlightÚblinkÚinvertNzTextIO | NoneÚNoner   c                 C  sŠ   |d krt j}t|dƒrd| ¡ rdt jdkrdzdd l}W n tk
rJ   Y nX | |¡j}|d k	sdt	‚|| _
t|ƒ| _d| _d | _d| _d S )Nr#   Úwin32r   Ú T)ÚsysÚstdoutr)   r#   ÚplatformÚcoloramaÚImportErrorZAnsiToWin32ÚstreamÚAssertionErrorÚ_filer*   Ú	hasmarkupÚ_current_lineÚ_terminal_widthÚcode_highlight)Úselfr   rO   r   r   r   Ú__init__K   s    
zTerminalWriter.__init__r   r   c                 C  s   | j d k	r| j S tƒ S ©N)rV   r   ©rX   r   r   r   Ú	fullwidth\   s    
zTerminalWriter.fullwidth)Úvaluer   c                 C  s
   || _ d S rZ   )rV   )rX   r]   r   r   r   r\   b   s    c                 C  s
   t | jƒS )z;Return an estimate of the width so far in the current line.)r   rU   r[   r   r   r   Úwidth_of_current_linef   s    z$TerminalWriter.width_of_current_lineÚstrr   )ÚtextÚmarkupr   c                   sb   |D ]}|ˆ j krtd|›�ƒ‚qˆ jr^‡ fdd„| ¡ D ƒ}|r^d dd„ |D ƒ¡| d }|S )Nzunknown markup: c                   s   g | ]\}}|rˆ j | ‘qS r   )Ú	_esctable)Ú.0ÚnameÚonr[   r   r   Ú
<listcomp>p   s      z)TerminalWriter.markup.<locals>.<listcomp>rK   c                 s  s   | ]}d |› d�V  qdS )z[ÚmNr   )rc   Zcodr   r   r   Ú	<genexpr>r   s     z(TerminalWriter.markup.<locals>.<genexpr>ú[0m)rb   Ú
ValueErrorrT   ÚitemsÚjoin)rX   r`   ra   rd   Úescr   r[   r   ra   k   s    
zTerminalWriter.markupz
str | Nonez
int | None)ÚsepcharÚtitler\   ra   r   c                 K  s®   |d kr| j }tjdkr |d8 }|d k	rht|t|ƒ d dt|ƒ  dƒ}|| }|› d|› d|› �}n||t|ƒ  }t|ƒt| ¡ ƒ |krœ|| ¡ 7 }| j|f|Ž d S )NrJ   r
   r   ú )r\   rL   rN   ÚmaxÚlenÚrstripÚline)rX   rn   ro   r\   ra   ÚNÚfillrt   r   r   r   Úsepu   s    
"zTerminalWriter.sepF)Úflush)Úmsgrx   ra   r   c                K  s’   |rŽ|  dd¡d }d|kr$|| _n|  j|7  _| j|f|Ž}z| j |¡ W n0 tk
r€   | d¡ d¡}| j |¡ Y nX |rŽ|  ¡  d S )NÚ
r
   éÿÿÿÿzunicode-escapeÚascii)	ÚrsplitrU   ra   rS   ÚwriteÚUnicodeEncodeErrorÚencodeÚdecoderx   )rX   ry   rx   ra   Úcurrent_liner   r   r   r~   š   s    zTerminalWriter.writerK   )Úsra   r   c                 K  s   | j |f|Ž |   d¡ d S )Nrz   )r~   )rX   rƒ   ra   r   r   r   rt   ³   s    zTerminalWriter.linec                 C  s   | j  ¡  d S rZ   )rS   rx   r[   r   r   r   rx   ·   s    zTerminalWriter.flushr   zSequence[str])ÚlinesÚindentsr   c                 C  s‚   |r2t |ƒt |ƒkr2tdt |ƒ› dt |ƒ› d�ƒ‚|sDdgt |ƒ }d |¡}|  |¡ ¡ }t||ƒD ]\}}|  || ¡ qfdS )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 (ú)rK   rz   N)rr   rj   rl   Ú
_highlightÚ
splitlinesÚziprt   )rX   r„   r…   ÚsourceÚ	new_linesÚindentÚnew_liner   r   r   Ú_write_sourceº   s    ÿ
zTerminalWriter._write_sourcezLiteral[('python', 'diff')]zLexer | None)Úlexerr   c                 C  s`   zD|dkrddl m} |ƒ W S |dkr:ddlm} |ƒ W S t|ƒ W n tk
rZ   Y d S X d S )NÚpythonr   )ÚPythonLexerÚdiff)Ú	DiffLexer)Zpygments.lexers.pythonr‘   Zpygments.lexers.diffr“   r	   ÚModuleNotFoundError)rX   r�   r‘   r“   r   r   r   Ú_get_pygments_lexerÌ   s    z"TerminalWriter._get_pygments_lexerzFormatter | Nonec              
   C  sÔ   zdd l }W n tk
r"   Y d S X ddlm} t d¡}t dd¡}zddlm} |||d�W S  |jj	k
r˜ } z|d|› d	�ƒ|‚W 5 d }~X Y n8 |jj
k
rÎ } z|d
|› d�ƒ|‚W 5 d }~X Y nX d S )Nr   )Ú
UsageErrorZPYTEST_THEMEZPYTEST_THEME_MODEZ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'.)Zpygments.utilr”   Z_pytest.config.exceptionsr–   r&   ÚgetenvZpygments.formatters.terminalr—   ÚutilÚClassNotFoundÚOptionError)rX   Úpygmentsr–   ÚthemeZ
theme_moder—   Úer   r   r   Ú_get_pygments_formatterÛ   s,    

ÿý
ÿýz&TerminalWriter._get_pygments_formatterr�   zLiteral[('diff', 'python')])rŠ   r�   r   c                 C  s†   |r| j r| js|S |  |¡}|dkr*|S |  ¡ }|dkr>|S ddlm} ||||ƒ}|d dkrz|d dkrz|dd… }d| }|S )z5Highlight the given source if we have markup support.Nr   )Ú	highlightr{   rz   ri   )rT   rW   r•   r¡   rž   r¢   )rX   rŠ   r�   Zpygments_lexerZpygments_formatterr¢   Zhighlightedr   r   r   r‡   ö   s    
zTerminalWriter._highlight)N)NN)rK   )r   )r�   )Ú__name__Ú
__module__Ú__qualname__Údictrb   rY   Úpropertyr\   Úsetterr^   ra   rw   r~   rt   rx   rŽ   r•   r¡   r‡   r   r   r   r   r+   2   sR   ì  ü% ÿr+   )Ú__doc__Ú
__future__r   r&   r   rL   Útypingr   r   r   r   r   Úcompatr	   Zwcwidthr   Zpygments.formatterr   Zpygments.lexerr   r   r*   r+   r   r   r   r   Ú<module>   s$   
