a
    ýÓEbVŒ  ã                   @   s$  d dl mZmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z" d
dl#m$Z$m%Z% d
dl&m'Z'm(Z(m)Z)m*Z* d
dl+m,Z, d
dl-m.Z. d
dl/m0Z0 d
dl1m2Z2 d
dl3m4Z4 d
dl5m6Z6 d
dl7m8Z8m9Z9 d
dl:m;Z;m<Z< ede=ƒZ>e!dƒZ?eg e@f ZAG dd„ deƒZBdie"ee? ee? f eCee@ eDee' eDeeg e@f  e@e6e6e6e6e@eDee? d#œd$d%„ZEG d&d'„ d'eƒZFG d(d)„ d)eFƒZGG d*d+„ d+eFƒZHG d,d-„ d-eFƒZIG d.d/„ d/eFƒZJG d0d1„ d1eFƒZKG d2d3„ d3eFƒZLG d4d5„ d5eFƒZMG d6d7„ d7eFƒZNG d8d9„ d9eFƒZOG d:d;„ d;eFƒZPG d<d=„ d=eƒZQeG d>d?„ d?ƒƒZRG d@dA„ dAe.ƒZSeTdBk�r d dlUZUd dlVZVd
dClWmXZX d
dDlYmZZZ d
dEl[m\Z\ d
dFl7m9Z9 e\dGdHddI�Z[e9dJdKdLƒZ7e7 ]dMdNdO¡ dPeXdQƒdRe7dSdTdUdVœdWe[eZdXƒg	Z^d dYl_m`Z` e`e^ƒZae'ddZ�Z&eSeHƒ eId[ƒeJƒ eId\ƒeLƒ eKƒ e&dd]��ŽZbebjcd^d_d`�Zdebjcdad_d`�Zeebjcdbd_ddc�Zfebjg�s ebjhedddde� ebjheedfde� eV idg¡ eU jd dh¡d
k �r®eb keleaƒ¡ �q®W d  ƒ n1 �s0    Y  dS )jé    )ÚABCÚabstractmethod)Údeque)ÚSized)Ú	dataclassÚfield)Ú	timedelta)Úceil)ÚEventÚRLockÚThread)ÚTracebackType)ÚAnyÚCallableÚDequeÚDictÚIterableÚListÚ
NamedTupleÚNewTypeÚOptionalÚSequenceÚTupleÚTypeÚTypeVarÚUnioné   )ÚfilesizeÚget_console)ÚConsoleÚJustifyMethodÚRenderableTypeÚGroup)ÚHighlighter)ÚJupyterMixin)ÚLive)ÚProgressBar)ÚSpinner)Ú	StyleType)ÚColumnÚTable)ÚTextÚTextTypeÚTaskIDÚProgressTypec                       sj   e Zd ZdZddedœ‡ fdd„Zddœd	d
„Zd dœdd„Zee	e
  ee
 ee ddœdd„Z‡  ZS )Ú_TrackThreadz)A thread to periodically update progress.ÚProgressr-   )ÚprogressÚtask_idÚupdate_periodc                    s.   || _ || _|| _tƒ | _d| _tƒ  ¡  d S )Nr   )r1   r2   r3   r
   ÚdoneÚ	completedÚsuperÚ__init__)Úselfr1   r2   r3   ©Ú	__class__© úY/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/pip/_vendor/rich/progress.pyr7   /   s    z_TrackThread.__init__N©Úreturnc                 C   sd   | j }| jj}| j}d}| jj}||ƒsJ| j}||kr |||| ƒ |}q | jj| j | jdd� d S )Nr   T)r5   Úrefresh)r2   r1   Úadvancer3   r4   Úwaitr5   Úupdate)r8   r2   r@   r3   Zlast_completedrA   r5   r;   r;   r<   Úrun8   s    z_TrackThread.runc                 C   s   |   ¡  | S ©N©Ústart©r8   r;   r;   r<   Ú	__enter__F   s    z_TrackThread.__enter__©Úexc_typeÚexc_valÚexc_tbr>   c                 C   s   | j  ¡  |  ¡  d S rD   )r4   ÚsetÚjoin©r8   rJ   rK   rL   r;   r;   r<   Ú__exit__J   s    
z_TrackThread.__exit__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úfloatr7   rC   rH   r   r   ÚBaseExceptionr   rP   Ú__classcell__r;   r;   r9   r<   r/   ,   s   	
ûr/   ú
Working...NTFé
   úbar.backúbar.completeúbar.finishedú	bar.pulseçš™™™™™¹?)ÚsequenceÚdescriptionÚtotalÚauto_refreshÚconsoleÚ	transientÚget_timeÚrefresh_per_secondÚstyleÚcomplete_styleÚfinished_styleÚpulse_styler3   Údisabler>   c              	   c   s�   |rt dƒgng }| t||	|
|d�t dƒtƒ f¡ t||||||pFd|dœŽ}|�( |j| |||d�E dH  W d  ƒ n1 s‚0    Y  dS )a�  Track progress by iterating over a sequence.

    Args:
        sequence (Iterable[ProgressType]): A sequence (must support "len") you wish to iterate over.
        description (str, optional): Description of task show next to progress bar. Defaults to "Working".
        total: (float, optional): Total number of steps. Default is len(sequence).
        auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True.
        transient: (bool, optional): Clear the progress on exit. Defaults to False.
        console (Console, optional): Console to write to. Default creates internal Console instance.
        refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10.
        style (StyleType, optional): Style for the bar background. Defaults to "bar.back".
        complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete".
        finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done".
        pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse".
        update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1.
        disable (bool, optional): Disable display of progress.
    Returns:
        Iterable[ProgressType]: An iterable of the values in the sequence.

    ú([progress.description]{task.description})rg   rh   ri   rj   ú-[progress.percentage]{task.percentage:>3.0f}%rY   )rb   rc   rd   re   rf   rk   )ra   r`   r3   N)Ú
TextColumnÚextendÚ	BarColumnÚTimeRemainingColumnr0   Útrack)r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   r3   rk   Úcolumnsr1   r;   r;   r<   rr   T   s4    &ÿüøÿù
ÿrr   c                   @   sj   e Zd ZU dZdZee ed< dee ddœdd„Z	edœdd	„Z
d
edœdd„Zed
edœdd„ƒZdS )ÚProgressColumnz3Base class for a widget to use in progress display.NÚmax_refresh)Útable_columnr>   c                 C   s   || _ i | _d | _d S rD   )Ú_table_columnÚ_renderable_cacheZ_update_time)r8   rv   r;   r;   r<   r7   �   s    zProgressColumn.__init__r=   c                 C   s   | j p
tƒ S )z.Get a table column, used to build tasks table.)rw   r)   rG   r;   r;   r<   Úget_table_column¢   s    zProgressColumn.get_table_columnÚTask©Útaskr>   c                 C   sp   |  ¡ }| jdurR|jsRz| j|j \}}W n ty>   Y n0 || j |krR|S |  |¡}||f| j|j< |S )a  Called by the Progress object to return a renderable for the given task.

        Args:
            task (Task): An object containing information regarding the task.

        Returns:
            RenderableType: Anything renderable (including str).
        N)re   ru   r5   rx   ÚidÚKeyErrorÚrender)r8   r|   Úcurrent_timeÚ	timestampÚ
renderabler;   r;   r<   Ú__call__¦   s    	
zProgressColumn.__call__c                 C   s   dS )z"Should return a renderable object.Nr;   ©r8   r|   r;   r;   r<   r   ½   s    zProgressColumn.render)N)rQ   rR   rS   rT   ru   r   rU   Ú__annotations__r)   r7   ry   r!   rƒ   r   r   r;   r;   r;   r<   rt   ˜   s   
rt   c                       sD   e Zd ZdZdddœeee dœ‡ fdd„Zded	œd
d„Z‡  Z	S )ÚRenderableColumnz�A column to insert an arbitrary column.

    Args:
        renderable (RenderableType, optional): Any renderable. Defaults to empty string.
    Ú N©rv   )r‚   rv   c                   s   || _ tƒ j|d� d S ©Nrˆ   )r‚   r6   r7   )r8   r‚   rv   r9   r;   r<   r7   É   s    zRenderableColumn.__init__rz   r{   c                 C   s   | j S rD   )r‚   r„   r;   r;   r<   r   Ï   s    zRenderableColumn.render)r‡   )
rQ   rR   rS   rT   r!   r   r)   r7   r   rW   r;   r;   r9   r<   r†   Â   s    ÿÿÿr†   c                       sb   e Zd ZdZdeee eeee	 dœ‡ fdd	„Z
deee edd
œdd„Zdedœdd„Z‡  ZS )ÚSpinnerColumna‰  A column with a 'spinner' animation.

    Args:
        spinner_name (str, optional): Name of spinner animation. Defaults to "dots".
        style (StyleType, optional): Style of spinner. Defaults to "progress.spinner".
        speed (float, optional): Speed factor of spinner. Defaults to 1.0.
        finished_text (TextType, optional): Text used when task is finished. Defaults to " ".
    Údotsúprogress.spinnerç      ð?ú N)Úspinner_namerg   ÚspeedÚfinished_textrv   c                    s<   t |||d�| _t|tƒr$t |¡n|| _tƒ j|d� d S )N©rg   r�   rˆ   )	r'   ÚspinnerÚ
isinstanceÚstrr+   Úfrom_markupr‘   r6   r7   )r8   r�   rg   r�   r‘   rv   r9   r;   r<   r7   Ý   s    ÿýzSpinnerColumn.__init__)r�   Úspinner_styler�   r>   c                 C   s   t |||d�| _dS )a-  Set a new spinner.

        Args:
            spinner_name (str): Spinner name, see python -m rich.spinner.
            spinner_style (Optional[StyleType], optional): Spinner style. Defaults to "progress.spinner".
            speed (float, optional): Speed factor of spinner. Defaults to 1.0.
        r’   N)r'   r“   )r8   r�   r—   r�   r;   r;   r<   Úset_spinnerí   s    zSpinnerColumn.set_spinnerrz   r{   c                 C   s    |j r| jn| j | ¡ ¡}|S rD   )Úfinishedr‘   r“   r   re   )r8   r|   Útextr;   r;   r<   r   ü   s
    ÿýzSpinnerColumn.render)r‹   rŒ   r�   rŽ   N)rŒ   r�   )rQ   rR   rS   rT   r•   r   r(   rU   r,   r)   r7   r˜   r!   r   rW   r;   r;   r9   r<   rŠ   Ó   s,        úú  üûrŠ   c                	       sL   e Zd ZdZdeeeeee	 ee
 ddœ‡ fdd„Zd	ed
œdd„Z‡  ZS )rn   zA column containing text.ÚnoneÚleftTN)Útext_formatrg   ÚjustifyÚmarkupÚhighlighterrv   r>   c                    s:   || _ || _|| _|| _|| _tƒ j|p0tdd�d� d S )NT©Úno_wraprˆ   )r�   rž   rg   rŸ   r    r6   r7   r)   )r8   r�   rg   rž   rŸ   r    rv   r9   r;   r<   r7     s    	zTextColumn.__init__rz   r{   c                 C   sR   | j j|d�}| jr*tj|| j| jd�}nt|| j| jd�}| jrN| j |¡ |S )N©r|   )rg   rž   )	r�   ÚformatrŸ   r+   r–   rg   rž   r    Ú	highlight)r8   r|   Ú_textrš   r;   r;   r<   r     s    zTextColumn.render)r›   rœ   TNN)rQ   rR   rS   rT   r•   r(   r    Úboolr   r#   r)   r7   r+   r   rW   r;   r;   r9   r<   rn     s         ùørn   c                	       sL   e Zd ZdZdee eeeeee ddœ‡ fd	d
„Zde	dœdd„Z
‡  ZS )rp   a  Renders a visual progress bar.

    Args:
        bar_width (Optional[int], optional): Width of bar or None for full width. Defaults to 40.
        style (StyleType, optional): Style for the bar background. Defaults to "bar.back".
        complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete".
        finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.done".
        pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse".
    é(   rZ   r[   r\   r]   N)Ú	bar_widthrg   rh   ri   rj   rv   r>   c                    s0   || _ || _|| _|| _|| _tƒ j|d� d S r‰   )r©   rg   rh   ri   rj   r6   r7   )r8   r©   rg   rh   ri   rj   rv   r9   r;   r<   r7   .  s    	zBarColumn.__init__rz   r{   c                 C   sP   t td|jƒtd|jƒ| jdu r$dn
td| jƒ|j | ¡ | j| j| j	| j
d�	S )z&Gets a progress bar widget for a task.r   Nr   )	ra   r5   ÚwidthZpulseZanimation_timerg   rh   ri   rj   )r&   Úmaxra   r5   r©   Ústartedre   rg   rh   ri   rj   r„   r;   r;   r<   r   >  s    

÷zBarColumn.render)r¨   rZ   r[   r\   r]   N)rQ   rR   rS   rT   r   Úintr(   r)   r7   r&   r   rW   r;   r;   r9   r<   rp   #  s"         ùørp   c                   @   s    e Zd ZdZdedœdd„ZdS )ÚTimeElapsedColumnzRenders time elapsed.rz   r{   c                 C   sD   |j r|jn|j}|du r&tddd�S tt|ƒd�}tt|ƒdd�S )úShow time remaining.Nú-:--:--zprogress.elapsed©rg   ©Úseconds)r™   Úfinished_timeÚelapsedr+   r   r­   r•   )r8   r|   rµ   Údeltar;   r;   r<   r   P  s
    zTimeElapsedColumn.renderN©rQ   rR   rS   rT   r+   r   r;   r;   r;   r<   r®   M  s   r®   c                   @   s$   e Zd ZdZdZdedœdd„ZdS )rq   z!Renders estimated time remaining.ç      à?rz   r{   c                 C   s8   |j }|du rtddd�S tt|ƒd�}tt|ƒdd�S )r¯   Nr°   zprogress.remainingr±   r²   )Útime_remainingr+   r   r­   r•   )r8   r|   Ú	remainingZremaining_deltar;   r;   r<   r   _  s
    zTimeRemainingColumn.renderN)rQ   rR   rS   rT   ru   r+   r   r;   r;   r;   r<   rq   Y  s   rq   c                   @   s    e Zd ZdZdedœdd„ZdS )ÚFileSizeColumnzRenders completed filesize.rz   r{   c                 C   s   t  t|jƒ¡}t|dd�S )úShow data completed.zprogress.filesizer±   )r   Údecimalr­   r5   r+   ©r8   r|   Ú	data_sizer;   r;   r<   r   k  s    zFileSizeColumn.renderNr·   r;   r;   r;   r<   r»   h  s   r»   c                   @   s    e Zd ZdZdedœdd„ZdS )ÚTotalFileSizeColumnzRenders total filesize.rz   r{   c                 C   s   t  t|jƒ¡}t|dd�S )r¼   zprogress.filesize.totalr±   )r   r½   r­   ra   r+   r¾   r;   r;   r<   r   t  s    zTotalFileSizeColumn.renderNr·   r;   r;   r;   r<   rÀ   q  s   rÀ   c                       s@   e Zd ZdZdeee ddœ‡ fdd„Zdedœd	d
„Z	‡  Z
S )ÚDownloadColumnz¤Renders file size downloaded and total, e.g. '0.5/2.3 GB'.

    Args:
        binary_units (bool, optional): Use binary units, KiB, MiB etc. Defaults to False.
    FN)Úbinary_unitsrv   r>   c                    s   || _ tƒ j|d� d S r‰   )rÂ   r6   r7   )r8   rÂ   rv   r9   r;   r<   r7   �  s    zDownloadColumn.__init__rz   r{   c                 C   s¬   t |jƒ}t |jƒ}| jr2t |g d¢d¡\}}nt |g d¢d¡\}}|| }|| }|dkrddnd}|d|› d�›}	|d|› d�›}
|	› d	|
› d
|› �}t|dd�}|S )z.Calculate common unit for completed and total.)	ÚbytesZKiBZMiBZGiBZTiBZPiBZEiBZZiBZYiBi   )	rÃ   ZKBZMBZGBZTBZPBZEBZZBZYBéè  r   r   z,.Úfú/rŽ   zprogress.downloadr±   )r­   r5   ra   rÂ   r   Zpick_unit_and_suffixr+   )r8   r|   r5   ra   ZunitÚsuffixZcompleted_ratioÚtotal_ratioZ	precisionZcompleted_strZ	total_strZdownload_statusZdownload_textr;   r;   r<   r   ‡  s&    

ý

ÿzDownloadColumn.render)FN)rQ   rR   rS   rT   r§   r   r)   r7   r+   r   rW   r;   r;   r9   r<   rÁ   z  s    ÿþrÁ   c                   @   s    e Zd ZdZdedœdd„ZdS )ÚTransferSpeedColumnz&Renders human readable transfer speed.rz   r{   c                 C   s@   |j p
|j}|du r tddd�S t t|ƒ¡}t|› d�dd�S )zShow data transfer speed.Nú?zprogress.data.speedr±   z/s)Úfinished_speedr�   r+   r   r½   r­   )r8   r|   r�   Z
data_speedr;   r;   r<   r   ¢  s
    zTransferSpeedColumn.renderNr·   r;   r;   r;   r<   rÉ   Ÿ  s   rÉ   c                   @   s"   e Zd ZU dZeed< eed< dS )ÚProgressSamplez$Sample of progress for a given time.r�   r5   N)rQ   rR   rS   rT   rU   r…   r;   r;   r;   r<   rÌ   «  s   
rÌ   c                   @   sˆ  e Zd ZU dZeed< eed< eed< eed< eed< dZ	e
e ed< d	Zeed
< eed�Zeeef ed< edddd�Ze
e ed< edddd�Ze
e ed< dZe
e ed< eeddd�Zee ed< eded�Zeed< edœdd„Zeedœdd„ƒZeedœdd„ƒZee
e dœdd„ƒZeedœdd „ƒZ eedœd!d"„ƒZ!ee
e dœd#d$„ƒZ"ee
e dœd%d&„ƒZ#ddœd'd(„Z$dS ))rz   z…Information regarding a progress task.

    This object should be considered read-only outside of the :class:`~Progress` class.

    r}   r`   ra   r5   Ú	_get_timeNr´   TÚvisible)Údefault_factoryÚfieldsF)ÚdefaultÚinitÚreprÚ
start_timeÚ	stop_timerË   )rÏ   rÒ   rÓ   Ú	_progress)rÓ   rÏ   Ú_lockr=   c                 C   s   |   ¡ S )z(float: Get the current time, in seconds.)rÍ   rG   r;   r;   r<   re   ä  s    zTask.get_timec                 C   s
   | j duS )z#bool: Check if the task as started.N)rÔ   rG   r;   r;   r<   r¬   è  s    zTask.startedc                 C   s   | j | j S )z)float: Get the number of steps remaining.)ra   r5   rG   r;   r;   r<   rº   í  s    zTask.remainingc                 C   s2   | j du rdS | jdur$| j| j  S |  ¡ | j  S )z]Optional[float]: Time elapsed since task was started, or ``None`` if the task hasn't started.N)rÔ   rÕ   re   rG   r;   r;   r<   rµ   ò  s
    

zTask.elapsedc                 C   s
   | j duS )zCheck if the task has finished.N)r´   rG   r;   r;   r<   r™   û  s    zTask.finishedc                 C   s.   | j s
dS | j| j  d }tdtd|ƒƒ}|S )z,float: Get progress of task as a percentage.ç        ç      Y@)ra   r5   Úminr«   )r8   r5   r;   r;   r<   Ú
percentage   s
    zTask.percentagec                 C   s¬   | j du rdS | j�„ | j}|s0W d  ƒ dS |d j|d j }|dkr\W d  ƒ dS t|ƒ}t|ƒ tdd„ |D ƒƒ}|| }|W  d  ƒ S 1 sž0    Y  dS )z=Optional[float]: Get the estimated speed in steps per second.Néÿÿÿÿr   c                 s   s   | ]}|j V  qd S rD   )r5   )Ú.0Úsampler;   r;   r<   Ú	<genexpr>  ó    zTask.speed.<locals>.<genexpr>)rÔ   r×   rÖ   r�   ÚiterÚnextÚsum)r8   r1   Z
total_timeZiter_progressZtotal_completedr�   r;   r;   r<   r�   	  s    
z
Task.speedc                 C   s*   | j r
dS | j}|sdS t| j| ƒ}|S )zJOptional[float]: Get estimated time to completion, or ``None`` if no data.rØ   N)r™   r�   r	   rº   )r8   r�   Zestimater;   r;   r<   r¹     s    zTask.time_remainingc                 C   s   | j  ¡  d| _d| _dS )zReset progress.N)rÖ   Úclearr´   rË   rG   r;   r;   r<   Ú_reset&  s    
zTask._reset)%rQ   rR   rS   rT   r-   r…   r•   rU   ÚGetTimeCallabler´   r   rÎ   r§   r   ÚdictrÐ   r   r   rÔ   rÕ   rË   r   rÖ   r   rÌ   r   r×   re   Úpropertyr¬   rº   rµ   r™   rÛ   r�   r¹   rå   r;   r;   r;   r<   rz   ´  s@   
ÿ
rz   c                   @   sX  e Zd ZdZdddddddddddœ
eeef ee e	e
e
e	e	e	ee e	e	ddœd	d
„Zeedœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZee	dœdd„ƒZddœdd„Zddœdd„Zd dœdd„Zeee  ee ee ddœdd„ZdEeee ee f ee
 ee ee
ee dœd d!„Zedd"œd#d$„Z edd"œd%d&„Z!ddddddd'œeee
 ee
 ee
 ee ee	 e	e"dd(œ	d)d*„Z#ddd+ddd,œee	ee
 e$ee	 ee e"dd-œd.d/„Z%dFee
dd1œd2d3„Z&ddœd4d5„Z'e(dœd6d7„Z)ee( dœd8d9„Z*ee e+d:œd;d<„Z,e(dœd=d>„Z-dGee	e
e$e	e"ed@œdAdB„Z.edd"œdCdD„Z/dS )Hr0   a�  Renders an auto-updating progress bar(s).

    Args:
        console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout.
        auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`.
        refresh_per_second (Optional[float], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None.
        speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30.
        transient: (bool, optional): Clear the progress on exit. Defaults to False.
        redirect_stdout: (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True.
        redirect_stderr: (bool, optional): Enable redirection of stderr. Defaults to True.
        get_time: (Callable, optional): A callable that gets the current time, or None to use Console.get_time. Defaults to None.
        disable (bool, optional): Disable progress display. Defaults to False
        expand (bool, optional): Expand tasks table to fit width. Defaults to False.
    NTrY   g      >@F)
rc   rb   rf   Úspeed_estimate_periodrd   Úredirect_stdoutÚredirect_stderrre   rk   Úexpand)rs   rc   rb   rf   ré   rd   rê   rë   re   rk   rì   r>   c       
      	   G   s¦   |d u s|dksJ dƒ‚t ƒ | _|p:tdƒtƒ tdƒtƒ f| _|| _|	| _|
| _i | _	t
dƒ| _t|pjtƒ |||||| jd�| _|pŠ| jj| _| jj| _| jj| _d S )Nr   zrefresh_per_second must be > 0rl   rm   )rc   rb   rf   rd   rê   rë   Úget_renderable)r   r×   rn   rp   rq   rs   ré   rk   rì   Ú_tasksr-   Ú_task_indexr%   r   rí   Úliverc   re   ÚprintÚlog)r8   rc   rb   rf   ré   rd   rê   rë   re   rk   rì   rs   r;   r;   r<   r7   =  s<    ÿÿþü
ù	
zProgress.__init__r=   c                 C   s   | j jS rD   )rð   rc   rG   r;   r;   r<   rc   h  s    zProgress.consolec                 C   s8   | j � t| j ¡ ƒW  d  ƒ S 1 s*0    Y  dS )zGet a list of Task instances.N)r×   Úlistrî   ÚvaluesrG   r;   r;   r<   Útasksl  s    zProgress.tasksc                 C   s8   | j � t| j ¡ ƒW  d  ƒ S 1 s*0    Y  dS )zA list of task IDs.N)r×   ró   rî   ÚkeysrG   r;   r;   r<   Útask_idsr  s    zProgress.task_idsc                 C   sX   | j �> | jsW d  ƒ dS tdd„ | j ¡ D ƒƒW  d  ƒ S 1 sJ0    Y  dS )z'Check if all tasks have been completed.NTc                 s   s   | ]}|j V  qd S rD   )r™   )rÝ   r|   r;   r;   r<   rß   ~  rà   z$Progress.finished.<locals>.<genexpr>)r×   rî   Úallrô   rG   r;   r;   r<   r™   x  s    zProgress.finishedc                 C   s   | j s| jjdd� dS )zStart the progress display.T)r?   N)rk   rð   rF   rG   r;   r;   r<   rF   €  s    zProgress.startc                 C   s    | j  ¡  | jjs| j ¡  dS )zStop the progress display.N)rð   Ústoprc   Úis_interactiverñ   rG   r;   r;   r<   rù   …  s    
zProgress.stopc                 C   s   |   ¡  | S rD   rE   rG   r;   r;   r<   rH   ‹  s    zProgress.__enter__rI   c                 C   s   |   ¡  d S rD   )rù   rO   r;   r;   r<   rP   �  s    zProgress.__exit__rX   r^   )r_   ra   r2   r`   r3   r>   c                 c   sà   |du r2t |tƒr tt|ƒƒ}q6td|›d�ƒ‚n|}|du rN| j||d�}n| j||d� | jjr°t	| ||ƒ�.}|D ]}|V  | j
d7  _
qvW d  ƒ qÜ1 s¤0    Y  n,| j}	| j}
|D ]}|V  |	|dƒ |
ƒ  qÀdS )a‡  Track progress by iterating over a sequence.

        Args:
            sequence (Sequence[ProgressType]): A sequence of values you want to iterate over and track progress.
            total: (float, optional): Total number of steps. Default is len(sequence).
            task_id: (TaskID): Task to track. Default is new task.
            description: (str, optional): Description of task, if new task is created.
            update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1.

        Returns:
            Iterable[ProgressType]: An iterable of values taken from the provided sequence.
        Nzunable to get size of z, please specify 'total'©ra   r   )r”   r   rU   ÚlenÚ
ValueErrorÚadd_taskrB   rð   rb   r/   r5   r@   r?   )r8   r_   ra   r2   r`   r3   Z
task_totalZtrack_threadÚvaluer@   r?   r;   r;   r<   rr   —  s*    

ÿ0
zProgress.track)r2   r>   c                 C   sH   | j �. | j| }|jdu r&|  ¡ |_W d  ƒ n1 s:0    Y  dS )zéStart a task.

        Starts a task (used when calculating elapsed time). You may need to call this manually,
        if you called ``add_task`` with ``start=False``.

        Args:
            task_id (TaskID): ID of task.
        N)r×   rî   rÔ   re   )r8   r2   r|   r;   r;   r<   Ú
start_taskÈ  s    	

zProgress.start_taskc                 C   sR   | j �8 | j| }|  ¡ }|jdu r*||_||_W d  ƒ n1 sD0    Y  dS )z†Stop a task.

        This will freeze the elapsed time on the task.

        Args:
            task_id (TaskID): ID of task.
        N)r×   rî   re   rÔ   rÕ   )r8   r2   r|   r€   r;   r;   r<   Ú	stop_taskÖ  s    

zProgress.stop_task)ra   r5   r@   r`   rÎ   r?   )	r2   ra   r5   r@   r`   rÎ   r?   rÐ   r>   c                K   sH  | j �� | j| }	|	j}
|dur:||	jkr:||	_|	 ¡  |durP|	 j|7  _|dur^||	_|durl||	_|durz||	_|	j |¡ |	j|
 }|  	¡ }|| j
 }|	j}|j}|rÈ|d j|k rÈ|ƒ  q®t|ƒdkrÜ|ƒ  qÈ|dkrô| t||ƒ¡ |	j|	jk�r|	jdu �r|	j|	_W d  ƒ n1 �s,0    Y  |�rD|  ¡  dS )a˜  Update information associated with a task.

        Args:
            task_id (TaskID): Task id (returned by add_task).
            total (float, optional): Updates task.total if not None.
            completed (float, optional): Updates task.completed if not None.
            advance (float, optional): Add a value to task.completed if not None.
            description (str, optional): Change task description if not None.
            visible (bool, optional): Set visible flag if not None.
            refresh (bool): Force a refresh of progress information. Default is False.
            **fields (Any): Additional data fields required for rendering.
        Nr   rÄ   )r×   rî   r5   ra   rå   r`   rÎ   rÐ   rB   re   ré   rÖ   Úpopleftr�   rü   ÚappendrÌ   r´   rµ   r?   )r8   r2   ra   r5   r@   r`   rÎ   r?   rÐ   r|   Úcompleted_startÚupdate_completedr€   Úold_sample_timerÖ   r  r;   r;   r<   rB   å  s<    



(zProgress.updater   )rF   ra   r5   rÎ   r`   )r2   rF   ra   r5   rÎ   r`   rÐ   r>   c          
      K   sš   |   ¡ }| j�p | j| }	|	 ¡  |r*|nd|	_|dur>||	_||	_|durR||	_|r\||	_|durj||	_	d|	_
W d  ƒ n1 s„0    Y  |  ¡  dS )aÔ  Reset a task so completed is 0 and the clock is reset.

        Args:
            task_id (TaskID): ID of task.
            start (bool, optional): Start the task after reset. Defaults to True.
            total (float, optional): New total steps in task, or None to use current total. Defaults to None.
            completed (int, optional): Number of steps completed. Defaults to 0.
            **fields (str): Additional data fields required for rendering.
        N)re   r×   rî   rå   rÔ   ra   r5   rÎ   rÐ   r`   r´   r?   )
r8   r2   rF   ra   r5   rÎ   r`   rÐ   r€   r|   r;   r;   r<   Úreset   s     
$zProgress.resetr   )r2   r@   r>   c           
      C   sÔ   |   ¡ }| j�² | j| }|j}| j|7  _|j| }|| j }|j}|j}	|rh|d j|k rh|	ƒ  qNt|ƒdkr||	ƒ  qh| 	t
||ƒ¡ |j|jkr²|jdu r²|j|_|j|_W d  ƒ n1 sÆ0    Y  dS )z«Advance task by a number of steps.

        Args:
            task_id (TaskID): ID of task.
            advance (float): Number of steps to advance. Default is 1.
        r   rÄ   N)re   r×   rî   r5   ré   rÖ   r  r�   rü   r  rÌ   ra   r´   rµ   r�   rË   )
r8   r2   r@   r€   r|   r  r  r  rÖ   r  r;   r;   r<   r@   E  s"    


zProgress.advancec                 C   s   | j s| jjr| j ¡  dS )z*Refresh (render) the progress information.N)rk   rð   Z
is_startedr?   rG   r;   r;   r<   r?   _  s    zProgress.refreshc                 C   s   t |  ¡ Ž }|S )z*Get a renderable for the progress display.)r"   Úget_renderables)r8   r‚   r;   r;   r<   rí   d  s    zProgress.get_renderablec                 c   s   |   | j¡}|V  dS )z5Get a number of renderables for the progress display.N)Úmake_tasks_tablerõ   )r8   Útabler;   r;   r<   r  i  s    zProgress.get_renderables)rõ   r>   c                    sR   dd„ | j D ƒ}tj|d| jdœŽ}|D ]$‰ ˆ jr(|j‡ fdd„| j D ƒŽ  q(|S )z×Get a table to render the Progress display.

        Args:
            tasks (Iterable[Task]): An iterable of Task instances, one per row of the table.

        Returns:
            Table: A table instance.
        c                 s   s.   | ]&}t |tƒrtd d�n
| ¡  ¡ V  qdS )Tr¡   N)r”   r•   r)   ry   Úcopy)rÝ   Z_columnr;   r;   r<   rß   w  s   ýÿz,Progress.make_tasks_table.<locals>.<genexpr>)r   r   )Úpaddingrì   c                 3   s,   | ]$}t |tƒr|jˆ d �n|ˆ ƒV  qdS )r£   N)r”   r•   r¤   )rÝ   Úcolumnr£   r;   r<   rß   „  s   ýÿ)rs   r*   Úgridrì   rÎ   Úadd_row)r8   rõ   Ztable_columnsr
  r;   r£   r<   r	  n  s    	ú
úÿ
zProgress.make_tasks_tablec                 C   s2   | j � |  ¡ W  d  ƒ S 1 s$0    Y  dS )z+Makes the Progress class itself renderable.N)r×   rí   rG   r;   r;   r<   Ú__rich__�  s    zProgress.__rich__rÙ   )r`   rF   ra   r5   rÎ   rÐ   r>   c           	      K   s†   | j �d t| j|||||| j| j d�}|| j| j< |rB|  | j¡ | j}tt| jƒd ƒ| _W d  ƒ n1 sp0    Y  |  ¡  |S )aÞ  Add a new 'task' to the Progress display.

        Args:
            description (str): A description of the task.
            start (bool, optional): Start the task immediately (to calculate elapsed time). If set to False,
                you will need to call `start` manually. Defaults to True.
            total (float, optional): Number of total steps in the progress if know. Defaults to 100.
            completed (int, optional): Number of steps completed so far.. Defaults to 0.
            visible (bool, optional): Enable display of the task. Defaults to True.
            **fields (str): Additional data fields required for rendering.

        Returns:
            TaskID: An ID you can use when calling `update`.
        )rÎ   rÐ   rÍ   r×   r   N)	r×   rz   rï   re   rî   r   r-   r­   r?   )	r8   r`   rF   ra   r5   rÎ   rÐ   r|   Znew_task_indexr;   r;   r<   rþ   ”  s$    ø
2zProgress.add_taskc                 C   s2   | j � | j|= W d  ƒ n1 s$0    Y  dS )z]Delete a task if it exists.

        Args:
            task_id (TaskID): A task ID.

        N)r×   rî   )r8   r2   r;   r;   r<   Úremove_task¾  s    zProgress.remove_task)NNrX   r^   )r   )TrÙ   r   T)0rQ   rR   rS   rT   r   r•   rt   r   r   r§   rU   ræ   r7   rè   rc   r   rz   rõ   r-   r÷   r™   rF   rù   rH   r   rV   r   rP   r   r.   r   rr   r   r  r   rB   r­   r  r@   r?   r!   rí   r  r*   r	  r  rþ   r  r;   r;   r;   r<   r0   -  sÖ   ô
ó+
û    úù1÷õ?øö%!    úø*r0   Ú__main__)ÚPanel)ÚRule)ÚSyntax)r*   a~  def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
    """Iterate and generate a tuple with a flag for last value."""
    iter_values = iter(values)
    try:
        previous_value = next(iter_values)
    except StopIteration:
        return
    for value in iter_values:
        yield False, previous_value
        previous_value = value
    yield True, previous_valueÚpython)Úline_numbersZfooÚbarZbazÚ1Ú2Ú3z:Text may be printed while the progress bars are rendering.z(In fact, [i]any[/i] renderable will workzSuch as [magenta]tables[/]...zPretty printed structures...ZexamplezPretty printed)Útyperš   z	Syntax...zGive it a try!)Úcycle)Úrecordrl   rm   )rc   rd   z[red]DownloadingrÄ   rû   z[green]Processingz[yellow]Thinking)ra   rF   r¸   )r@   g333333Ó?g{®Gáz„?éd   )rX   NTNFNrY   rZ   r[   r\   r]   r^   F)mÚabcr   r   Úcollectionsr   Úcollections.abcr   Údataclassesr   r   Údatetimer   Úmathr	   Ú	threadingr
   r   r   Útypesr   Útypingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r‡   r   r   rc   r   r    r!   r"   r    r#   Újupyterr$   rð   r%   Úprogress_barr&   r“   r'   rg   r(   r
  r)   r*   rš   r+   r,   r­   r-   r.   rU   ræ   r/   r•   r§   rr   rt   r†   rŠ   rn   rp   r®   rq   r»   rÀ   rÁ   rÉ   rÌ   rz   r0   rQ   ÚrandomÚtimeÚpanelr  Úruler  Úsyntaxr  r  Zprogress_renderablesÚ	itertoolsr  Zexamplesr1   rþ   Ztask1Ztask2Ztask3r™   rB   ÚsleepÚrandintrò   râ   r;   r;   r;   r<   Ú<module>   sê   @
*             òñD*2*		%	x   
ó÷
ø	
