3
¦Yði›[  ã               @   s(  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 ejdƒZejdkrÖdZdZndZdZG dd„ deje ƒZd3eje ej e! ddœdd„Z"eje eej e! ddœdd„Z#eje eej e! ddœdd„Z$ej%eje ej e! ddœd d!„Z&G d"d#„ d#ƒZ'd4ee!e!e(d%œd&d'„Z)eej e* d(œd)d*„Z+e�rêddl,Z,ej-ej.e( d+œd,d-„ƒZ/e!ed.œd/d0„Z0n:ddl1Z1ddl2Z2ej-ej.e( d+œd1d-„ƒZ/e!ed.œd2d0„Z0dS )5z¿
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é   )Ú_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d4e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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d5eeje dd-œd.d/„Zddœd0d1„Z eje dœd2d3„Z!dS )6Ú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rHt	ƒ }|| _
|| _|| _d| _|| _|dk| _|d kršddlm} ||dƒ}|dkršd }|d krÈ|d kr²tdƒ‚tjtjt t|ƒƒ}t|ƒ| _|| _d| _g | _tjƒ  | _| _d| _d| _ d | _!d| _"d | _#t$| j
ƒ | _%d | _&d S )	NÚ r   )Úlength_hintr   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)   © rA   ú3/tmp/pip-build-8om4l6ph/click/click/_termui_impl.pyÚ__init__$   sL    



zProgressBar.__init__)r'   c             C   s   d| _ | jƒ  | S )NT)r<   Úrender_progress)r@   rA   rA   rB   Ú	__enter__`   s    zProgressBar.__enter__c             C   s   | j ƒ  d S )N)Úrender_finish)r@   Úexc_typeÚ	exc_valueÚtbrA   rA   rB   Ú__exit__e   s    zProgressBar.__exit__c             C   s   | j stdƒ‚| jƒ  | jƒ S )Nz.You need to use progress bars in a with block.)r<   ÚRuntimeErrorrD   Ú	generator)r@   rA   rA   rB   Ú__iter__h   s    zProgressBar.__iter__c             C   s   t t| ƒƒS )N)Únextr3   )r@   rA   rA   rB   Ú__next__n   s    zProgressBar.__next__c             C   s$   | j r
d S | jjtƒ | jjƒ  d S )N)r>   r#   ÚwriteÚ	AFTER_BARÚflush)r@   rA   rA   rB   rF   v   s    zProgressBar.render_finishc             C   s(   | j r
dS t| jt| jpdƒp d dƒS )Ng      ð?r   )r:   Úminr4   Úfloatr   )r@   rA   rA   rB   Úpct|   s    zProgressBar.pctc             C   s"   | j s
dS t| j ƒtt| j ƒƒ S )Ng        )r5   ÚsumrT   Úlen)r@   rA   rA   rB   Útime_per_iteration‚   s    zProgressBar.time_per_iterationc             C   s(   | j d k	r$| j r$| j| j | j  S dS )Ng        )r   r:   rX   r4   )r@   rA   rA   rB   Ú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(   )r9   ÚintrY   )r@   r/   ÚsecondsÚminutesÚhoursrA   rA   rB   Ú
format_etaŽ   s    
 zProgressBar.format_etac             C   s(   t | jƒ}| jd k	r$|d| j› �7 }|S )Nú/)Ústrr4   r   )r@   r4   rA   rA   rB   Ú
format_pos�   s    

zProgressBar.format_posc             C   s   t | jd ƒd›d�dd … S )Néd   z 4ú%r   )r^   rU   )r@   rA   rA   rB   Ú
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| j ƒd d | j ƒ< dj|ƒ}|S )Nr   r   g       @g      à?r(   )r   r^   rU   r&   r   r   r:   ÚlistrX   ÚmathÚcosr4   Újoin)r@   Z
bar_lengthÚbarÚcharsrA   rA   rB   Ú
format_bar¦   s    


*
zProgressBar.format_barc             C   s¸   | j }g }| jd k	r$|d kr$| j }| jr8|j| jƒ ƒ |rJ|j| jƒ ƒ | jrl| jrl| j rl|j| j	ƒ ƒ | j
d k	r”| j
| jƒ}|d k	r”|j|ƒ | j| j| jƒ | jj|ƒdœ jƒ S )N)r"   rm   Úinfo)r   r   r    Úappendre   rh   r   r9   r:   rb   r!   r=   r   r"   ro   r   rl   Úrstrip)r@   r   Z	info_bitsZ	item_inforA   rA   rB   Ú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	| j
ƒ ƒ}td|jƒ j| ƒ}||k r˜|jtƒ |jd| j ƒ || _|| _| j}| jd k	r´| j}|jtƒ | j
ƒ }t	|ƒ}| jd ksâ| j|k rè|| _|j|ƒ |jd||  ƒ dj|ƒ}|| jk�r>|| _t|| j| jdd� | jjƒ  d S )Nr   )r#   r$   r   r(   F)r#   r$   Únl)Úshutilr>   r?   r"   r   r#   r$   r,   r&   r
   rs   ÚmaxÚget_terminal_sizeÚcolumnsrq   Ú
BEFORE_BARr;   rl   rR   )	r@   ru   ÚbufZ	old_widthZclutter_lengthZ	new_widthZclear_widthÚlineÚline_lenrA   rA   rB   rD   Ô   s@    




zProgressBar.render_progress)Ún_stepsr'   c             C   sš   |  j |7  _ | jd k	r*| j | jkr*d| _tjƒ | j dk r@d S tjƒ | _| j rftjƒ | j | j  }ntjƒ | j }| jdd … |g | _| jd k	| _d S )NTg      ð?é   iúÿÿÿ)r4   r   r:   r6   r8   r7   r5   r9   )r@   r}   ÚsteprA   rA   rB   Ú	make_step  s    
zProgressBar.make_step)r}   r=   r'   c             C   sF   |dk	r|| _ |  j|7  _| j| jkrB| j| jƒ | 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€   rD   )r@   r}   r=   rA   rA   rB   Úupdate  s    zProgressBar.updatec             C   s   d| _ d | _d| _d S )NFT)r9   r=   r:   )r@   rA   rA   rB   Úfinish1  s    zProgressBar.finishc             c   sn   | j stdƒ‚| jr"| jE dH  nHx6| jD ],}|| _| jdkrF| jƒ  |V  | jdƒ q*W | jƒ  | jƒ  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.
        z.You need to use progress bars in a with block.Nr   r   )	r<   rK   r>   r3   r=   r+   rD   r�   r‚   )r@   ÚrvrA   rA   rB   rL   6  s    
zProgressBar.generator)Nr   r   r   r   TNFNNNNr   r   )N)"Ú__name__Ú
__module__Ú__qualname__r/   ÚOptionalr1   r   r^   rd   ÚboolÚCallableÚTextIOrC   rE   rJ   ÚIteratorrM   rO   rF   ÚpropertyrT   rU   rX   rY   rb   re   rh   ro   rs   rD   r€   r�   r‚   rL   rA   rA   rA   rB   r   #   sH                j+-r   )rL   r$   r'   c             C   s$  t ƒ }ttjƒ st|ƒ r(t|| |ƒS tjjddƒp8djƒ }|r^t	rRt
| ||ƒS t| ||ƒS tjjdƒdkrzt|| |ƒS t	sŠtjjdƒr–t
| d|ƒS ttd	ƒrºtjd
ƒdkrºt| d|ƒS ddl}|jƒ \}}tj|ƒ z:ttd	ƒoøtjd|› d�ƒdk�rt| d|ƒS t|| |ƒS tj|ƒ X dS )z2Decide what method to use for paging through text.ZPAGERNr(   ÚTERMÚdumbÚemacsZos2zmore <Úsystemz(less) 2>/dev/nullr   Úlesszmore "ú"Zmore)rŽ   r�   )r   r   ÚsysÚstdinÚ
_nullpagerÚosÚenvironÚgetÚstripr   Ú_tempfilepagerÚ
_pipepagerÚplatformÚ
startswithÚhasattrr�   ÚtempfileÚmkstempÚcloseÚunlink)rL   r$   ÚstdoutZ	pager_cmdrŸ   ÚfdÚfilenamerA   rA   rB   ÚpagerX  s,    
"r¦   )rL   Úcmdr$   r'   c             C   s4  ddl }ttjƒ}|jddƒd jƒ }|dkr„|d dkr„tjjddƒ› dj|dd… ƒ› �}|spd	|d< d
}nd|ks€d|kr„d
}|j|d
|j	|d�}t
jt
j|jƒ}t|ƒ}	y0x*| D ]"}
|sÈt|
ƒ}
|j|
j|	dƒƒ q¸W W n ttfk
rø   Y n
X |jƒ  x,y|jƒ  W n tk
�r&   Y nX P �qW dS )zqPage through text by feeding it to another program.  Invoking a
    pager through this might support colors.
    r   Nrc   r   r‘   ÚLESSr(   r   z-RTÚrÚR)Úshellr”   ÚenvÚreplacer*   )Ú
subprocessÚdictr–   r—   ÚrsplitÚsplitr˜   rl   ÚPopenÚPIPEr/   r0   ZBinaryIOr”   r   r	   rP   ÚencodeÚOSErrorÚKeyboardInterruptr¡   Úwait)rL   r§   r$   r®   r¬   Z
cmd_detailZ
less_flagsÚcr”   ÚencodingÚtextrA   rA   rB   r›   u  s6    
$

r›   c       	      C   s”   ddl }|jƒ \}}dj| ƒ}|s*t|ƒ}ttjƒ}t|dƒd �}|j|j	|ƒƒ W dQ R X zt
j|› d|› d�ƒ W dt
j|ƒ t
j|ƒ X dS )z<Page through text by invoking a program on a temporary file.r   Nr(   Úwbz "r’   )rŸ   r    rl   r	   r   r“   r£   r   rP   r´   r–   r�   r¡   r¢   )	rL   r§   r$   rŸ   r¤   r¥   rº   r¹   ÚfrA   rA   rB   rš   §  s    


rš   )ÚstreamrL   r$   r'   c             C   s(   x"|D ]}|st |ƒ}| j|ƒ qW dS )z>Simply print unformatted text.  This is the ultimate fallback.N)r	   rP   )r½   rL   r$   rº   rA   rA   rB   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 )N)rÀ   r¬   rÁ   rÂ   )r@   rÀ   r¬   rÁ   rÂ   rA   rA   rB   rC   Ç  s    zEditor.__init__)r'   c             C   sf   | j d k	r| j S x dD ]}tjj|ƒ}|r|S qW tr:dS x&dD ]}tjd|› d�ƒd	kr@|S q@W d
S )NÚVISUALÚEDITORZnotepadúsensible-editorÚvimÚnanozwhich z >/dev/null 2>&1r   Úvi)rÃ   rÄ   )rÅ   rÆ   rÇ   )rÀ   r–   r—   r˜   r   r�   )r@   Úkeyrƒ   rÀ   rA   rA   rB   Ú
get_editorÓ  s    


zEditor.get_editor)r¥   r'   c             C   s´   dd l }| jƒ }d }| jr0tjjƒ }|j| jƒ yD|j|› d|› d�|dd�}|jƒ }|dkrrt	t
dƒj|d�ƒ‚W n: tk
r® } zt	t
dƒj||d	�ƒ|‚W Y d d }~X nX d S )
Nr   z "r’   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µ   )r@   r¥   r®   rÀ   r—   r¸   Z	exit_coderË   rA   rA   rB   Ú	edit_fileá  s     
zEditor.edit_file)rº   r'   c       	      C   s@  dd l }|sd}nNt|ttfƒr&|}n:|r>|jdƒ r>|d7 }trV|jddƒjdƒ}n
|jdƒ}|jd| j	d�\}}zºt
j|d	ƒ�}|j|ƒ W d Q R X t
j|t
jj|ƒt
jj|ƒd
 fƒ t
jj|ƒ}| j|ƒ | jrìt
jj|ƒ|krìd S t|dƒ�}|jƒ }W d Q R X t|ttfƒ�r|S |jdƒjddƒS t
j|ƒ 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–   ÚfdopenrP   ÚutimeÚpathÚgetatimeÚgetmtimerÏ   rÁ   ÚopenÚreadÚdecoder¢   )	r@   rº   rŸ   Údatar¤   Únamer¼   Ú	timestamprƒ   rA   rA   rB   Úedit÷  s2    
$
zEditor.edit)NNTr¿   )r„   r…   r†   r/   r‡   rd   ÚMappingrˆ   rC   rÊ   rÏ   ZAnyStrrä   rA   rA   rA   rB   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|jdƒ |rD|jdƒ |j|| ƒƒ td	d
ƒ}z|j||d�jƒ S |jƒ  X nÂt	rÖ|r¢|| j
ddƒƒ} d| › d�}n*| j
ddƒ} |r¶dnd}d|› d| › d�}tj|ƒS t�r>|�rtjj|| ƒj
ddƒƒ} d| › d�}n,| j
ddƒ} |�rdnd}d|› d| › d�}tj|ƒS yF|�r^tjj|| ƒƒ�pZd} n|| ƒ} |jd| gƒ}|�r‚|jƒ S dS  tk
�rÌ   | jdƒ�rÈ| �rÈ| �rÈdd l}	|	j| ƒ dS dS X d S )Nr   )ræ   r'   c             S   s*   ddl m} | jdƒr&|| dd … ƒ} | S )Nr   )Úunquotezfile://é   )Úurllib.parserè   r�   )ræ   rè   rA   rA   rB   Ú_unquote_file*  s    
zopen_url.<locals>._unquote_fileÚdarwinrÞ   z-Wz-Rz	/dev/nullÚw)Ústderrr’   r(   zexplorer /select,"z/WAITzstart z "" "z
cygstart "z-wz	cygstart z "Ú.zxdg-openúhttp://úhttps://r   )rð   rñ   )r®   rd   r“   rœ   rq   rÞ   r²   r·   r¡   r   r­   r–   r�   r   rÛ   Údirnamerµ   r�   Ú
webbrowser)
ræ   r·   rç   r®   rë   ÚargsÚnullZwait_strr¸   ró   rA   rA   rB   Úopen_url'  sV    






rö   )Úchr'   c             C   s8   | dkrt ƒ ‚| dkr"t r"tƒ ‚| dkr4tr4tƒ ‚d S )Núúú)r¶   r   ÚEOFError)r÷   rA   rA   rB   Ú_translate_ch_to_excc  s    rü   )r'   c               c   s
   dV  d S )Nr   r*   rA   rA   rA   rA   rB   Úraw_terminals  s    rý   )r   r'   c             C   s6   | rt j}nt j}|ƒ }|dkr*||ƒ 7 }t|ƒ |S )Nú õ   Ã )rþ   rÿ   )ÚmsvcrtZgetwcheÚgetwchrü   )r   Úfuncrƒ   rA   rA   rB   Úgetcharw  s     
r  c              c   s–   t tjƒstdƒ} | jƒ }ntjjƒ }d } yPtj|ƒ}ztj|ƒ |V  W d tj	|tj
|ƒ tjjƒ  | d k	rv| jƒ  X W n tjk
r�   Y nX d S )Nz/dev/tty)r   r“   r”   rÞ   ÚfilenoÚtermiosÚ	tcgetattrÚttyZsetrawÚ	tcsetattrÚ	TCSADRAINr£   rR   r¡   Úerror)r¼   r¤   Zold_settingsrA   rA   rB   rý   ª  s     






c          
   C   sR   t ƒ �B}tj|dƒjttjƒdƒ}| r<ttjƒr<tjj	|ƒ t
|ƒ |S Q R X d S )Né    r­   )rý   r–   rß   rà   r   r“   r”   r   r£   rP   rü   )r   r¤   r÷   rA   rA   rB   r  Å  s    )N)FF)3Ú__doc__Ú
contextlibrj   r–   r“   r6   Útypingr/   r   rÍ   Ú_compatr   r   r   r   r   r	   r
   r   Ú
exceptionsr   Úutilsr   ZTypeVarr   râ   ry   rQ   ZGenericr   r1   rd   r‡   rˆ   r¦   r›   rš   rŠ   r•   r¾   r^   rö   ÚBaseExceptionrü   r   Úcontextmanagerr‹   rý   r  r  r  rA   rA   rA   rB   Ú<module>   sZ   

  7  3a<0