U
    å7ÚcW6  ã                   @   sx  d dl mZm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	m
Z
mZ d dlmZ d dlmZmZ d dlmZmZ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rÐd dlmZm Z m!Z! zd dlm"Z" W n e#k
rø   dZ"Y nX e $e%¡Z&dd„ Z'e'eeƒZ(G dd„ de)ƒZ*G dd„ deƒZ+G dd„ deƒZ,G dd„ de)ƒZ-G dd„ de)ƒZ.G dd„ de.e*e-ƒZ/G dd„ de/e(ƒZ0G dd„ de/e+ƒZ1G d d!„ d!e/eƒZ2G d"d#„ d#e/eƒZ3G d$d%„ d%e/e,ƒZ4G d&d'„ d'e.e*e-eƒZ5e1e1fe0e5fe2e5fe3e5fe4e5fd(œZ6d7d)d*„Z7ej8d+d,„ ƒZ9G d-d.„ d.e)ƒZ:G d/d0„ d0e)ƒZ;G d1d2„ d2e;ƒZ<G d3d4„ d4e;ƒZ=ej8d5d6„ ƒZ>dS )8é    )Úabsolute_importÚdivisionN)ÚSIGINTÚdefault_int_handlerÚsignal)Úsix)ÚHIDE_CURSORÚSHOW_CURSOR)ÚBarÚFillingCirclesBarÚIncrementalBar)ÚSpinner)ÚWINDOWS)Úget_indentation)Úformat_size)ÚMYPY_CHECK_RUNNING)ÚAnyÚIteratorÚIO)Úcoloramac                 C   s„   t | jdd ƒ}|s|S t | dt ¡ ƒt | dt ¡ ƒg}|tt | dg ƒƒ7 }zt ¡  |¡ |¡ W n tk
rz   | Y S X | S d S )NÚencodingÚ
empty_fillÚfillÚphases)ÚgetattrÚfiler   Ú	text_typeÚlistÚjoinÚencodeÚUnicodeEncodeError)Ú	preferredÚfallbackr   Ú
characters© r$   ú:/tmp/pip-unpacked-wheel-xvghy_sv/pip/_internal/utils/ui.pyÚ_select_progress_class%   s    þ
r&   c                       s4   e Zd ZdZ‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚInterruptibleMixinaÂ  
    Helper to ensure that self.finish() gets called on keyboard interrupt.

    This allows downloads to be interrupted without leaving temporary state
    (like hidden cursors) behind.

    This class is similar to the progress library's existing SigIntMixin
    helper, but as of version 1.2, that helper has the following problems:

    1. It calls sys.exit().
    2. It discards the existing SIGINT handler completely.
    3. It leaves its own handler in place even after an uninterrupted finish,
       which will have unexpected delayed effects if the user triggers an
       unrelated keyboard interrupt some time after a progress-displaying
       download has already completed, for example.
    c                    s4   t t| ƒj||Ž tt| jƒ| _| jdkr0t| _dS )z=
        Save the original SIGINT handler for later.
        N)Úsuperr'   Ú__init__r   r   Úhandle_sigintÚoriginal_handlerr   ©ÚselfÚargsÚkwargs©Ú	__class__r$   r%   r)   U   s    
zInterruptibleMixin.__init__c                    s   t t| ƒ ¡  tt| jƒ dS )z½
        Restore the original SIGINT handler after finishing.

        This should happen regardless of whether the progress display finishes
        normally, or gets interrupted.
        N)r(   r'   Úfinishr   r   r+   ©r-   r0   r$   r%   r2   e   s    zInterruptibleMixin.finishc                 C   s   |   ¡  |  ||¡ dS )z²
        Call self.finish() before delegating to the original SIGINT handler.

        This handler should only be in place while the progress display is
        active.
        N)r2   r+   )r-   ÚsignumÚframer$   r$   r%   r*   o   s    z InterruptibleMixin.handle_sigint)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r2   r*   Ú__classcell__r$   r$   r0   r%   r'   C   s   
r'   c                   @   s   e Zd Zdd„ ZdS )Ú	SilentBarc                 C   s   d S ©Nr$   r3   r$   r$   r%   Úupdate|   s    zSilentBar.updateN)r6   r7   r8   r=   r$   r$   r$   r%   r;   z   s   r;   c                   @   s   e Zd ZdZdZdZdZdS )ÚBlueEmojiBarú%(percent)d%%ú )u   ðŸ”¹u   ðŸ”·u   ðŸ”µN)r6   r7   r8   ÚsuffixÚ
bar_prefixÚ
bar_suffixr   r$   r$   r$   r%   r>   €   s   r>   c                       sH   e Zd Z‡ fdd„Zedd„ ƒZedd„ ƒZedd„ ƒZd	d
„ Z‡  Z	S )ÚDownloadProgressMixinc                    s,   t t| ƒj||Ž dtƒ d  | j | _d S )Nr@   é   )r(   rD   r)   r   Úmessager,   r0   r$   r%   r)   Š   s    zDownloadProgressMixin.__init__c                 C   s
   t | jƒS r<   )r   Úindexr3   r$   r$   r%   Ú
downloadedŽ   s    z DownloadProgressMixin.downloadedc                 C   s    | j dkrdS td| j  ƒd S )Ng        z...é   z/s)Úavgr   r3   r$   r$   r%   Údownload_speed’   s    
z$DownloadProgressMixin.download_speedc                 C   s   | j rd| j S dS )Nzeta %sÚ )ÚetaÚeta_tdr3   r$   r$   r%   Ú
pretty_eta™   s    
z DownloadProgressMixin.pretty_etac                 c   s*   |D ]}|V  |   t|ƒ¡ q|  ¡  d S r<   )ÚnextÚlenr2   )r-   ÚitÚxr$   r$   r%   ÚiterŸ   s    zDownloadProgressMixin.iter)
r6   r7   r8   r)   ÚpropertyrH   rK   rO   rT   r:   r$   r$   r0   r%   rD   ˆ   s   


rD   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚWindowsMixinc                    s\   t rˆ jrdˆ _ttˆ ƒj||Ž t rXtrXt ˆ j¡ˆ _‡ fdd„ˆ j_‡ fdd„ˆ j_	d S )NFc                      s   ˆ j j ¡ S r<   )r   ÚwrappedÚisattyr$   r3   r$   r%   Ú<lambda>¼   ó    z'WindowsMixin.__init__.<locals>.<lambda>c                      s   ˆ j j ¡ S r<   )r   rW   Úflushr$   r3   r$   r%   rY   À   rZ   )
r   Úhide_cursorr(   rV   r)   r   ÚAnsiToWin32r   rX   r[   r,   r0   r3   r%   r)   ¨   s    
zWindowsMixin.__init__)r6   r7   r8   r)   r:   r$   r$   r0   r%   rV   ¦   s   rV   c                   @   s   e Zd ZejZdZdZdS )ÚBaseDownloadProgressBarr?   z0%(downloaded)s %(download_speed)s %(pretty_eta)sN)r6   r7   r8   ÚsysÚstdoutr   rF   rA   r$   r$   r$   r%   r^   Ã   s   r^   c                   @   s   e Zd ZdS )ÚDefaultDownloadProgressBarN©r6   r7   r8   r$   r$   r$   r%   ra   Î   s   ra   c                   @   s   e Zd ZdS )ÚDownloadSilentBarNrb   r$   r$   r$   r%   rc   Ó   s   rc   c                   @   s   e Zd ZdS )ÚDownloadBarNrb   r$   r$   r$   r%   rd   ×   s   rd   c                   @   s   e Zd ZdS )ÚDownloadFillingCirclesBarNrb   r$   r$   r$   r%   re   Ü   s   re   c                   @   s   e Zd ZdS )ÚDownloadBlueEmojiProgressBarNrb   r$   r$   r$   r%   rf   á   s   rf   c                   @   s&   e Zd ZejZdZdd„ Zdd„ ZdS )ÚDownloadProgressSpinnerz!%(downloaded)s %(download_speed)sc                 C   s"   t | dƒst | j¡| _t| jƒS )NÚ_phaser)ÚhasattrÚ	itertoolsÚcycler   rh   rP   r3   r$   r$   r%   Ú
next_phaseì   s    
z"DownloadProgressSpinner.next_phasec                 C   sN   | j |  }|  ¡ }| j|  }d ||r*dnd||r6dnd|g¡}|  |¡ d S )NrL   r@   )rF   rl   rA   r   Úwriteln)r-   rF   ÚphaserA   Úliner$   r$   r%   r=   ñ   s    



ûzDownloadProgressSpinner.updateN)	r6   r7   r8   r_   r`   r   rA   rl   r=   r$   r$   r$   r%   rg   æ   s   rg   )ÚoffÚonÚasciiÚprettyÚemojic                 C   s8   |d ks|dkr t |  d ƒ jS t |  d |djS d S )Nr   rI   )Úmax)Ú	BAR_TYPESrT   )Úprogress_barru   r$   r$   r%   ÚDownloadProgressProvider	  s    rx   c              	   c   sP   t rd V  n@|  ¡ r"t ¡ tjkr*d V  n"|  t¡ z
d V  W 5 |  t¡ X d S r<   )	r   rX   ÚloggerÚgetEffectiveLevelÚloggingÚINFOÚwriter   r	   )r   r$   r$   r%   Úhidden_cursor  s    

r~   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚRateLimiterc                 C   s   || _ d| _d S )Nr   )Ú_min_update_interval_secondsÚ_last_update)r-   Úmin_update_interval_secondsr$   r$   r%   r)   -  s    zRateLimiter.__init__c                 C   s   t   ¡ }|| j }|| jkS r<   )Útimer   r€   )r-   ÚnowÚdeltar$   r$   r%   Úready2  s    
zRateLimiter.readyc                 C   s   t   ¡ | _d S r<   )rƒ   r   r3   r$   r$   r%   Úreset8  s    zRateLimiter.resetN)r6   r7   r8   r)   r†   r‡   r$   r$   r$   r%   r   ,  s   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚSpinnerInterfacec                 C   s
   t ƒ ‚d S r<   ©ÚNotImplementedErrorr3   r$   r$   r%   Úspin>  s    zSpinnerInterface.spinc                 C   s
   t ƒ ‚d S r<   r‰   ©r-   Úfinal_statusr$   r$   r%   r2   B  s    zSpinnerInterface.finishN)r6   r7   r8   r‹   r2   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 )ÚInteractiveSpinnerNú-\|/ç      À?c                 C   s\   || _ |d krtj}|| _t|ƒ| _d| _t |¡| _	| j 
dtƒ  | j  d ¡ d| _d S )NFr@   z ... r   )Ú_messager_   r`   Ú_filer   Ú_rate_limiterÚ	_finishedrj   rk   Ú_spin_cycler}   r   Ú_width)r-   rF   r   Ú
spin_charsr‚   r$   r$   r%   r)   H  s    
zInteractiveSpinner.__init__c                 C   s\   | j r
t‚d| j }| j |d| j  | ¡ | j |¡ t|ƒ| _| j ¡  | j ¡  d S )Núr@   )	r”   ÚAssertionErrorr–   r’   r}   rQ   r[   r“   r‡   )r-   ÚstatusÚbackupr$   r$   r%   Ú_writeW  s    



zInteractiveSpinner._writec                 C   s,   | j r
d S | j ¡ sd S |  t| jƒ¡ d S r<   )r”   r“   r†   rœ   rP   r•   r3   r$   r$   r%   r‹   c  s
    
zInteractiveSpinner.spinc                 C   s4   | j r
d S |  |¡ | j d¡ | j ¡  d| _ d S )NÚ
T)r”   rœ   r’   r}   r[   rŒ   r$   r$   r%   r2   k  s    

zInteractiveSpinner.finish)Nr   r   )r6   r7   r8   r)   rœ   r‹   r2   r$   r$   r$   r%   rŽ   G  s     þ
rŽ   c                   @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )ÚNonInteractiveSpinneré<   c                 C   s$   || _ d| _t|ƒ| _|  d¡ d S )NFÚstarted)r‘   r”   r   r“   Ú_update)r-   rF   r‚   r$   r$   r%   r)   z  s    
zNonInteractiveSpinner.__init__c                 C   s(   | j r
t‚| j ¡  t d| j|¡ d S )Nz%s: %s)r”   r™   r“   r‡   ry   Úinfor‘   )r-   rš   r$   r$   r%   r¡     s    

zNonInteractiveSpinner._updatec                 C   s&   | j r
d S | j ¡ sd S |  d¡ d S )Nzstill running...)r”   r“   r†   r¡   r3   r$   r$   r%   r‹   †  s
    
zNonInteractiveSpinner.spinc                 C   s$   | j r
d S |  d|f ¡ d| _ d S )Nzfinished with status '%s'T)r”   r¡   rŒ   r$   r$   r%   r2   Ž  s    zNonInteractiveSpinner.finishN)rŸ   )r6   r7   r8   r)   r¡   r‹   r2   r$   r$   r$   r%   rž   y  s   
rž   c              	   c   s˜   t j ¡ r"t ¡ tjkr"t| ƒ}nt| ƒ}z t	t jƒ |V  W 5 Q R X W n> t
k
rj   | d¡ ‚ Y n* tk
rˆ   | d¡ ‚ Y nX | d¡ d S )NÚcanceledÚerrorÚdone)r_   r`   rX   ry   rz   r{   r|   rŽ   rž   r~   ÚKeyboardInterruptr2   Ú	Exception)rF   Úspinnerr$   r$   r%   Úopen_spinner–  s    


r©   )N)?Ú
__future__r   r   Ú
contextlibrj   r{   r_   rƒ   r   r   r   Úpip._vendorr   Zpip._vendor.progressr   r	   Úpip._vendor.progress.barr
   r   r   Úpip._vendor.progress.spinnerr   Úpip._internal.utils.compatr   Úpip._internal.utils.loggingr   Úpip._internal.utils.miscr   Úpip._internal.utils.typingr   Útypingr   r   r   r   r§   Ú	getLoggerr6   ry   r&   Ú_BaseBarÚobjectr'   r;   r>   rD   rV   r^   ra   rc   rd   re   rf   rg   rv   rx   Úcontextmanagerr~   r   rˆ   rŽ   rž   r©   r$   r$   r$   r%   Ú<module>   s~   


7ÿÿÿÿÿ ÿû	


2