U
    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š   z
t | ƒW S  ttfk
r”   zt| ƒj}W n tk
rD   Y Y dS X z|| ƒ}W n tk
rj   Y Y dS X |tks†t|tƒr†|dk rŒY dS | Y 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   ú4/usr/lib/python3/dist-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 requiredFç      à?)"Ú	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Úiterabler4   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r   r   r   Ú__init__8   sF    



zProgressBar.__init__c                 C   s   d| _ |  ¡  | S )NT)r>   Úrender_progress©rC   r   r   r   Ú	__enter__a   s    zProgressBar.__enter__c                 C   s   |   ¡  d S ©N)Úrender_finish)rC   Úexc_typeÚ	exc_valueÚtbr   r   r   Ú__exit__f   s    zProgressBar.__exit__c                 C   s   | j stdƒ‚|  ¡  |  ¡ S )Nú.You need to use progress bars in a with block.)r>   ÚRuntimeErrorrF   Ú	generatorrG   r   r   r   Ú__iter__i   s    zProgressBar.__iter__c                 C   s   t   ¡ | j | jkS rI   )r8   r9   rB   rG   r   r   r   Úis_fasto   s    zProgressBar.is_fastc                 C   s,   | j s|  ¡ rd S | j t¡ | j ¡  d S rI   )r@   rS   r/   ÚwriteÚ	AFTER_BARÚflushrG   r   r   r   rJ   r   s    zProgressBar.render_finishc                 C   s$   | j r
dS t| jt| jƒpd dƒS )Nç      ð?r   )r<   Úminr6   Úfloatr4   rG   r   r   r   Úpctx   s    zProgressBar.pctc                 C   s"   | j s
dS t| j ƒtt| j ƒƒ S ©Ng        )r7   ÚsumrY   r   rG   r   r   r   Útime_per_iteration~   s    zProgressBar.time_per_iterationc                 C   s"   | j r| js| j| j| j  S dS r[   )r5   r<   r]   r4   r6   rG   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;   Úintr^   )rC   Ú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)Ústrr6   r5   r4   )rC   r6   r   r   r   Ú
format_posš   s    
zProgressBar.format_posc                 C   s   dt | jd ƒ dd … S )Nz% 4d%%éd   r   )ra   rZ   rG   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       @r%   r$   )r5   ra   rZ   r1   r&   r'   r<   Úlistr]   ÚmathZcosr6   Újoin)rC   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.   rk   Úinfo)r+   r5   r,   Úappendre   rg   r*   r;   r<   rc   r-   r?   r(   r.   rl   r)   rj   Úrstrip)rC   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/   r0   Únl)Ztermuirq   r@   r2   r1   r	   rp   Úmaxrn   Ú
BEFORE_BARr=   rj   rA   rS   r   r/   r0   rV   )	rC   rq   ZbufZ	old_widthZclutter_lengthZ	new_widthZclear_widthÚlineZline_lenr   r   r   rF   Ê   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 )NTrW   iúÿÿÿ)	r6   r5   r4   r<   r8   r:   r9   r7   r;   )rC   Ún_stepsÚstepr   r   r   Ú	make_stepñ   s    
zProgressBar.make_stepc                 C   s   |   |¡ |  ¡  d S rI   )rx   rF   )rC   rv   r   r   r   Úupdate  s    
zProgressBar.updatec                 C   s   d| _ d | _d| _d S )Nr   T)r;   r?   r<   rG   r   r   r   Úfinish  s    zProgressBar.finishc                 c   s^   | j stdƒ‚| jr(| jD ]
}|V  qn2| jD ]}|| _|V  |  d¡ q.|  ¡  |  ¡  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.
        rO   r   N)r>   rP   r@   r3   r?   ry   rz   rF   )rC   Úrvr   r   r   rQ     s    


zProgressBar.generator)Nr   r    r!   r"   TNFNNNNr#   )Ú__name__Ú
__module__Ú__qualname__rE   rH   rN   rR   rS   rJ   ÚpropertyrZ   r]   r^   rc   re   rg   rl   rp   rF   rx   ry   rz   rQ   r   r   r   r   r   6   sB                     ý
)


'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 |¡ z@ttdƒrt d| ¡d
krt| d|ƒW ¢S t|| |ƒW ¢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Úhasattrr€   ÚtempfileÚmkstempÚcloseÚunlink)rQ   r0   Ú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ƒ}z.| D ]$}	|s´t|	ƒ}	|j |	 |d¡¡ q¤W n ttfk
rä   Y nX |j ¡  z| ¡  W n tk
r   Y qðX qqð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    ú-RTÚrÚR)Úshellrƒ   ÚenvÚreplace)Ú
subprocessÚdictr…   r†   ÚrsplitÚsplitr‡   rj   ÚPopenÚPIPEr
   rƒ   r   rT   ÚencodeÚIOErrorÚKeyboardInterruptr   Úwait)
rQ   Úcmdr0   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 5 Q R X zt
 |d | d ¡ W 5 t
 |¡ X dS )z<Page through text by invoking a program on a temporary file.r   Nr$   Úwbz "ú")rŽ   Zmktemprj   r   r
   r‚   r’   r   rT   r¥   r…   r‘   r€   )rQ   r©   r0   rŽ   r”   r¬   r«   Úfr   r   r   r‰   r  s    

r‰   c                 C   s$   |D ]}|st |ƒ}|  |¡ qdS )z>Simply print unformatted text.  This is the ultimate fallback.N)r   rT   )ÚstreamrQ   r0   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 rI   )Úeditorr   Úrequire_saveÚ	extension)rC   r³   r   r´   rµ   r   r   r   rE     s    zEditor.__init__c                 C   sb   | j d k	r| j S dD ]}tj |¡}|r|  S qtr:dS dD ]}t d| ¡dkr>|  S q>dS )N)ZVISUALZEDITORZnotepad)ZvimZnanozwhich %s >/dev/null 2>&1r   Zvi)r³   r…   r†   r‡   r   r€   )rC   Úkeyr{   r³   r   r   r   Ú
get_editor”  s    


zEditor.get_editorc              
   C   s¢   dd l }|  ¡ }| jr.tj ¡ }| | j¡ nd }z8|jd||f |dd}| ¡ }|dkrht	d| ƒ‚W n2 t
k
rœ } zt	d||f ƒ‚W 5 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†   Úcopyry   r£   r¨   r   ÚOSError)rC   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²W ¢<d S t|d
ƒ}z| ¡ }W 5 | ¡  X | d¡ dd¡W ¢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ž   r¥   ÚfdopenrT   r   ÚpathÚgetmtimer»   r´   ÚopenÚreadÚdecode)	rC   r¬   rŽ   r“   Únamer«   r¯   Z	timestampr{   r   r   r   Úedit³  s4    


ÿ

zEditor.edit)NNTr²   )r|   r}   r~   rE   r·   r»   rÇ   r   r   r   r   r±   ‹  s     ÿ
r±   Fc           	      C   s°  dd l }dd„ }tjdkrxdg}|r.| d¡ |r<| d¡ | || ƒ¡ tdd	ƒ}z|j||d
 ¡ W ¢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|oød pþd|  	dd¡f }t
 |¡S zJ|r8t
j || ƒ¡p4d} 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   c                 S   sJ   z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-Wr™   z	/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‹   rn   rÃ   r   r£   r¨   r   rž   r…   r€   r   rÁ   Údirnamer¹   rŒ   Ú
webbrowser)	rË   r¨   ZlocaterŸ   rÌ   ÚargsZnullrª   rÒ   r   r   r   Úopen_urlØ  s^    	




ÿ
 
ÿ
 
ÿ


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 rI   r   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   Úfuncr{   r   r   r   Ú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ÚtermiosZ	tcgetattrZ	tcsetattrZ	TCSADRAINr’   rV   r   ÚttyZsetrawÚerror)r¯   r“   Zold_settingsr   r   r   rÛ   Q  s     






c              
   C   sb   t ƒ R}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’   rT   rÚ   )r   r“   rÙ   r   r   r   rà   f  s    )N)FF))Ú__doc__r…   r‚   r8   ri   Ú
contextlibZ_compatr   r   r   r   r   r   r	   r
   r   r   r   Zutilsr   Ú
exceptionsr   rÆ   rt   rU   r   Úobjectr   r•   rŠ   r‰   r„   r±   rÔ   rÚ   rÞ   ÚcontextmanagerrÛ   rà   rã   râ   r   r   r   r   Ú<module>   sB   4
 p
1M
;	

+
