
¿«‘_Þ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)z¨Return 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;	-