B
    Mhh`                 @   sL  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 ddlmZ ddlmZ ddlmZ edZejdkrdZ dZ!ndZ dZ!G dd dej"e Z#d6ej$e% ej&e' ddddZ(ej$e% e%ej&e' e'dddZ)ej$e% e%ej&e' e'dd d!Z*ej+ej$e% ej&e' dd"d#d$Z,G d%d& d&Z-d7e%e'e'e.d(d)d*Z/e%ej&e0 d+d,d-Z1erddl2Z2ej3ej4e. d.d/d0Z5e'e%d1d2d3Z6n:ddl7Z7ddl8Z8ej3ej4e. d.d4d0Z5e'e%d1d5d3Z6dS )8z
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)StringIO)which)TracebackType   )_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d6e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ejeje  eje eje dd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!d7eeje dd/d0d1Z"ddd2d3Z#eje dd4d5Z$dS )8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rVt	 }|d krVt
 }|| _|| _|| _d| _|| _|dk| _|d krddlm} ||d}|dkrd }|d kr|d krtdttjt t|}t|| _|| _d| _g | _|  |  t  | _| _d| _ d| _!d | _"d| _#d | _$t%| j | _&d | _'d S )N r   )length_hintz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,    rD   5/tmp/pip-install-vv81h98y/click/click/_termui_impl.py__init__(   sT    



zProgressBar.__init__zProgressBar[V])r*   c             C   s   d| _ |   | S )NT)r?   render_progress)rC   rD   rD   rE   	__enter__m   s    zProgressBar.__enter__)exc_type	exc_valuetbr*   c             C   s   |    d S )N)render_finish)rC   rI   rJ   rK   rD   rD   rE   __exit__r   s    zProgressBar.__exit__c             C   s   | j std|   |  S )Nz.You need to use progress bars in a with block.)r?   RuntimeErrorrG   	generator)rC   rD   rD   rE   __iter__z   s    zProgressBar.__iter__c             C   s   t t| S )N)nextr6   )rC   rD   rD   rE   __next__   s    zProgressBar.__next__c             C   s$   | j r
d S | jt | j  d S )N)rA   r&   write	AFTER_BARflush)rC   rD   rD   rE   rL      s    zProgressBar.render_finishc             C   s(   | j r
dS t| jt| jpdp d dS )Ng      ?r   )r=   minr7   floatr   )rC   rD   rD   rE   pct   s    zProgressBar.pctc             C   s"   | j s
dS t| j tt| j  S )Ng        )r8   sumrW   len)rC   rD   rD   rE   time_per_iteration   s    zProgressBar.time_per_iterationc             C   s&   | j d k	r"| js"| j| j | j  S dS )Ng        )r   r=   r[   r7   )rC   rD   rD   rE   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+   )r<   intr\   )rC   r2   secondsminuteshoursrD   rD   rE   
format_eta   s    
 zProgressBar.format_etac             C   s(   t | j}| jd k	r$|d| j 7 }|S )N/)strr7   r   )rC   r7   rD   rD   rE   
format_pos   s    

zProgressBar.format_posc             C   s   t | jd dddd  S )Nd   z 4%r   )ra   rX   )rC   rD   rD   rE   
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 d d | j < d|}|S )Nr   r   g       @g      ?r+   )r   ra   rX   r)   r   r   r=   listr[   mathcosr7   join)rC   Z
bar_lengthbarcharsrD   rD   rE   
format_bar   s    


*
zProgressBar.format_barc             C   s   | j }g }| jd k	r$|d kr$| j }| jr8||   |rJ||   | jrj| jrj| jsj|| 	  | j
d k	r| 
| j}|d k	r|| | j| j|  | j|d  S )N)r%   rp   info)r"   r   r#   appendrh   rk   r!   r<   r=   re   r$   r@   r   r%   rr   r    ro   rstrip)rC   r"   Z	info_bitsZ	item_inforD   rD   rE   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	| 
 }td| j| }||k r|t |d| j  || _|| _| j}| jd k	r| j}|t | 
 }t	|}| jd ks| j|k r|| _|| |d||   d|}|| jkr>|| _t|| j| jdd | j  d S )Nr   )r&   r'   r   r+   F)r&   r'   nl)shutilrA   rB   r%   r   r&   r'   r/   r)   r   rv   maxget_terminal_sizecolumnsrt   
BEFORE_BARr>   ro   rU   )	rC   rx   bufZ	old_widthZclutter_lengthZ	new_widthZclear_widthlineline_lenrD   rD   rE   rG      s@    




zProgressBar.render_progress)n_stepsr*   c             C   s   |  j |7  _ | jd k	r*| j | jkr*d| _t | j dk r@d S t | _| j rft | j | j  }nt | j }| jdd  |g | _| jd k	| _d S )NTg      ?i)r7   r   r=   r9   r;   r:   r8   r<   )rC   r   steprD   rD   rE   	make_step  s    
zProgressBar.make_step)r   r@   r*   c             C   sF   |dk	r|| _ |  j|7  _| j| jkrB| | 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   rG   )rC   r   r@   rD   rD   rE   update)  s    zProgressBar.updatec             C   s   d| _ d | _d| _d S )NFT)r<   r@   r=   )rC   rD   rD   rE   finishC  s    zProgressBar.finishc             c   sn   | j std| jr"| jE dH  nHx6| jD ],}|| _| jdkrF|   |V  | d q*W |   |   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?   rN   rA   r6   r@   r.   rG   r   r   )rC   rvrD   rD   rE   rO   H  s    
zProgressBar.generator)Nr   r   r   r   TNFNNNNr   r   )N)%__name__
__module____qualname__r2   Optionalr4   r   ra   rg   boolCallableTextIOrF   rH   TypeBaseExceptionr   rM   IteratorrP   rR   rL   propertyrW   rX   r[   r\   re   rh   rk   rr   rv   rG   r   r   r   rO   rD   rD   rD   rE   r   '   sN                j4-r   )rO   r'   r*   c          	   C   s
  t  }|dkrt }ttjr&t|s2t|| |S tjddpBd	 }|rrt
rbt| ||rrdS nt| ||rrdS tjddkrt|| |S t
stjdrt| d|rdS t| d|rdS d	dl}| \}}t| zt| d|rdS t|| |S t| X dS )
z2Decide what method to use for paging through text.NZPAGERr+   TERM)ZdumbZemacsZos2Zmorelessr   )r   r   r
   sysstdin
_nullpagerosenvirongetstripr   _tempfilepager
_pipepagerplatform
startswithtempfilemkstempcloseunlink)rO   r'   stdoutZ	pager_cmdr   fdfilenamerD   rD   rE   pagerj  s6    

r   )rO   cmdr'   r*   c       
   	   C   sB  t |}|dkrdS ddl}ttj}|ddd  }|dkr|d dkrtjdd	 d
|dd  }|sd|d< d}nd|ksd|krd}|j	|gd|j
|ddd}|jdk	sty*x$| D ]}	|st|	}	|j|	 qW W n ttfk
r   Y nX |j  x,y|  W n tk
r4   Y nX P qW dS )zPage through text by feeding it to another program.  Invoking a
    pager through this might support colors.

    Returns True if the command was found, False otherwise and thus another
    pager should be attempted.
    NFr   rf   r   r-   r   LESSr+   r   z-RTrRreplace)shellr   enverrorstext)r   
subprocessdictr   r   rsplitsplitr   ro   PopenPIPEr   AssertionErrorr   rS   OSErrorKeyboardInterruptr   wait)
rO   r   r'   cmd_absoluter   r   Z
cmd_detailZ
less_flagscr   rD   rD   rE   r     sH    
$


r   c          	   C   s   t |}|dkrdS ddl}ddl}| \}}d| }|sFt|}ttj}	t	|dd }
|

||	 W dQ R X z,y|||g W n tk
r   Y nX W dt| t| X dS )zPage through text by invoking a program on a temporary file.

    Returns True if the command was found, False otherwise and thus another
    pager should be attempted.
    NFr   r+   wbT)r   r   r   r   ro   r   r	   r   r   r   rS   encodecallr   r   r   r   )rO   r   r'   r   r   r   r   r   r   encodingfrD   rD   rE   r     s&    



r   )streamrO   r'   r*   c             C   s(   x"|D ]}|st |}| | qW dS )z>Simply print unformatted text.  This is the ultimate fallback.N)r   rS   )r   rO   r'   r   rD   rD   rE   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   )rC   r   r   r   r   rD   rD   rE   rF     s    zEditor.__init__)r*   c             C   s\   | j d k	r| j S x dD ]}tj|}|r|S qW tr:dS xdD ]}t|d k	r@|S q@W dS )N)VISUALEDITORZnotepad)zsensible-editorZvimZnanovi)r   r   r   r   r   r   )rC   keyr   r   rD   rD   rE   
get_editor  s    


zEditor.get_editor)r   r*   c          
   C   s   dd l }|  }d }| jr0tj }|| j yD|j| d| d|dd}| }|dkrrt	t
dj|dW n: tk
r } zt	t
dj||d	|W d d }~X Y nX d S )
Nr   z ""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   )rC   r   r   r   r   r   Z	exit_coder   rD   rD   rE   	edit_file  s     
zEditor.edit_file)r   r*   c       	   	   C   s>  dd l }|sd}nLt|ttfr&|}n8|r<|ds<|d7 }trT|ddd}n
|d}|jd| j	d\}}zt
|d	}|| W d Q R X t
|t
j|t
j|d
 f t
j|}| | | jrt
j||krd S t|d}| }W d Q R X t|ttfr|S |dddS t
| 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   fdopenrS   utimepathgetatimegetmtimer   r   openreaddecoder   )	rC   r   r   datar   namer   	timestampr   rD   rD   rE   edit3  s2    
$
zEditor.edit)NNTr   )r   r   r   r2   r   rg   Mappingr   rF   r   r   ZAnyStrr   rD   rD   rD   rE   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|d |rD|d |||  td	d
}z|j||d S |  X nt	r|r|| } dd|  g}n(dg}|r|d |d ||  y
|
|S  tk
r   dS X nhtrN|r|| } dtj| g}n dg}|r"|d ||  y
|
|S  tk
rL   dS X yF|rntj|| pjd} n|| } |d| g}|r| S dS  tk
r   | dr|s|sdd l}||  dS dS X d S )Nr   )r   r*   c             S   s*   ddl m} | dr&|| dd  } | S )Nr   )unquotezfile://   )urllib.parser   r   )r   r   rD   rD   rE   _unquote_filef  s    
zopen_url.<locals>._unquote_filedarwinr   z-Wz-Rz	/dev/nullw)stderrZexplorerz/select,r:   z/WAITr+      Zcygstartz-w.zxdg-open)zhttp://zhttps://r   )r   rg   r   r   rt   r   r   r   r   r   r   r   r   r   r   dirnamer   
webbrowser)	r   r   r   r   r   argsnullr   r   rD   rD   rE   open_urlc  sh    











r   )chr*   c             C   s6   | dkrt  | dkr ts t | dkr2tr2t d S )N)r   r   EOFError)r   rD   rD   rE   _translate_ch_to_exc  s    r   )r*   c               c   s
   dV  d S )Nr-   rD   rD   rD   rD   rE   raw_terminal  s    r   )r   r*   c             C   s6   | rt j}nt j}| }|dkr*|| 7 }t| |S )N)    à)msvcrtZgetwchegetwchr   )r   funcr   rD   rD   rE   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termios	tcgetattrttyZsetraw	tcsetattr	TCSADRAINr   rU   r   error)r   r   Zold_settingsrD   rD   rE   r     s     






c          	   C   sR   t  B}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   rS   r   )r   r   r   rD   rD   rE   r    s    )N)FF)9__doc__
contextlibrm   r   r   r9   typingr2   r   r   ior   rx   r   typesr   _compatr   r   r	   r
   r   r   r   r   
exceptionsr   utilsr   ZTypeVarr   r   r|   rT   ZGenericr   r4   rg   r   r   r   r   r   r   r   r   ra   r   r   r   r   contextmanagerr   r   r  r  r  rD   rD   rD   rE   <module>   sd   

  E ' B#aG0