U
    @ޫ^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   z
t | W S  ttfk
r   zt| j}W n tk
rD   Y Y dS X z|| }W n tk
rj   Y Y dS X |tkst|tr|dk rY dS | Y 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   6/tmp/pip-unpacked-wheel-xshj_gqa/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  | _| _d| _d| _d | _d| _d | _t| j
 | _d | _ d| _!d S )N r   ziterable or length is requiredF      ?)"	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iterabler3   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r   r   r   __init__5   sF    



zProgressBar.__init__c                 C   s   d| _ |   | S )NT)r=   render_progressrB   r   r   r   	__enter__k   s    zProgressBar.__enter__c                 C   s   |    d S N)render_finish)rB   exc_type	exc_valuetbr   r   r   __exit__p   s    zProgressBar.__exit__c                 C   s   | j std|   |  S )N.You need to use progress bars in a with block.)r=   RuntimeErrorrE   	generatorrF   r   r   r   __iter__s   s    zProgressBar.__iter__c                 C   s   t t| S rH   )nextr2   rF   r   r   r   __next__y   s    zProgressBar.__next__c                 C   s   t   | j | jkS rH   )r7   r8   rA   rF   r   r   r   is_fast   s    zProgressBar.is_fastc                 C   s,   | j s|  rd S | jt | j  d S rH   )r?   rT   r.   write	AFTER_BARflushrF   r   r   r   rI      s    zProgressBar.render_finishc                 C   s$   | j r
dS t| jt| jpd dS )N      ?r   )r;   minr5   floatr3   rF   r   r   r   pct   s    zProgressBar.pctc                 C   s"   | j s
dS t| j tt| j  S Ng        )r6   sumrZ   r   rF   r   r   r   time_per_iteration   s    zProgressBar.time_per_iterationc                 C   s"   | j r| js| j| j| j  S dS r\   )r4   r;   r^   r3   r5   rF   r   r   r   eta   s    zProgressBar.etac                 C   sj   | j rft| j}|d }|d }|d }|d }|d }|d }|dkrXd||||S d|||S dS )N<      r   z{}d {:02}:{:02}:{:02}z{:02}:{:02}:{:02}r#   )r:   intr_   format)rB   tsecondsminuteshoursr   r   r   
format_eta   s    
zProgressBar.format_etac                 C   s$   t | j}| jr |d| j7 }|S )Nz/{})strr5   r4   rc   r3   )rB   r5   r   r   r   
format_pos   s    
zProgressBar.format_posc                 C   s   d t| jd dd  S )Nz{: 4}%d   r   )rc   rb   r[   rF   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 d d | j < d|}|S )Nr   r   g       @r$   r#   )r4   rb   r[   r0   r%   r&   r;   listr^   mathcosr5   join)rB   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||   |rF||   | jrf| jrf| jsf|| 	  | j
d k	r| 
| j}|d k	r|| | j| j|  | j|d  S )N)r-   rq   info)r*   r4   r+   appendrj   rl   r)   r:   r;   rh   r,   r>   r'   r-   rr   r(   rp   rstrip)rB   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|  }td| d | }||k rt|t	 |d| j
  || _
|| _| j}| j
d k	r| j
}|t	 |  }t|}| j
d ks| j
|k r|| _
|| |d||   d|}|| jkr$|  s$|| _t|| j| jdd | j  d S )Nr   )get_terminal_sizer   r   r#   F)r.   r/   nl)Ztermuirw   r?   r1   r0   r   rv   maxrt   
BEFORE_BARr<   rp   r@   rT   r   r.   r/   rW   )	rB   rw   bufZ	old_widthZclutter_lengthZ	new_widthZclear_widthlineline_lenr   r   r   rE      s:    




zProgressBar.render_progressc                 C   s   |  j |7  _ | jr&| j | jkr&d| _t | j dk r<d S t | _| j rbt | j | j  }nt | j }| jdd  |g | _| j| _d S )NTrX   i)	r5   r4   r3   r;   r7   r9   r8   r6   r:   )rB   n_stepsstepr   r   r   	make_step  s    
zProgressBar.make_stepc                 C   s   |  | |   d S rH   )r   rE   )rB   r~   r   r   r   update"  s    
zProgressBar.updatec                 C   s   d| _ d | _d| _d S )Nr   T)r:   r>   r;   rF   r   r   r   finish&  s    zProgressBar.finishc                 c   s^   | j std| jr(| jD ]
}|V  qn2| jD ]}|| _|V  | d q.|   |   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.
        rN   r   N)r=   rO   r?   r2   r>   r   r   rE   )rB   rvr   r   r   rP   +  s    


zProgressBar.generator)Nr   r   r    r!   TNFNNNNr"   )__name__
__module____qualname__rD   rG   rM   rQ   rS   rR   rT   rI   propertyr[   r^   r_   rh   rj   rl   rr   rv   rE   r   r   r   rP   r   r   r   r   r   4   sJ                
6	


'r   c              	   C   s(  t  }ttjrt|s$t|| |S tjddp4d }|rZt	rNt
| ||S t| ||S tjddkrvt|| |S t	stjdrt
| d|S ttdrtd	d
krt| d|S d
dl}| \}}t| zBttdrtd|d
krt| d|W S t|| |W S t| X dS )z2Decide what method to use for paging through text.ZPAGERNr#   TERM)ZdumbZemacsZos2zmore <systemz(less) 2>/dev/nullr   lessz	more "{}"Zmore)r   r   sysstdin
_nullpagerosenvirongetstripr   _tempfilepager
_pipepagerplatform
startswithhasattrr   tempfilemkstempcloseunlinkrc   )rP   r/   stdoutZ	pager_cmdr   fdfilenamer   r   r   pagerF  s,    
"r   c           
   	   C   s"  ddl }ttj}|ddd  }|dkr|d dkrdtjdd	d
|dd }|spd|d< d}nd|ksd|krd}|j	|d|j
|d}t|j}z.| D ]$}	|st|	}	|j|	|d qW n ttfk
r   Y nX |j  z|  W n tk
r   Y qX qqd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   -RTrR)shellr   envreplace)
subprocessdictr   r   rsplitsplitrc   r   rp   PopenPIPEr   r   r
   rU   encodeIOErrorKeyboardInterruptr   wait)
rP   cmdr/   r   r   Z
cmd_detailZ
less_flagscencodingtextr   r   r   r   c  s2    
$

r   c              	   C   s   ddl }| }d| }|s&t|}ttj}t|dd }||	| W 5 Q R X zt
d|| W 5 t
| X dS )z<Page through text by invoking a program on a temporary file.r   Nr#   wb{} "{}")r   mktemprp   r
   r   r   r   r   rU   r   r   r   r   rc   )rP   r   r/   r   r   r   r   fr   r   r   r     s    

r   c                 C   s$   |D ]}|st |}| | qdS )z>Simply print unformatted text.  This is the ultimate fallback.N)r
   rU   )streamrP   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 rH   )editorr   require_save	extension)rB   r   r   r   r   r   r   r   rD     s    zEditor.__init__c                 C   sd   | j d k	r| j S dD ]}tj|}|r|  S qtr:dS dD ] }td|dkr>|  S q>dS )N)ZVISUALZEDITORZnotepad)zsensible-editorZvimZnanozwhich {} >/dev/null 2>&1r   vi)r   r   r   r   r   r   rc   )rB   keyr   r   r   r   r   
get_editor  s    


zEditor.get_editorc              
   C   s   dd l }|  }| jr.tj }|| j nd }z:|jd|||dd}|	 }|dkrjt
d|W n2 tk
r } zt
d||W 5 d }~X Y nX d S )Nr   r   T)r   r   z{}: Editing failed!z{}: Editing failed: {})r   r   r   r   r   copyr   r   rc   r   r   OSError)rB   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&|ds&|d7 }|jd| jd\}}ztrRd}|dd}nd}||}t	|d	}|
| |  tj|}| | | jrtj||krW <d S t|d
}z| }W 5 |  X |dddW S t| X d S )Nr   r#   r   zeditor-)prefixsuffixz	utf-8-sigz
zutf-8r   rb)r   endswithr   r   r   r   r   r   r   fdopenrU   r   pathgetmtimer   r   openreaddecode)	rB   r   r   r   namer   r   	timestampr   r   r   r   edit  s0    




zEditor.edit)NNTr   )r   r   r   rD   r   r   r   r   r   r   r   r     s   
r   Fc           	      C   s  dd l }dd }tjdkrxdg}|r.|d |r<|d |||  tdd	}z|j||d
 W S |  X ntr|r|| } d	|| 
dd}nd	|rdnd| 
dd}t|S tr|r|| } d	tj| 
dd}nd	|rdnd| 
dd}t|S zJ|r<tj|| p8d} n|| } |d| g}|rb| W S W dS  tk
r   | dr|s|sdd l}||  Y dS Y dS X d S )Nr   c                 S   sJ   zdd l }W n tk
r(   dd l }Y nX | drF|| dd  } | S )Nr   zfile://   )urllibImportErrorr   unquote)urlr   r   r   r   _unquote_file  s    
zopen_url.<locals>._unquote_filedarwinr   z-Wr   z	/dev/nullw)stderrzexplorer /select,"{}""r#   zstart {} "" "{}"z/WAITzcygstart "{}"zcygstart {} "{}"z-w.zxdg-open)zhttp://zhttps://r   )r   r   r   rt   r   r   r   r   r   rc   r   r   r   r   r   dirnamer   r   
webbrowser)	r   r   Zlocater   r   argsnullr   r   r   r   r   open_url  sT    	




 




r   c                 C   s6   | dkrt  | dkr ts t | dkr2tr2t d S )N)r   r   EOFError)chr   r   r   _translate_ch_to_exc5  s    r   c                   c   s
   d V  d S rH   r   r   r   r   r   raw_terminalA  s    r   c                 C   s6   | rt j}nt j}| }|dkr*|| 7 }t| |S )N)    à)msvcrtZgetwchegetwchr   )r   funcr   r   r   r   getcharE  s    
r   c                  c   s   t tjstd} |  }ntj }d } zPt|}zt| |V  W 5 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	tcsetattr	TCSADRAINr   rW   r   ttyZsetrawerror)r   r   Zold_settingsr   r   r   r   u  s     






c              
   C   sb   t  R}t|d}|ttjd}| r@ttjr@tj	| t
| |W  5 Q R  S Q R X d S )N    r   )r   r   r   r   r   r   r   r   r   rU   r   )r   r   r   r   r   r   r     s    )N)FF)(__doc__
contextlibrn   r   r   r7   _compatr   r   r   r   r   r   r	   r
   r   r   
exceptionsr   utilsr   r   rz   rV   r   objectr   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r   r   r   <module>   sV   
  
1L
;	

-
