3
e[                 @   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rd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rd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rddlm} ||d}|dkrd }|d kr|d krt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 requiredFr*   )'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-3irwxpxt/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 rt| 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 )Nd   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 )zReturn 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	stjjdrt
| d|S ttd	rtjd
dkrt| d|S ddl}|j \}}tj| z:ttd	ot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rtjjdd dj|dd  }|spd	|d< d
}nd|ksd|krd
}|j|d
|j	|d}t
jt
j|j}t|}	y0x*| D ]"}
|st|
}
|j|
j|	d qW 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\}}zt
j|d	}|j| W d Q R X t
j|t
jj|t
jj|d
 f t
jj|}| j| | jrt
jj||krd 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 nt	r|r|| j
dd} d|  d}n*| j
dd} |rd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| rd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