
_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 r d Z d Z n d Z d Z d d   Z Gd d   d e  Z d d d  Z d d   Z d d   Z d d    Z Gd! d"   d" e  Z d# d# d$ d%  Z  d& d'   Z! e rd d l" Z" e j# d( d)    Z$ d* d+   Z% n9 d d l& Z& d d l' Z' e j# d, d)    Z$ d- d+   Z% d S).z
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  |   SWn t t f k
 r y t |   j } Wn t k
 rO d SYn Xy | |   } Wn t k
 rx d SYn X| t k s t | t  s | d k  r d S| SYn Xd S)z%Returns the length hint of an object.Nr   )lenAttributeError	TypeErrortype__length_hint__NotImplemented
isinstancer   )objZget_hintZhint r   3/tmp/pip-build-5gj8f0j9/click/click/_termui_impl.py_length_hint"   s    		(r   c               @   s?  e  Z d  Z d d d d d d d d d d d d d d	 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)1ProgressBarN# z%(bar)sz  TF   c             C   s  | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ |	 |  _ |
 |  _ | pQ d |  _ | d  k rl t	   } | |  _
 | |  _ | |  _ | d k |  _ | d  k r t |  } | d  k r | d  k r t 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iterabler0   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)r?   r   r   r   	__enter__k   s    	
zProgressBar.__enter__c             C   s   |  j    d  S)N)render_finish)r?   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:   RuntimeErrorrB   	generator)r?   r   r   r   __iter__s   s    	
zProgressBar.__iter__c             C   s   t  t |    S)N)nextr/   )r?   r   r   r   __next__y   s    zProgressBar.__next__c             C   s   t  j    |  j |  j k S)N)r4   r5   r>   )r?   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<   rN   r+   write	AFTER_BARflush)r?   r   r   r   rD      s    zProgressBar.render_finishc             C   s0   |  j  r d St |  j t |  j  p( d d  S)Ng      ?r   )r8   minr2   floatr0   )r?   r   r   r   pct   s    	zProgressBar.pctc             C   s-   |  j  s d St |  j   t t |  j    S)Ng        )r3   sumrS   r   )r?   r   r   r   time_per_iteration   s    	zProgressBar.time_per_iterationc             C   s,   |  j  r( |  j r( |  j |  j |  j Sd S)Ng        )r1   r8   rV   r0   r2   )r?   r   r   r   eta   s    zProgressBar.etac             C   s   |  j  r t |  j  } | d } | d } | d } | d } | d } | d } | d k rv d j | | | |  Sd j | | |  Sd S)N<      r   z{}d {:02}:{:02}:{:02}z{:02}:{:02}:{:02}r!   )r7   intrW   format)r?   tsecondsminuteshoursr   r   r   
format_eta   s    	





zProgressBar.format_etac             C   s2   t  |  j  } |  j r. | d j |  j  7} | S)Nz/{})strr2   r1   r[   r0   )r?   r2   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[   rZ   rT   )r?   r   r   r   
format_pct   s    zProgressBar.format_pctc             C   s   |  j  rG t |  j |  j  } |  j | } | |  j |  j | 7} n |  j rc |  j |  j } no t |  j |  j px d  } |  j d k r |  j | t t	 j
 |  j |  j  d d |  j  <d j |  } | S)Nr   r   g       @g      ?r!   )r1   rZ   rT   r-   r"   r#   r8   listrV   mathcosr2   join)r?   Z
bar_lengthbarr   r   r   
format_bar   s    		5zProgressBar.format_barc             C   s  |  j  } g  } |  j r. | d  k r. |  j } |  j rJ | j |  j    | rc | j |  j    |  j r |  j r |  j r | j |  j	    |  j
 d  k	 r |  j
 |  j  } | d  k	 r | j |  |  j d |  j d |  j   d |  j j |  i j   S)Nr*   ri   info)r'   r1   r(   appendrb   rd   r&   r7   r8   r`   r)   r;   r$   r*   rj   r%   rh   rstrip)r?   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  Sg  } |  j r |  j } d |  _ t |  j    } t d |   d |  } | | 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|  j   r| |  _ t | d |  j d |  j d d	 |  j j   d  S)
Nr   )get_terminal_sizer   r   r!   r+   r,   nlF)Ztermuiro   r<   r.   r-   r   rn   maxrl   
BEFORE_BARr9   rh   r=   rN   r   r+   r,   rQ   )	r?   ro   bufZ	old_widthZclutter_lengthZ	new_widthZclear_widthlineline_lenr   r   r   rB      s:    										"zProgressBar.render_progressc             C   s   |  j  | 7_  |  j r3 |  j  |  j k r3 d |  _ t j   |  j d k  rP d  St j   |  _ |  j  r t j   |  j |  j  } n t j   |  j } |  j d d   | g |  _ |  j |  _ d  S)NTg      ?   i)	r2   r1   r0   r8   r4   r6   r5   r3   r7   )r?   n_stepsstepr   r   r   	make_step  s    		zProgressBar.make_stepc             C   s   |  j  |  |  j   d  S)N)ry   rB   )r?   rw   r   r   r   update"  s    zProgressBar.updatec             C   s   d |  _  d  |  _ d |  _ d  S)Nr   T)r7   r;   r8   )r?   r   r   r   finish&  s    		zProgressBar.finishc             c   s   |  j  s t d   |  j r: x\ |  j D] } | Vq( WnC x, |  j D]! } | |  _ | V|  j d  qD 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.r   N)r:   rI   r<   r/   r;   rz   r{   rB   )r?   rvr   r   r   rJ   +  s    			
zProgressBar.generator)__name__
__module____qualname__rA   rC   rH   rK   rM   rL   rN   rD   propertyrT   rV   rW   r`   rb   rd   rj   rn   rB   ry   rz   r{   rJ   r   r   r   r   r   4   sB   '	'r   c             C   s  t    } t t j  s& t |  r6 t | |  |  St j j d d  pN d j   } | r t	 rs t
 |  | |  St |  | |  St j j d  d k r t | |  |  St	 s t j j d  r t
 |  d |  St t d	  rt j d
  d k rt |  d |  Sd d l } | j   \ } } t j |  zQ t t d	  rrt j d j |   d k rrt |  d |  St | |  |  SWd t j |  Xd 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closer[   unlink)rJ   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 r d j t j j d d  d	 j | d d    } | s d
 | d <d } n d | k s d | k r d } | j	 | d d d | j
 d | } t | j  } yC x< |  D]4 }	 | st |	  }	 | j j |	 j | d   q WWn t t f k
 rNYn X| j j   x( y | j   Wn t k
 rYq_XPq_Wd 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   rh   PopenPIPEr   r   r
   rO   encodeIOErrorKeyboardInterruptr   wait)
rJ   cmdr,   r   r   Z
cmd_detailZ
less_flagscencodingtextr   r   r   r   c  s4    4
	$$
r   c             C   s   d d l  } | j   } d j |   } | s9 t |  } t t j  } t | d  d  } | j | j	 |   Wd QRXz t
 j d j | |   Wd t
 j |  Xd S)z<Page through text by invoking a program on a temporary file.r   Nr!   wbz{} "{}")r   mktemprh   r
   r   r   r   r   rO   r   r   r   r[   r   )rJ   r   r,   r   r   r   r   fr   r   r   r     s    r   c             C   s4   x- | D]% } | s t  |  } |  j |  q Wd S)z>Simply print unformatted text.  This is the ultimate fallback.N)r
   rO   )streamrJ   r,   r   r   r   r   r     s    r   c               @   sL   e  Z d  Z d d d d d d  Z d d   Z d d	   Z d
 d   Z d S)EditorNTz.txtc             C   s(   | |  _  | |  _ | |  _ | |  _ d  S)N)editorr   require_save	extension)r?   r   r   r   r   r   r   r   rA     s    			zEditor.__init__c             C   s   |  j  d  k	 r |  j  Sx* d
 D]" } t j j |  } | r | Sq Wt rM d Sx0 d D]( } t j d j |   d k rT | SqT Wd	 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[   )r?   keyr|   r   r   r   r   
get_editor  s    zEditor.get_editorc             C   s   d d  l  } |  j   } |  j rC t j j   } | j |  j  n d  } yX | j d j | |  d | d d } | j	   } | d k r t
 d j |    Wn= t k
 r } z t
 d j | |    WYd  d  } ~ Xn Xd  S)Nr   z{} "{}"r   r   Tz{}: Editing failed!z{}: Editing failed: {})r   r   r   r   r   copyrz   r   r[   r   r   OSError)r?   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 } | r8 | j d  r8 | d 7} | j d d d |  j  \ } } z t r} d } | j d d  } n d	 } | j |  } t j | d
  } | j	 |  | j
   t j j |  } |  j |  |  j r t j j |  | k r d  St | d  } z | j   } Wd  | j
   X| j d  j d d  SWd  t j |  Xd  S)Nr   r!   r   prefixzeditor-suffixz	utf-8-sigz
zutf-8r   rb)r   endswithr   r   r   r   r   r   fdopenrO   r   pathgetmtimer   r   openreaddecoder   )	r?   r   r   r   namer   r   	timestampr|   r   r   r   edit  s0    
!
!zEditor.edit)r}   r~   r   rA   r   r   r   r   r   r   r   r     s   r   Fc       	      C   sI  d d  l  } d d   } t j d k r d g } | rC | j d  | rV | j d  | j | |    t d d	  } z | j | d
 | j   SWd  | j   Xn t r| r | |   }  d j	 | |  j
 d d    } n* d j	 | r d n d |  j
 d d   } t j |  St r| r[| |   }  d j	 t j j |   j
 d d   } n* d j	 | rmd n d |  j
 d d   } t j |  Sy` | rt j j | |    pd }  n | |   }  | j d |  g  } | r| j   Sd SWnP t k
 rD|  j d  r<| r<| r<d d  l } | j |   d Sd SYn Xd  S)Nr   c             S   s]   y d d  l  } Wn t k
 r0 d d  l  } Yn X|  j d  rY | 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   rl   r   r   r   r   r   r[   r   r   r   r   r   dirnamer   r   
webbrowser)	r   r   Zlocater   r   argsnullr   r   r   r   r   open_url  sP    		$$**!
r   c             C   sP   |  d k r t     |  d k r1 t r1 t    |  d k rL t rL t    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   sK   |  r t  j } n	 t  j } |   } | d k r= | |   7} t |  | S)N    à)r   r   )msvcrtZgetwchegetwchr   )r   funcr|   r   r   r   getcharE  s    		
r   c              c   s   t  t j  s* t d  }  |  j   } n t j j   } d  }  yf t j |  } z t j |  | VWd  t j	 | t j
 |  t j j   |  d  k	 r |  j   XWn t j k
 r Yn Xd  S)Nz/dev/tty)r   r   r   r   filenotermios	tcgetattrttyZsetraw	tcsetattr	TCSADRAINr   rQ   r   error)r   r   Zold_settingsr   r   r   r   u  s     	c          
   C   sw   t    g } t j | d  } | j t t j  d  } |  r^ t t j  r^ t j j	 |  t
 |  | SWd  QRXd  S)N    r   )r   r   r   r   r   r   r   r   r   rO   r   )r   r   r   r   r   r   r     s    
)(__doc__
contextlibrf   r   r   r4   _compatr   r   r   r   r   r   r	   r
   r   r   
exceptionsr   utilsr   r   rr   rP   r   objectr   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r   r   r   <module>   sP   	 1L;	-