U
    nËjÏ`  ã                   @   sL  d Z ddlZddl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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 ddlmZ ddlmZ ddlmZ ddlmZ e d¡ZejdkrúdZ dZ!ndZ dZ!G dd„ dej"e ƒZ#d6ej$e% ej&e' ddœdd„Z(ej$e% e%ej&e' e'dœdd„Z)ej$e% e%ej&e' e'dœd d!„Z*ej+ej$e% ej&e' dd"œd#d$„Z,G d%d&„ d&ƒZ-d7e%e'e'e.d(œd)d*„Z/e%ej&e0 d+œd,d-„Z1e�rddl2Z2ej3ej4e. d.œd/d0„ƒZ5e'e%d1œd2d3„Z6n:ddl7Z7ddl8Z8ej3ej4e. d.œd4d0„ƒZ5e'e%d1œd5d3„Z6dS )8z¿
This module contains implementations for the termui module. To keep the
import time of Click down, some infrequently used functionality is
placed in this module and only imported as needed.
é    N)Úgettext)ÚStringIO)Úwhich)ÚTracebackTypeé   )Ú_default_text_stdout)ÚCYGWIN)Úget_best_encoding)Úisatty)Úopen_stream)Ú
strip_ansi)Úterm_len)ÚWIN)ÚClickException)ÚechoÚVÚntúÚ
z[?25lz[?25h
c                   @   sÄ  e Zd Zd6ejeje  eje eeeee	eje	 e	ejej
eje geje f  eje ejej eje	 eedd
œdd„Zddœdd„Zejeje  eje eje ddœdd„Zeje dœdd„Zedœdd„Zddœdd„Zeedœdd„ƒZeedœdd„ƒZeedœdd„ƒZedœd d!„Zedœd"d#„Zedœd$d%„Zedœd&d'„Zedœd(d)„Zddœd*d+„Z edd,œd-d.„Z!d7eeje dd/œd0d1„Z"ddœd2d3„Z#eje dœd4d5„Z$dS )8ÚProgressBarNú#ú ú%(bar)sú  TFr   é   )ÚiterableÚlengthÚ	fill_charÚ
empty_charÚbar_templateÚinfo_sepÚshow_etaÚshow_percentÚshow_posÚitem_show_funcÚlabelÚfileÚcolorÚupdate_min_stepsÚwidthÚreturnc                 C   s@  || _ || _|| _|| _|| _|| _|	| _|
| _|p6d| _|d krVt	ƒ }|d krVt
ƒ }|| _|| _|| _d| _|| _|dk| _|d kr¨ddlm} ||dƒ}|dkr¨d }|d krÖ|d krÀtdƒ‚t tjt t|ƒ¡}t|ƒ| _|| _d| _g | _|  |  t ¡  | _| _d| _ d| _!d | _"d| _#d | _$t%| jƒ | _&d | _'d S )NÚ r   )Úlength_hintéÿÿÿÿziterable or length is requiredF)(r   r   r   r    r!   r"   r#   r$   r%   r   r   r&   r'   r(   Ú_completed_intervalsr)   Ú	autowidthÚoperatorr,   Ú	TypeErrorÚtÚcastÚIterabler   ÚrangeÚiterr   ÚposÚavgÚtimeÚstartÚlast_etaÚ	eta_knownÚfinishedÚ	max_widthÚenteredÚcurrent_itemr
   Ú	is_hiddenÚ
_last_line)Úselfr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r,   © rD   ú6/tmp/pip-unpacked-wheel-jwr801_l/click/_termui_impl.pyÚ__init__(   sT    



zProgressBar.__init__zProgressBar[V]©r*   c                 C   s   d| _ |  ¡  | S )NT)r?   Úrender_progress©rC   rD   rD   rE   Ú	__enter__m   s    zProgressBar.__enter__)Úexc_typeÚ	exc_valueÚtbr*   c                 C   s   |   ¡  d S ©N)Úrender_finish)rC   rK   rL   rM   rD   rD   rE   Ú__exit__r   s    zProgressBar.__exit__c                 C   s   | j stdƒ‚|  ¡  |  ¡ S )Nú.You need to use progress bars in a with block.)r?   ÚRuntimeErrorrH   Ú	generatorrI   rD   rD   rE   Ú__iter__z   s    zProgressBar.__iter__c                 C   s   t t| ƒƒS rN   )Únextr6   rI   rD   rD   rE   Ú__next__€   s    zProgressBar.__next__c                 C   s$   | j r
d S | j t¡ | j ¡  d S rN   )rA   r&   ÚwriteÚ	AFTER_BARÚflushrI   rD   rD   rE   rO   ˆ   s    zProgressBar.render_finishc                 C   s(   | j r
dS t| jt| jpdƒp d dƒS )Nç      ð?r   )r=   Úminr7   Úfloatr   rI   rD   rD   rE   ÚpctŽ   s    zProgressBar.pctc                 C   s"   | j s
dS t| j ƒtt| j ƒƒ S ©Ng        )r8   Úsumr\   ÚlenrI   rD   rD   rE   Útime_per_iteration”   s    zProgressBar.time_per_iterationc                 C   s&   | j d k	r"| js"| j| j | j  S dS r^   )r   r=   ra   r7   rI   rD   rD   rE   Úetaš   s    zProgressBar.etac                 C   s†   | j r‚t| jƒ}|d }|d }|d }|d }|d }|d }|dkrh|› d|d›d|d›d|d›�S |d›d|d›d|d›�S dS )Né<   é   r   zd Ú02ú:r+   )r<   Úintrb   )rC   r2   ÚsecondsÚminutesÚhoursrD   rD   rE   Ú
format_eta    s    
 zProgressBar.format_etac                 C   s(   t | jƒ}| jd k	r$|d| j› �7 }|S )Nú/)Ústrr7   r   )rC   r7   rD   rD   rE   Ú
format_pos¯   s    

zProgressBar.format_posc                 C   s   t | jd ƒd›d�dd … S )Néd   z 4ú%r   )rg   r]   rI   rD   rD   rE   Ú
format_pctµ   s    zProgressBar.format_pctc                 C   s¤   | j d k	r:t| j| j ƒ}| j| }|| j| j|  7 }nf| jrN| j| j }nRt| j| jp\d ƒ}| jdkr–| j|tt	 
| j| j ¡d d | j ƒ< d |¡}|S )Nr   r   g       @g      à?r+   )r   rg   r]   r)   r   r   r=   Úlistra   ÚmathÚcosr7   Újoin)rC   Z
bar_lengthÚbarÚcharsrD   rD   rE   Ú
format_bar¸   s$    


ûÿÿÿ
zProgressBar.format_barc                 C   s¶   | j }g }| jd k	r$|d kr$| j }| jr8| |  ¡ ¡ |rJ| |  ¡ ¡ | jrj| jrj| jsj| |  	¡ ¡ | j
d k	r’|  
| j¡}|d k	r’| |¡ | j| j|  ¡ | j |¡dœ  ¡ S )N)r%   rv   Úinfo)r"   r   r#   Úappendrn   rq   r!   r<   r=   rk   r$   r@   r   r%   rx   r    ru   Úrstrip)rC   r"   Z	info_bitsZ	item_inforD   rD   rE   Úformat_progress_lineË   s*    


ýÿÿz ProgressBar.format_progress_linec           	      C   sB  dd l }| jr:| j| jkr6| j| _t| j| j| jd� d S g }| jrž| j}d| _t	|  
¡ ƒ}td| ¡ j| ƒ}||k r˜| t¡ | d| j ¡ || _|| _| j}| jd k	r´| j}| t¡ |  
¡ }t	|ƒ}| jd ksâ| j|k rè|| _| |¡ | d||  ¡ d |¡}|| jk�r>|| _t|| j| jdd� | j ¡  d S )Nr   )r&   r'   r   r+   F)r&   r'   Únl)ÚshutilrA   rB   r%   r   r&   r'   r/   r)   r   r|   ÚmaxÚget_terminal_sizeÚcolumnsrz   Ú
BEFORE_BARr>   ru   rY   )	rC   r~   ÚbufZ	old_widthZclutter_lengthZ	new_widthZclear_widthÚlineÚline_lenrD   rD   rE   rH   æ   s@    




zProgressBar.render_progress)Ún_stepsr*   c                 C   sš   |  j |7  _ | jd k	r*| j | jkr*d| _t ¡ | j dk r@d S t ¡ | _| j rft ¡ | j | j  }nt ¡ | j }| jdd … |g | _| jd k	| _d S )NTrZ   iúÿÿÿ)r7   r   r=   r9   r;   r:   r8   r<   )rC   r†   ÚsteprD   rD   rE   Ú	make_step  s    
zProgressBar.make_step)r†   r@   r*   c                 C   sF   |dk	r|| _ |  j|7  _| j| jkrB|  | j¡ |  ¡  d| _dS )a  Update the progress bar by advancing a specified number of
        steps, and optionally set the ``current_item`` for this new
        position.

        :param n_steps: Number of steps to advance.
        :param current_item: Optional item to set as ``current_item``
            for the updated position.

        .. versionchanged:: 8.0
            Added the ``current_item`` optional parameter.

        .. versionchanged:: 8.0
            Only render when the number of steps meets the
            ``update_min_steps`` threshold.
        Nr   )r@   r.   r(   rˆ   rH   )rC   r†   r@   rD   rD   rE   Úupdate)  s    zProgressBar.updatec                 C   s   d| _ d | _d| _d S )NFT)r<   r@   r=   rI   rD   rD   rE   ÚfinishC  s    zProgressBar.finishc                 c   sj   | j stdƒ‚| jr"| jE dH  nD| jD ],}|| _| jdkrD|  ¡  |V  |  d¡ q(|  ¡  |  ¡  dS )z¨Return a generator which yields the items added to the bar
        during construction, and updates the progress bar *after* the
        yielded block returns.
        rQ   Nr   r   )	r?   rR   rA   r6   r@   r.   rH   r‰   rŠ   )rC   ÚrvrD   rD   rE   rS   H  s    

zProgressBar.generator)Nr   r   r   r   TNFNNNNr   r   )N)%Ú__name__Ú
__module__Ú__qualname__r2   ÚOptionalr4   r   rg   rm   ÚboolÚCallableÚTextIOrF   rJ   ÚTypeÚBaseExceptionr   rP   ÚIteratorrT   rV   rO   Úpropertyr\   r]   ra   rb   rk   rn   rq   rx   r|   rH   rˆ   r‰   rŠ   rS   rD   rD   rD   rE   r   '   sr                 ð 
ïEû-r   )rS   r'   r*   c              	   C   s  t ƒ }|dkrtƒ }ttjƒr&t|ƒs2t|| |ƒS tj dd¡pBd 	¡ }|rrt
rbt| ||ƒrrdS nt| ||ƒrrdS tj d¡dkrŽt|| |ƒS t
sžtj d¡r®t| d|ƒr®dS t| d|ƒr¾dS d	dl}| ¡ \}}t |¡ z$t| d|ƒròW ¢dS t|| |ƒW ¢S t |¡ X dS )
z2Decide what method to use for paging through text.NZPAGERr+   ÚTERM)ZdumbZemacsZos2ZmoreÚlessr   )r   r   r
   ÚsysÚstdinÚ
_nullpagerÚosÚenvironÚgetÚstripr   Ú_tempfilepagerÚ
_pipepagerÚplatformÚ
startswithÚtempfileÚmkstempÚcloseÚunlink)rS   r'   ÚstdoutZ	pager_cmdr¤   ÚfdÚfilenamerD   rD   rE   Úpagerj  s<      ÿ
r«   )rS   Úcmdr'   r*   c           
   	   C   s:  t |ƒ}|dkrdS ddl}ttjƒ}| dd¡d  ¡ }|dkr˜|d dkr˜tj dd	¡› d
 |dd… ¡› �}|s„d|d< d}nd|ks”d|kr˜d}|j	|gd|j
|ddd�}|jdk	sÀt‚z&| D ]}	|sÖt|	ƒ}	|j |	¡ qÆW n ttfk
rþ   Y nX |j ¡  z| ¡  W n tk
�r,   Y nX �q6�q
dS )zÝPage through text by feeding it to another program.  Invoking a
    pager through this might support colors.

    Returns True if the command was found, False otherwise and thus another
    pager should be attempted.
    NFr   rl   r   r-   r˜   ÚLESSr+   r   ú-RTÚrÚRÚreplace)Úshellrš   ÚenvÚerrorsÚtext)r   Ú
subprocessÚdictrœ   r�   ÚrsplitÚsplitrž   ru   ÚPopenÚPIPErš   ÚAssertionErrorr   rW   ÚOSErrorÚKeyboardInterruptr¦   Úwait)
rS   r¬   r'   Úcmd_absoluter¶   r³   Z
cmd_detailZ
less_flagsÚcrµ   rD   rD   rE   r¡   ‘  sH    
$ú
r¡   c              	   C   sÂ   t |ƒ}|dkrdS ddl}ddl}| ¡ \}}d | ¡}|sFt|ƒ}ttjƒ}	t	|dƒd �}
|
 
| |	¡¡ W 5 Q R X z,z| ||g¡ W n tk
r¢   Y nX W 5 t |¡ t |¡ X dS )z­Page through text by invoking a program on a temporary file.

    Returns True if the command was found, False otherwise and thus another
    pager should be attempted.
    NFr   r+   ÚwbT)r   r¶   r¤   r¥   ru   r   r	   r™   r¨   r   rW   Úencoderœ   r¦   r§   Úcallr½   )rS   r¬   r'   rÀ   r¶   r¤   r©   rª   rµ   ÚencodingÚfrD   rD   rE   r    Ò  s&    



r    )ÚstreamrS   r'   r*   c                 C   s$   |D ]}|st |ƒ}|  |¡ qdS )z>Simply print unformatted text.  This is the ultimate fallback.N)r   rW   )rÇ   rS   r'   rµ   rD   rD   rE   r›   ø  s    r›   c                   @   sx   e Zd Zdeje ejejeef  eeddœdd„Zedœdd	„Z	edd
œdd„Z
ejej ejej dœdd„ZdS )ÚEditorNTú.txt)Úeditorr³   Úrequire_saveÚ	extensionr*   c                 C   s   || _ || _|| _|| _d S rN   )rÊ   r³   rË   rÌ   )rC   rÊ   r³   rË   rÌ   rD   rD   rE   rF     s    zEditor.__init__rG   c                 C   s\   | j d k	r| j S dD ]}tj |¡}|r|  S qtr:dS dD ]}t|ƒd k	r>|  S q>dS )N)ZVISUALZEDITORZnotepad)zsensible-editorZvimZnanoÚvi)rÊ   rœ   r�   rž   r   r   )rC   Úkeyr‹   rÊ   rD   rD   rE   Ú
get_editor  s    


zEditor.get_editor)rª   r*   c              
   C   s´   dd l }|  ¡ }d }| jr0tj ¡ }| | j¡ zD|j|› d|› d�|dd�}| ¡ }|dkrrt	t
dƒj|d�ƒ‚W n: tk
r® } zt	t
dƒj||d	�ƒ|‚W 5 d }~X Y nX d S )
Nr   z "ú"T)r³   r²   z{editor}: Editing failed)rÊ   z{editor}: Editing failed: {e})rÊ   Úe)r¶   rÏ   r³   rœ   r�   Úcopyr‰   rº   r¿   r   Ú_Úformatr½   )rC   rª   r¶   rÊ   r�   rÁ   Z	exit_coderÑ   rD   rD   rE   Ú	edit_file  s&    
ÿÿþzEditor.edit_file)rµ   r*   c           	   	   C   sJ  dd l }|sd}nLt|ttfƒr&|}n8|r<| d¡s<|d7 }trT| dd¡ d¡}n
| d¡}|jd| j	d�\}}zÆt
 |d	¡�}| |¡ W 5 Q R X t
 |t
j |¡t
j |¡d
 f¡ t
j |¡}|  |¡ | jrît
j |¡|krîW ¢Pd S t|dƒ�}| ¡ }W 5 Q R X t|ttfƒ�r$|W ¢S | d¡ dd¡W ¢S t
 |¡ X d S )Nr   ó    r   z
z	utf-8-sigzutf-8zeditor-)ÚprefixÚsuffixrÂ   é   Úrb)r¤   Ú
isinstanceÚbytesÚ	bytearrayÚendswithr   r±   rÃ   r¥   rÌ   rœ   r§   ÚfdopenrW   ÚutimeÚpathÚgetatimeÚgetmtimerÕ   rË   ÚopenÚreadÚdecode)	rC   rµ   r¤   Údatar©   ÚnamerÆ   Ú	timestampr‹   rD   rD   rE   Úedit3  s2    
$
zEditor.edit)NNTrÉ   )rŒ   r�   rŽ   r2   r�   rm   ÚMappingr�   rF   rÏ   rÕ   ÚAnyStrrê   rD   rD   rD   rE   rÈ     s       ûúrÈ   F)Úurlr¿   Úlocater*   c           	      C   sò  dd l }ttdœdd„}tjdkr€dg}|r6| d¡ |rD| d¡ | || ƒ¡ td	d
ƒ}z|j||d� ¡ W ¢S | ¡  X nÚt	rî|r || ƒ} dd| › �g}n(dg}|r´| d¡ | d¡ | | ¡ z| 
|¡W S  tk
rê   Y dS X nlt�rZ|�r|| ƒ} dtj | ¡g}n dg}|�r*| d¡ | | ¡ z| 
|¡W S  tk
�rX   Y dS X zJ|�rztj || ƒ¡�pvd} n|| ƒ} | d| g¡}|�r | ¡ W S W dS  tk
�rì   |  d¡�ræ|�sæ|�sædd l}| | ¡ Y dS Y dS X d S )Nr   )rí   r*   c                 S   s*   ddl m} |  d¡r&|| dd … ƒ} | S )Nr   )Úunquotezfile://é   )Úurllib.parserï   r£   )rí   rï   rD   rD   rE   Ú_unquote_filef  s    
zopen_url.<locals>._unquote_fileÚdarwinrä   z-Wr®   z	/dev/nullÚw)ÚstderrZexplorerz/select,r:   z/WAITr+   é   Zcygstartz-wÚ.zxdg-open)zhttp://zhttps://r   )r¶   rm   r™   r¢   rz   rä   r¦   rº   r¿   r   rÄ   r½   r   rœ   rá   Údirnamer£   Ú
webbrowser)	rí   r¿   rî   r¶   rò   ÚargsÚnullrÁ   rù   rD   rD   rE   Úopen_urlc  sh    











rü   )Úchr*   c                 C   s6   | dkrt ƒ ‚| dkr ts tƒ ‚| dkr2tr2tƒ ‚d S )Núúú)r¾   r   ÚEOFError)rý   rD   rD   rE   Ú_translate_ch_to_excª  s    r  rG   c                   c   s
   dV  d S )Nr-   rD   rD   rD   rD   rE   Úraw_terminalº  s    r  )r   r*   c                 C   s6   | rt j}nt j}|ƒ }|dkr*||ƒ 7 }t|ƒ |S )N)ú õ   Ã )ÚmsvcrtZgetwcheÚgetwchr  )r   Úfuncr‹   rD   rD   rE   Úgetchar¾  s     
r	  c                  c   s–   t tjƒstdƒ} |  ¡ }ntj ¡ }d } zPt |¡}zt |¡ |V  W 5 t |tj|¡ tj	 
¡  | d k	rv|  ¡  X W n tjk
r�   Y nX d S )Nz/dev/tty)r
   r™   rš   rä   ÚfilenoÚtermiosÚ	tcgetattrÚ	tcsetattrÚ	TCSADRAINr¨   rY   r¦   ÚttyZsetrawÚerror)rÆ   r©   Zold_settingsrD   rD   rE   r  ñ  s     






c              
   C   s^   t ƒ �N}t |d¡ ttjƒd¡}| r<ttjƒr<tj 	|¡ t
|ƒ |W  5 Q R £ S Q R X d S )Né    r±   )r  rœ   rå   ræ   r	   r™   rš   r
   r¨   rW   r  )r   r©   rý   rD   rD   rE   r	    s    )N)FF)9Ú__doc__Ú
contextlibrs   rœ   r™   r9   Útypingr2   r   rÓ   Úior   r~   r   Útypesr   Ú_compatr   r   r	   r
   r   r   r   r   Ú
exceptionsr   Úutilsr   ÚTypeVarr   rè   r‚   rX   ÚGenericr   r4   rm   r�   r�   r«   r¡   r    r’   r›   rÈ   rg   rü   r”   r  r  Úcontextmanagerr•   r  r	  r  r  rD   rD   rD   rE   Ú<module>   sl   

  E ' Bü'  þ
aG0