B
    x6ª[›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ƒr||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   ú1lib/python3.7/site-packages/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 ¡  | _| _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| _ |  ¡  | S )NT)r=   Úrender_progress)rB   r   r   r   Ú	__enter__a   s    zProgressBar.__enter__c             C   s   |   ¡  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ƒ‚|  ¡  |  ¡ 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kS )N)r7   r8   rA   )rB   r   r   r   Úis_fasto   s    zProgressBar.is_fastc             C   s,   | j s|  ¡ rd S | j t¡ | 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s| 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   ÚtZsecondsZminutesZhoursZ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 ¡d d | j ƒ< d |¡}|S )Nr   r   g       @g      à?r$   )r4   r[   rU   r0   r%   r&   r;   ÚlistrW   ÚmathZ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| |  ¡ ¡ |rF| |  ¡ ¡ | jrf| jrf| jsf| |  	¡ ¡ | j
d k	rŽ|  
| j¡}|d k	rŽ| |¡ | j| j|  ¡ | j |¡dœ  ¡ S )N)r-   re   Úinfo)r*   r4   r+   Úappendr_   ra   r)   r:   r;   r]   r,   r>   r'   r-   rf   r(   rd   Ú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|  ¡ ƒ}td|ƒ d | ƒ}||k rt| t	¡ | d| j
 ¡ || _
|| _| j}| j
d k	r| j
}| t	¡ |  ¡ }t|ƒ}| j
d ks¾| j
|k rÄ|| _
| |¡ | d||  ¡ d |¡}|| jkr$|  ¡ s$|| _t|| j| jdd | j ¡  d S )Nr   )Úget_terminal_sizer   r    r$   F)r.   r/   Únl)Ztermuirk   r?   r1   r0   r	   rj   Úmaxrh   Ú
BEFORE_BARr<   rd   r@   rO   r   r.   r/   rR   )	rB   rk   ZbufZ	old_widthZclutter_lengthZ	new_widthZclear_widthÚlineZline_lenr   r   r   rE   Ê   s:    




zProgressBar.render_progressc             C   s’   |  j |7  _ | jr&| j | jkr&d| _t ¡ | j dk r<d S t ¡ | _| j rbt ¡ | j | j  }nt ¡ | 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   |   |¡ |  ¡  d S )N)rr   rE   )rB   rp   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  |  d¡ q4W |  ¡  |  ¡  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>   rs   rt   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   r]   r_   ra   rf   rj   rE   rr   rs   rt   rM   r   r   r   r   r   6   s,      
&'r   c          	   C   s  t ƒ }ttjƒrt|ƒs$t|| |ƒS tj dd¡p4d ¡ }|rZt	rNt
| ||ƒS t| ||ƒS tj d¡dkrvt|| |ƒS t	s†tj d¡r’t
| d|ƒS ttdƒr¶t d	¡d
kr¶t| d|ƒS d
dl}| ¡ \}}t |¡ z4ttdƒrþt d| ¡d
krþt| d|ƒS t|| |ƒS t |¡ X dS )z2Decide what method to use for paging through text.ZPAGERNr$   ZTERM)ZdumbZemacsZos2zmore <Úsystemz(less) 2>/dev/nullr   Úlessz	more "%s"Zmore)r   r   ÚsysÚstdinÚ
_nullpagerÚosÚenvironÚgetÚstripr   Ú_tempfilepagerÚ
_pipepagerÚplatformÚ
startswithÚhasattrrz   Ú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ƒ}| dd¡d  ¡ }|dkr€|d dkr€tj dd¡d	 |dd… ¡ }|sld
|d< d}nd|ks|d|kr€d}|j|d|j	|d}t
|jƒ}y2x,| D ]$}	|s¶t|	ƒ}	|j |	 |d¡¡ q¦W W n ttfk
rè   Y nX |j ¡  x*y| ¡  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   rd   Ú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 }| ¡ }d | ¡}|s&t|ƒ}ttjƒ}t|dƒd }| | 	|¡¡ W dQ R X zt
 |d | d ¡ W dt
 |¡ X dS )z<Page through text by invoking a program on a temporary file.r   Nr$   Úwbz "ú")rˆ   Zmktemprd   r   r
   r|   rŒ   r   rP   rž   r   rz   r‹   )rM   r¢   r/   rˆ   rŽ   r¥   r¤   Úfr   r   r   rƒ   r  s    

rƒ   c             C   s(   x"|D ]}|st |ƒ}|  |¡ 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 |¡}|r|S qW tr:dS x"dD ]}t d| ¡dkr@|S q@W dS )N)ZVISUALZEDITORZnotepad)ZvimZnanozwhich %s >/dev/null 2>&1r   Zvi)r¬   r   r€   r   r   rz   )rB   Úkeyru   r¬   r   r   r   Ú
get_editor”  s    


zEditor.get_editorc          
   C   s¢   dd l }|  ¡ }| jr.tj ¡ }| | j¡ nd }y8|jd||f |dd}| ¡ }|dkrht	d| ƒ‚W n2 t
k
rœ } zt	d||f ƒ‚W d d }~X Y 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€   Úcopyrs   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&| d¡s&|d7 }|jd| jd\}}z¦trRd}| dd¡}nd}| |¡}t |d	¡}| 	|¡ | 
¡  tj |¡}|  |¡ | jr®tj |¡|kr®d S t|d
ƒ}z| ¡ }W d | 
¡  X | d¡ dd¡S t |¡ 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¨   Z	timestampru   r   r   r   Úedit³  s2    




zEditor.edit)NNTr«   )rv   rw   rx   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.| d¡ |r<| d¡ | || ƒ¡ tdd	ƒ}z|j||d
 ¡ S | ¡  X nžtrÀ|rš|| ƒ} d||  	dd¡ƒ }nd|r¤dp¦d|  	dd¡f }t
 |¡S tr|rì|| ƒ} dt
j | ¡ 	dd¡ }nd|rödpød|  	dd¡f }t
 |¡S yF|r2t
j || ƒ¡p.d} n|| ƒ} | d| g¡}|rV| ¡ S dS  tk
rœ   |  d¡r˜|s˜|s˜dd l}| | ¡ 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 |  d¡rF| | dd … ¡} | S )Nr   zfile://é   )ÚurllibÚImportErrorr†   Z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)zhttp://zhttps://r   )r˜   r|   r…   rh   r¼   rœ   r¡   rŠ   r   r—   r   rz   r   rº   Údirnamer²   r†   Ú
webbrowser)	rÄ   r¡   Zlocater˜   rÅ   ÚargsZnullr£   rË   r   r   r   Úopen_urlØ  sT    	






rÍ   c             C   s6   | dkrt ƒ ‚| dkr ts tƒ ‚| dkr2tr2tƒ ‚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)ú õ   Ã )ÚmsvcrtZgetwcheZgetwchrÓ   )r   Úfuncru   r   r   r   Úgetchar#  s    
rÙ   c              c   s–   t tjƒstdƒ} |  ¡ }ntj ¡ }d } yPt |¡}zt |¡ |V  W d 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ÚtermiosZ	tcgetattrÚttyZsetrawZ	tcsetattrZ	TCSADRAINrŒ   rR   rŠ   Úerror)r¨   r   Zold_settingsr   r   r   rÔ   Q  s     






c          	   C   sV   t ƒ F}t |d¡}| ttjƒd¡}| r@ttjƒr@t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   rc   Ú
contextlibZ_compatr   r   r   r   r   r   r	   r
   r   r   r   Zutilsr   Ú
exceptionsr   r¿   rn   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
;	
+