3
[ð]›L  ã               @   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mZmZm	Z	m
Z
mZmZmZmZmZmZmZ ddlmZ ddlmZ ejdkrŒdZd	Znd
ZdZdd„ ZG dd„ deƒZd%dd„Zdd„ Zdd„ Zdd„ ZG dd„ deƒZ d&dd„Z!dd„ Z"e�rddl#Z#ej$dd „ ƒZ%d!d"„ Z&n&ddl'Z'ddl(Z(ej$d#d „ ƒZ%d$d"„ Z&dS )'uA  
click._termui_impl
~~~~~~~~~~~~~~~~~~

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.

:copyright: Â© 2014 by the Pallets team.
:license: BSD, see LICENSE.rst for more details.
é    Né   )Ú_default_text_stdoutÚ
range_typeÚPY2ÚisattyÚopen_streamÚ
strip_ansiÚterm_lenÚget_best_encodingÚWINÚ	int_typesÚCYGWIN)Úecho)ÚClickExceptionÚntúÚ
z[?25lz[?25h
c             C   sŒ   yt | ƒS  ttfk
r†   yt| ƒj}W n tk
r>   dS X y|| ƒ}W n tk
r`   dS X |tks~t|tƒ s~|dk r‚dS |S X dS )z%Returns the length hint of an object.Nr   )ÚlenÚAttributeErrorÚ	TypeErrorÚtypeÚ__length_hint__ÚNotImplementedÚ
isinstancer   )ÚobjZget_hintZhint© r   ú3/tmp/pip-build-w1as9q70/click/click/_termui_impl.pyÚ_length_hint"   s     r   c               @   s²   e Zd Zd/d	d
„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze	dd„ ƒZ
e	dd„ ƒZe	dd„ ƒZdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZdS )0ÚProgressBarNú#ú ú%(bar)sú  TFé   c             C   s  || _ || _|| _|| _|| _|| _|	| _|
| _|p6d| _|d krHt	ƒ }|| _
|| _|| _|dk| _|d krtt|ƒ}|d kr”|d krŒtdƒ‚t|ƒ}t|ƒ| _|| _|d k	| _d| _g | _tjƒ  | _| _d| _d| _d | _d| _d | _t| j
ƒ | _d | _ d| _!d S )NÚ r   ziterable or length is requiredFg      à?)"Ú	fill_charÚ
empty_charÚbar_templateÚinfo_sepÚshow_etaÚshow_percentÚshow_posÚitem_show_funcÚlabelr   ÚfileÚcolorÚwidthÚ	autowidthr   r   r   ÚiterÚlengthÚlength_knownÚposÚavgÚtimeÚstartÚlast_etaÚ	eta_knownÚfinishedÚ	max_widthÚenteredÚcurrent_itemr   Ú	is_hiddenÚ
_last_lineÚshort_limit)ÚselfÚiterabler3   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r   r   r   Ú__init__8   sF    



zProgressBar.__init__c             C   s   d| _ | jƒ  | S )NT)r=   Úrender_progress)rB   r   r   r   Ú	__enter__a   s    zProgressBar.__enter__c             C   s   | j ƒ  d S )N)Úrender_finish)rB   Úexc_typeÚ	exc_valueÚtbr   r   r   Ú__exit__f   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=   ÚRuntimeErrorrE   Ú	generator)rB   r   r   r   Ú__iter__i   s    zProgressBar.__iter__c             C   s   t j ƒ | j | jkS )N)r7   r8   rA   )rB   r   r   r   Úis_fasto   s    zProgressBar.is_fastc             C   s,   | j s| jƒ rd S | jjtƒ | jjƒ  d S )N)r?   rO   r.   ÚwriteÚ	AFTER_BARÚflush)rB   r   r   r   rG   r   s    zProgressBar.render_finishc             C   s$   | j r
dS t| jt| jƒpd dƒS )Ng      ð?r   )r;   Úminr5   Úfloatr3   )rB   r   r   r   Úpctx   s    zProgressBar.pctc             C   s"   | j s
dS t| j ƒtt| j ƒƒ S )Ng        )r6   ÚsumrT   r   )rB   r   r   r   Útime_per_iteration~   s    zProgressBar.time_per_iterationc             C   s$   | j r | j r | j| j| j  S dS )Ng        )r4   r;   rW   r3   r5   )rB   r   r   r   Úeta„   s    zProgressBar.etac             C   sn   | j rjt| jƒ}|d }|d }|d }|d }|d }|d }|dkr\|}d||||f S d|||f S dS )Né<   é   r   z%dd %02d:%02d:%02dz%02d:%02d:%02dr$   )r:   ÚintrX   )rB   ÚtÚsecondsÚminutesÚhoursÚdaysr   r   r   Ú
format_etaŠ   s    
zProgressBar.format_etac             C   s"   t | jƒ}| jr|d| j 7 }|S )Nz/%s)Ústrr5   r4   r3   )rB   r5   r   r   r   Ú
format_posš   s    
zProgressBar.format_posc             C   s   dt | jd ƒ dd … S )Nz% 4d%%éd   r   )r[   rU   )rB   r   r   r   Ú
format_pct    s    zProgressBar.format_pctc             C   s    | j r6t| j| j ƒ}| j| }|| j| j|  7 }nf| jrJ| j| j }nRt| j| jpXd ƒ}| jdkr’| j|tt	j
| j| j ƒd d | j ƒ< dj|ƒ}|S )Nr   r   g       @g      à?r$   )r4   r[   rU   r0   r%   r&   r;   ÚlistrW   ÚmathÚcosr5   Újoin)rB   Z
bar_lengthÚbarr   r   r   Ú
format_bar£   s    

*
zProgressBar.format_barc             C   s´   | j }g }| jr |d kr | j }| jr4|j| jƒ ƒ |rF|j| jƒ ƒ | jrh| jrh| j rh|j| j	ƒ ƒ | j
d k	r�| j
| jƒ}|d k	r�|j|ƒ | j| j| jƒ | jj|ƒdœ jƒ S )N)r-   rj   Úinfo)r*   r4   r+   Úappendrc   re   r)   r:   r;   ra   r,   r>   r'   r-   rk   r(   ri   Úrstrip)rB   r*   Z	info_bitsZ	item_infor   r   r   Úformat_progress_line²   s$    

z ProgressBar.format_progress_linec       	      C   s(  ddl m} | jrd S g }| jrz| j}d| _t| jƒ ƒ}td|ƒ d | ƒ}||k rt|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oü| jƒ  �r$|| _t|| j| jdd� | jjƒ  d S )Nr   )Úget_terminal_sizer   r    r$   F)r.   r/   Únl)Ztermuirp   r?   r1   r0   r	   ro   Úmaxrm   Ú
BEFORE_BARr<   ri   r@   rO   r   r.   r/   rR   )	rB   rp   ÚbufZ	old_widthZclutter_lengthZ	new_widthZclear_widthÚlineÚline_lenr   r   r   rE   Ê   s:    




zProgressBar.render_progressc             C   s’   |  j |7  _ | jr&| j | jkr&d| _tjƒ | j dk r<d S tjƒ | _| j rbtjƒ | j | j  }ntjƒ | j }| jdd … |g | _| j| _d S )NTg      ð?é   iúÿÿÿ)	r5   r4   r3   r;   r7   r9   r8   r6   r:   )rB   Ún_stepsÚstepr   r   r   Ú	make_stepñ   s    
zProgressBar.make_stepc             C   s   | j |ƒ | jƒ  d S )N)rz   rE   )rB   rx   r   r   r   Úupdate  s    
zProgressBar.updatec             C   s   d| _ d | _d| _d S )Nr   T)r:   r>   r;   )rB   r   r   r   Úfinish  s    zProgressBar.finishc             c   sf   | j stdƒ‚| jr,xL| jD ]
}|V  qW n6x$| jD ]}|| _|V  | jdƒ q4W | jƒ  | jƒ  dS )z²
        Returns 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.r   N)r=   rL   r?   r2   r>   r{   r|   rE   )rB   Úrvr   r   r   rM     s    zProgressBar.generator)Nr   r    r!   r"   TNFNNNNr#   )Ú__name__Ú
__module__Ú__qualname__rD   rF   rK   rN   rO   rG   ÚpropertyrU   rW   rX   ra   rc   re   rk   ro   rE   rz   r{   r|   rM   r   r   r   r   r   6   s,      
&'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|ƒ z6ttd	ƒoôtj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 "%s"Zmore)rƒ   r„   )r   r   ÚsysÚstdinÚ
_nullpagerÚosÚenvironÚgetÚstripr   Ú_tempfilepagerÚ
_pipepagerÚplatformÚ
startswithÚhasattrr…   ÚtempfileÚmkstempÚcloseÚunlink)rM   r/   ÚstdoutZ	pager_cmdr“   ÚfdÚfilenamer   r   r   Úpager%  s,    
rš   c       
      C   s$  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… ƒ }|sld	|d< d
}nd|ks|d|kr€d
}|j|d
|j	|d�}t
|jƒ}y2x,| D ]$}	|s¶t|	ƒ}	|jj|	j|dƒƒ q¦W W n ttfk
rè   Y nX |jjƒ  x*y|jƒ  W n tk
�r   Y qöX P qöW dS )zqPage through text by feeding it to another program.  Invoking a
    pager through this might support colors.
    r   Nú/r   r†   ÚLESSr$   r    z-RTÚrÚR)Úshellrˆ   ÚenvÚreplaceéÿÿÿÿ)Ú
subprocessÚdictrŠ   r‹   ÚrsplitÚsplitrŒ   ri   ÚPopenÚPIPEr
   rˆ   r   rP   ÚencodeÚIOErrorÚKeyboardInterruptr•   Úwait)
rM   Úcmdr/   r£   r    Z
cmd_detailZ
less_flagsÚcÚencodingÚtextr   r   r   r�   A  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|ƒ X dS )z<Page through text by invoking a program on a temporary file.r   Nr$   Úwbz "ú")r“   Úmktempri   r   r
   r‡   r—   r   rP   r©   rŠ   r…   r–   )rM   r­   r/   r“   r™   r°   r¯   Úfr   r   r   rŽ   r  s    

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   )ÚstreamrM   r/   r°   r   r   r   r‰   ƒ  s    
r‰   c               @   s.   e Zd Zddd„Zdd„ Zdd	„ Zd
d„ ZdS )ÚEditorNTú.txtc             C   s   || _ || _|| _|| _d S )N)Úeditorr    Úrequire_saveÚ	extension)rB   r¸   r    r¹   rº   r   r   r   rD   �  s    zEditor.__init__c             C   sb   | 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kr@|S q@W dS )NÚVISUALÚEDITORZnotepadÚvimÚnanozwhich %s >/dev/null 2>&1r   Úvi)r»   r¼   )r½   r¾   )r¸   rŠ   r‹   rŒ   r   r…   )rB   Úkeyr}   r¸   r   r   r   Ú
get_editor”  s    


zEditor.get_editorc             C   s¢   dd l }| jƒ }| jr.tjjƒ }|j| jƒ nd }y8|jd||f |dd�}|jƒ }|dkrht	d| ƒ‚W n2 t
k
rœ } zt	d||f ƒ‚W Y d d }~X nX d S )Nr   z%s "%s"T)r    rŸ   z%s: Editing failed!z%s: Editing failed: %s)r£   rÁ   r    rŠ   r‹   Úcopyr{   r§   r¬   r   ÚOSError)rB   r™   r£   r¸   r‹   r®   Z	exit_codeÚer   r   r   Ú	edit_file¢  s    

zEditor.edit_filec       	      C   sô   dd l }|pd}|r(|jdƒ r(|d7 }|jd| jd�\}}z¦trTd}|jddƒ}nd}|j|ƒ}tj|d	ƒ}|j	|ƒ |j
ƒ  tjj|ƒ}| j|ƒ | jr°tjj|ƒ|kr°d S t|d
ƒ}z|jƒ }W d |j
ƒ  X |jdƒjddƒS tj|ƒ X d S )Nr   r$   r   zeditor-)ÚprefixÚsuffixz	utf-8-sigz
zutf-8r±   Úrb)r“   Úendswithr”   rº   r   r¡   r©   rŠ   ÚfdopenrP   r•   ÚpathÚgetmtimerÅ   r¹   ÚopenÚreadÚdecoder–   )	rB   r°   r“   r˜   Únamer¯   r´   Ú	timestampr}   r   r   r   Úedit³  s2    




zEditor.edit)NNTr·   )r~   r   r€   rD   rÁ   rÅ   rÒ   r   r   r   r   r¶   ‹  s
    
r¶   Fc       	      C   s¦  dd l }dd„ }tjdkrtdg}|r.|jdƒ |r<|jdƒ |j|| ƒƒ tdd	ƒ}z|j||d
�jƒ S |jƒ  X nžtrÀ|rš|| ƒ} d|| j	ddƒƒ }nd|r¤dp¦d| j	ddƒf }t
j|ƒS t�r|rì|| ƒ} dt
jj| ƒj	ddƒ }nd|rödpød| j	ddƒf }t
j|ƒS yF|�r2t
jj|| ƒƒ�p.d} n|| ƒ} |jd| gƒ}|�rV|jƒ S dS  tk
�r    | jdƒ�rœ| �rœ| �rœdd l}|j| ƒ dS dS X d S )Nr   c             S   sJ   ydd l }W n tk
r(   dd l }Y nX | jdƒrF|j| dd … ƒ} | S )Nr   zfile://é   )ÚurllibÚImportErrorr‘   Úunquote)ÚurlrÔ   r   r   r   Ú_unquote_fileÛ  s    
zopen_url.<locals>._unquote_fileÚdarwinrÍ   z-Wz-Rz	/dev/nullÚw)Ústderrzexplorer /select,"%s"r²   r$   zstart %s "" "%s"z/WAITzcygstart "%s"zcygstart %s "%s"z-wÚ.zxdg-openúhttp://úhttps://r   )rÝ   rÞ   )r£   r‡   r�   rm   rÍ   r§   r¬   r•   r   r¡   rŠ   r…   r   rË   ÚdirnamerÃ   r‘   Ú
webbrowser)	r×   r¬   Zlocater£   rØ   ÚargsÚnullr®   rà   r   r   r   Úopen_urlØ  sT    	






rã   c             C   s8   | dkrt ƒ ‚| dkr"t r"tƒ ‚| dkr4tr4tƒ ‚d S )Núúú)r«   r   ÚEOFError)Úchr   r   r   Ú_translate_ch_to_exc  s    ré   c               c   s
   d V  d S )Nr   r   r   r   r   Úraw_terminal  s    rê   c             C   s6   | rt j}nt j}|ƒ }|dkr*||ƒ 7 }t|ƒ |S )Nú õ   Ã )rë   rì   )ÚmsvcrtZgetwcheÚgetwchré   )r   Úfuncr}   r   r   r   Úgetchar#  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_settingsr   r   r   rê   Q  s     






c          
   C   sV   t ƒ �F}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è   r   r   r   rð   f  s    )N)FF))Ú__doc__rŠ   r‡   r7   rg   Ú
contextlibÚ_compatr   r   r   r   r   r   r	   r
   r   r   r   Úutilsr   Ú
exceptionsr   rÐ   rs   rQ   r   Úobjectr   rš   r�   rŽ   r‰   r¶   rã   ré   rí   Úcontextmanagerrê   rð   rô   rò   r   r   r   r   Ú<module>   s>   4
 p
1M
;	
+