3
	;^P                 @   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 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krd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rZd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 )0z
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   )_default_text_stdout)CYGWIN)get_best_encoding)	int_types)isatty)open_stream)
range_type)
strip_ansi)term_len)WIN)ClickException)echo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 rd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   O/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/click/_termui_impl.py_length_hint"   s    r   c               @   s   e Zd Zd1d	d
Zdd Zdd Zdd Zdd Ze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/d0 ZdS )2ProgressBarN# %(bar)s  TF   c             C   s  || _ || _|| _|| _|| _|| _|	| _|
| _|p6d| _|d krHt	 }|| _
|| _|| _|dk| _|d krtt|}|d kr|d krt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iterabler2   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   r   r   __init__5   sF    



zProgressBar.__init__c             C   s   d| _ | j  | S )NT)r<   render_progress)rA   r   r   r   	__enter__k   s    zProgressBar.__enter__c             C   s   | j   d S )N)render_finish)rA   exc_type	exc_valuetbr   r   r   __exit__p   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)rA   r   r   r   __iter__s   s    zProgressBar.__iter__c             C   s   t t| S )N)nextr1   )rA   r   r   r   __next__y   s    zProgressBar.__next__c             C   s   t j  | j | jkS )N)r6   r7   r@   )rA   r   r   r   is_fast   s    zProgressBar.is_fastc             C   s,   | j s| j rd S | jjt | jj  d S )N)r>   rP   r-   write	AFTER_BARflush)rA   r   r   r   rF      s    zProgressBar.render_finishc             C   s$   | j r
dS t| jt| jpd dS )Ng      ?r   )r:   minr4   floatr2   )rA   r   r   r   pct   s    zProgressBar.pctc             C   s"   | j s
dS t| j tt| j  S )Ng        )r5   sumrU   r   )rA   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        )r3   r:   rX   r2   r4   )rA   r   r   r   eta   s    zProgressBar.etac             C   sj   | j rft| j}|d }|d }|d }|d }|d }|d }|dkrXdj||||S dj|||S dS )N<      r   z{}d {:02}:{:02}:{:02}z{:02}:{:02}:{:02}r#   )r9   intrY   format)rA   tsecondsminuteshoursr   r   r   
format_eta   s    
zProgressBar.format_etac             C   s$   t | j}| jr |dj| j7 }|S )Nz/{})strr4   r3   r]   r2   )rA   r4   r   r   r   
format_pos   s    
zProgressBar.format_posc             C   s   dj t| jd dd  S )Nz{: 4}%d   r   )r]   r\   rV   )rA   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#   )r3   r\   rV   r/   r$   r%   r:   listrX   mathcosr4   join)rA   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,   rk   info)r)   r3   r*   appendrd   rf   r(   r9   r:   rb   r+   r=   r&   r,   rl   r'   rj   rstrip)rA   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termuirq   r>   r0   r/   r   rp   maxrn   
BEFORE_BARr;   rj   r?   rP   r   r-   r.   rS   )	rA   rq   bufZ	old_widthZclutter_lengthZ	new_widthZclear_widthlineZline_lenr   r   r   rD      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)	r4   r3   r2   r:   r6   r8   r7   r5   r9   )rA   n_stepsstepr   r   r   	make_step  s    
zProgressBar.make_stepc             C   s   | j | | j  d S )N)rz   rD   )rA   rx   r   r   r   update"  s    
zProgressBar.updatec             C   s   d| _ d | _d| _d S )Nr   T)r9   r=   r:   )rA   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 )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.r   N)r<   rK   r>   r1   r=   r{   r|   rD   )rA   rvr   r   r   rL   +  s    zProgressBar.generator)Nr   r   r    r!   TNFNNNNr"   )__name__
__module____qualname__rC   rE   rJ   rM   rO   rN   rP   rF   propertyrV   rX   rY   rb   rd   rf   rl   rp   rD   rz   r{   r|   rL   r   r   r   r   r   4   sB               
'	'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| z8ttd	otjdj|dkrt| d|S t|| |S tj| X dS )z2Decide what method to use for paging through text.ZPAGERNr#   Z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closer]   unlink)rL   r.   stdoutZ	pager_cmdr   fdfilenamer   r   r   pagerF  s,    
 r   c       
      C   s*  ddl }ttj}|jddd j }|dkr|d dkrdjtjjddd	j|dd }|spd
|d< d}nd|ksd|krd}|j	|d|j
|d}t|j}y2x,| D ]$}	|st|	}	|jj|	j|d qW W n ttfk
r   Y nX |jj  x,y|j  W n tk
r   Y nX P  qW dS )zqPage through text by feeding it to another program.  Invoking a
    pager through this might support colors.
    r   N/r   r   z{}{}LESSr#   r   z-RTrR)shellr   envreplace)
subprocessdictr   r   rsplitsplitr]   r   rj   PopenPIPEr   r   r
   rQ   encodeIOErrorKeyboardInterruptr   wait)
rL   cmdr.   r   r   Z
cmd_detailZ
less_flagscencodingtextr   r   r   r   c  s4    
$



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j|| W dt
j| X dS )z<Page through text by invoking a program on a temporary file.r   Nr#   wbz{} "{}")r   mktemprj   r
   r   r   r   r   rQ   r   r   r   r]   r   )rL   r   r.   r   r   r   r   fr   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
   rQ   )streamrL   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)rA   r   r   r   r   r   r   r   rC     s    zEditor.__init__c             C   sd   | 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j|dkr@|S q@W d	S )NVISUALEDITORZnotepadsensible-editorvimnanozwhich {} >/dev/null 2>&1r   vi)r   r   )r   r   r   )r   r   r   r   r   r   r]   )rA   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 }y:|jdj|||dd}|j	 }|dkrjt
dj|W n2 tk
r } zt
dj||W Y d d }~X nX d S )Nr   z{} "{}"T)r   r   z{}: Editing failed!z{}: Editing failed: {})r   r   r   r   r   copyr{   r   r]   r   r   OSError)rA   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\}}ztrTd}|jdd}nd}|j|}tj|d	}|j	| |j
  tjj|}| j| | jrtjj||krd 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   fdopenrQ   r   pathgetmtimer   r   openreaddecoder   )	rA   r   r   r   namer   r   	timestampr}   r   r   r   edit  s0    




zEditor.edit)NNTr   )r~   r   r   rC   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 ntr|r|| } dj	|| j
dd}ndj	|rdnd| j
dd}tj|S tr|r|| } dj	tjj| j
dd}ndj	| rdnd| j
dd}tj|S yF|r8tjj|| p4d} 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   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,"{}""r#   zstart {} "" "{}"z/WAITzcygstart "{}"zcygstart {} "{}"z-w.zxdg-openhttp://https://r   )r   r   )r   r   r   rn   r   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  sP    	






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_exc5  s    r   c               c   s
   d V  d S )Nr   r   r   r   r   raw_terminalA  s    r   c             C   s6   | rt j}nt j}| }|dkr*|| 7 }t| |S )N    à)r   r   )msvcrtZgetwcheZgetwchr   )r   funcr}   r   r   r   getcharE  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termiosZ	tcgetattrttyZsetrawZ	tcsetattrZ	TCSADRAINr   rS   r   error)r   r   Zold_settingsr   r   r   r   u  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   rQ   r   )r   r   r   r   r   r   r     s    )N)FF)(__doc__
contextlibrh   r   r   r6   _compatr   r   r   r   r   r   r	   r
   r   r   
exceptionsr   utilsr   r   rt   rR   r   objectr   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r   r   r   <module>   sR   
  
1L
;	
-