o
    [hP                     @   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rhd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rddl"Z"ej#d(d) Z$d*d+ Z%dS 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yG   zt| j}W n ty    Y Y dS w z|| }W n ty2   Y Y dS w |tu s@t|tr@|dk rCY dS | Y S w )z%Returns the length hint of an object.Nr   )lenAttributeError	TypeErrortype__length_hint__NotImplemented
isinstancer   )objZget_hinthint r   y/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/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  || _ || _|| _|| _|| _|| _|	| _|
| _|pd| _|d u r$t	 }|| _
|| _|| _|dk| _|d u r:t|}|d u rJ|d u rFtdt|}t|| _|| _|d u| _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iterabler4   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r   r   r   __init__5   sF   




zProgressBar.__init__c                 C   s   d| _ |   | S )NT)r>   render_progressrC   r   r   r   	__enter__k   s   zProgressBar.__enter__c                 C   s   |    d S N)render_finish)rC   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>   RuntimeErrorrF   	generatorrG   r   r   r   __iter__s   s   zProgressBar.__iter__c                 C   s   t t| S rI   )nextr3   rG   r   r   r   __next__y   s   zProgressBar.__next__c                 C   s   t   | j | jkS rI   )r8   r9   rB   rG   r   r   r   is_fast   s   zProgressBar.is_fastc                 C   s,   | j s|  r	d S | jt | j  d S rI   )r@   rU   r/   write	AFTER_BARflushrG   r   r   r   rJ      s   zProgressBar.render_finishc                 C   s$   | j rdS t| jt| jpd dS )N      ?r   )r<   minr6   floatr4   rG   r   r   r   pct   s   zProgressBar.pctc                 C   s"   | j sdS t| j tt| j  S Ng        )r7   sumr[   r   rG   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]   )r5   r<   r_   r4   r6   rG   r   r   r   eta   s   zProgressBar.etac                 C   sj   | j r3t| j}|d }|d }|d }|d }|d }|d }|dkr,d||||S d|||S dS )N<      r   z{}d {:02}:{:02}:{:02}z{:02}:{:02}:{:02}r$   )r;   intr`   format)rC   tsecondsminuteshoursr   r   r   
format_eta   s   
zProgressBar.format_etac                 C   s$   t | j}| jr|d| j7 }|S )Nz/{})strr6   r5   rd   r4   )rC   r6   r   r   r   
format_pos   s   
zProgressBar.format_posc                 C   s   d t| jd dd  S )Nz{: 4}%d   r   )rd   rc   r\   rG   r   r   r   
format_pct   s   zProgressBar.format_pctc                 C   s   | j rt| j| j }| j| }|| j| j|  7 }|S | jr'| j| j }|S t| j| jp.d }| jdkrK| j|tt	
| j| j d d | j < d|}|S )Nr   r   g       @r%   r$   )r5   rc   r\   r1   r&   r'   r<   listr_   mathcosr6   join)rC   Z
bar_lengthbarr   r   r   
format_bar   s(   


zProgressBar.format_barc                 C   s   | j }g }| jr|d u r| j }| jr||   |r#||   | jr3| jr3| js3|| 	  | j
d urG| 
| j}|d urG|| | j| j|  | j|d  S )N)r.   rr   info)r+   r5   r,   appendrk   rm   r*   r;   r<   ri   r-   r?   r(   r.   rs   r)   rq   rstrip)rC   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r=| j}d| _t|  }td| d | }||k r:|t	 |d| j
  || _
|| _| j}| j
d urH| j
}|t	 |  }t|}| j
d u s_| j
|k rb|| _
|| |d||   d|}|| jkr|  s|| _t|| j| jdd | j  d S d S d S )Nr   )get_terminal_sizer   r    r$   F)r/   r0   nl)Ztermuirx   r@   r2   r1   r   rw   maxru   
BEFORE_BARr=   rq   rA   rU   r   r/   r0   rX   )	rC   rx   bufZ	old_widthZclutter_lengthZ	new_widthZclear_widthlineline_lenr   r   r   rF      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 r1t | j | j  }nt | j }| jdd  |g | _| j| _d S )NTrY   i)	r6   r5   r4   r<   r8   r:   r9   r7   r;   )rC   n_stepsstepr   r   r   	make_step  s   
zProgressBar.make_stepc                 C   s   |  | |   d S rI   )r   rF   )rC   r   r   r   r   update"  s   
zProgressBar.updatec                 C   s   d| _ d | _d| _d S )Nr   T)r;   r?   r<   rG   r   r   r   finish&  s   
zProgressBar.finishc                 c   sb    | j std| jr| jD ]}|V  qdS | 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.
        rO   r   N)r>   rP   r@   r3   r?   r   r   rF   )rC   rvr   r   r   rQ   +  s   

zProgressBar.generator)Nr   r    r!   r"   TNFNNNNr#   )__name__
__module____qualname__rE   rH   rN   rR   rT   rS   rU   rJ   propertyr\   r_   r`   ri   rk   rm   rs   rw   rF   r   r   r   rQ   r   r   r   r   r   4   sL    
6	


'r   c              	   C   s0  t  }ttjrt|st|| |S tjddpd }|r-t	r't
| ||S t| ||S tjddv r;t|| |S t	sCtjdrIt
| d|S ttdr[td	d
kr[t| d|S d
dl}| \}}t| z'ttdrtd|d
krt| d|W t| S t|| |W t| S t| w )z2Decide what method to use for paging through text.ZPAGERNr$   TERM)dumbemacsZos2zmore <systemz(less) 2>/dev/nullr   lessz	more "{}"more)r   r   sysstdin
_nullpagerosenvirongetstripr   _tempfilepager
_pipepagerplatform
startswithhasattrr   tempfilemkstempcloserd   unlink)rQ   r0   stdoutZ	pager_cmdr   fdfilenamer   r   r   pagerF  s.   
r   c           
   	   C   s  ddl }ttj}|ddd  }|du rB|d dkrBdtjdd	d
|dd }|s8d|d< d}n
d|v s@d|v rBd}|j	|d|j
|d}t|j}z| D ]}	|s\t|	}	|j|	|d qTW n ttfys   Y nw |j  	 z|  W dS  ty   Y nw qz)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splitrd   r   rq   PopenPIPEr   r   r
   rV   encodeIOErrorKeyboardInterruptr   wait)
rQ   cmdr0   r   r   Z
cmd_detailZ
less_flagscencodingtextr   r   r   r   c  s<   
$



r   c              	   C   s   ddl }| }d| }|st|}ttj}t|dd }||	| W d   n1 s2w   Y  zt
d|| W t
| dS t
| w )z<Page through text by invoking a program on a temporary file.r   Nr$   wb{} "{}")r   mktemprq   r
   r   r   r   r   rV   r   r   r   rd   r   )rQ   r   r0   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
   rV   )streamrQ   r0   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 rI   )editorr   require_save	extension)rC   r   r   r   r   r   r   r   rE     s   
zEditor.__init__c                 C   sd   | j d u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-editorvimZnanozwhich {} >/dev/null 2>&1r   vi)r   r   r   r   r   r   rd   )rC   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r5t
d|W d S  tyK } zt
d||d }~ww )Nr   r   T)r   r   z{}: Editing failed!z{}: Editing failed: {})r   r   r   r   r   copyr   r   rd   r   r   OSError)rC   r   r   r   r   r   	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\}}zctr)d}|dd}nd}||}t|d	}|	| |
  tj|}| | | jr]tj||kr]W t| d S t|d
}z
| }W |
  n|
  w |dddW t| S t| w )Nr   r$   r   zeditor-)prefixsuffixz	utf-8-sigz
zutf-8r   rb)r   endswithr   r   r   r   r   r   fdopenrV   r   pathgetmtimer   r   r   openreaddecode)	rC   r   r   r   namer   r   	timestampr   r   r   r   edit  s2   


	

zEditor.edit)NNTr   )r   r   r   rE   r   r   r   r   r   r   r   r     s
    
r   Fc           	      C   s  dd l }dd }tjdkr>dg}|r|d |r|d |||  tdd	}z|j||d
 W |  S |  w tre|rR|| } d	|| 
dd}nd	|rXdnd| 
dd}t|S tr|r{|| } d	tj| 
dd}nd	|rdnd| 
dd}t|S z"|rtj|| pd} n|| } |d| g}|r| W S W dS  ty   | dr|s|sdd l}||  Y dS Y dS w )Nr   c                 S   sH   zdd l }W n ty   dd l }Y nw | dr"|| 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   ru   r   r   r   r   r   rd   r   r   r   r   r   dirnamer   r   
webbrowser)	r   r   locater   r   argsnullr   r   r   r   r   open_url  sT   
	






r   c                 C   s:   | dkrt  | dkrtst | dkrtrt d S d S )N)r   r   EOFError)chr   r   r   _translate_ch_to_exc5  s   r   c                   c   s    d V  d S rI   r   r   r   r   r   raw_terminalA  s   
r   c                 C   s6   | rt j}nt j}| }|dv 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 } zAt|}z$t| |V  W t	|tj
| tj  | d ur>|   W d S W d S t	|tj
| tj  | d urW|   w w  tjyb   Y d S w )Nz/dev/tty)r   r   r   r   filenotermios	tcgetattrttyZsetraw	tcsetattr	TCSADRAINr   rX   r   error)r   r   Zold_settingsr   r   r   r   u  s0   







c                 C   sn   t  *}t|d}|ttjd}| r ttjr tj	| t
| |W  d    S 1 s0w   Y  d S )N    r   )r   r   r   r   r   r   r   r   r   rV   r   )r   r   r   r   r   r   r     s   $rI   )FF)(__doc__
contextlibro   r   r   r8   Z_compatr   r   r   r   r   r   r	   r
   r   r   
exceptionsr   utilsr   r   r{   rW   r   objectr   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r   r   r   <module>   sX   
  
1
L;	
-
