o
    Ëý°j�5  ã                   @   sJ  U 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	m
Z
mZmZmZmZmZ ddl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mZ ddlmZmZ ddl m!Z! ddl"m#Z# G dd„ deƒZ$G dd„ deeƒZ%e&dk�r£d dl'Z'd dl(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 ddl/m%Z% ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 eƒ Ze5dddd�Z4e7d d!d"ƒZ6e6 8d#d$d%¡ d&e1d'ƒd(e6d)d*d+d,œd-e4e3d.ƒg	Z9e*e9ƒZ:g d/¢Z;e%ed0��©Z<i Z=e+e,e>e>f e?f e@d1< eAd2ƒD ]�ZBe;eBeCe;ƒ  ZDe;D ]ZEeEeDk�r�qe( Fd3¡ e' Gd d4¡dk �r,e HeIe:ƒ¡ d5e' '¡ d6 d  e=eDeEf< eCe=ƒeCe;ƒd k�rPe= JeKe= L¡ ƒd  ¡ e7d7d8�Z6e6 Md9¡ e6 Md:¡ e6 Md;¡ e= N¡ D ]\\ZOZPZQe6 8eOePe#eQd<›eQd=k �r}d>nd?d@�¡ �qhe< Re. Se6¡¡ �q�qW d  ƒ dS 1 �sœw   Y  dS dS )Aé    N)ÚEventÚRLockÚThread)ÚTracebackType)ÚIOÚAnyÚCallableÚListÚOptionalÚTextIOÚTypeÚcasté   )Úget_console)ÚConsoleÚConsoleRenderableÚRenderableTypeÚ
RenderHook)ÚControl)Ú	FileProxy)ÚJupyterMixin)Ú
LiveRenderÚVerticalOverflowMethod)ÚScreen)ÚTextc                       sB   e Zd ZdZdddeddf‡ fdd„Zdd	d
„Zddd„Z‡  ZS )Ú_RefreshThreadz3A thread that calls refresh() at regular intervals.ÚliveÚLiveÚrefresh_per_secondÚreturnNc                    s&   || _ || _tƒ | _tƒ jdd� d S )NT)Údaemon)r   r   r   ÚdoneÚsuperÚ__init__)Úselfr   r   ©Ú	__class__© úˆ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pip/_vendor/rich/live.pyr#      s   z_RefreshThread.__init__c                 C   s   | j  ¡  d S ©N)r!   Úset©r$   r'   r'   r(   Ústop   s   z_RefreshThread.stopc                 C   sh   | j  d| j ¡s2| jj� | j  ¡ s| j ¡  W d   ƒ n1 s"w   Y  | j  d| j ¡r	d S d S )Nr   )r!   Úwaitr   r   Ú_lockÚis_setÚrefreshr+   r'   r'   r(   Úrun   s   


€þÿz_RefreshThread.run©r   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úfloatr#   r,   r1   Ú__classcell__r'   r'   r%   r(   r      s
    
r   c                   @   sL  e Zd ZdZ	d3ddddddddddœ	dee d	ee d
edededededede	dee
g ef  ddfdd„Zedefdd„ƒZdefdd„Zd4deddfdd„Zd5dd„Zd6dd„Zd eee  d!ee d"ee ddfd#d$„Zd5d%d&„Zd5d'd(„Zedefd)d*„ƒZdd+œdededdfd,d-„Zd5d.d/„Zd0ee dee fd1d2„ZdS )7r   aî  Renders an auto-updating live display of any given renderable.

    Args:
        renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing.
        console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout.
        screen (bool, optional): Enable alternate screen mode. Defaults to False.
        auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True
        refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4.
        transient (bool, optional): Clear the renderable on exit (has no effect when screen=True). 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.
        vertical_overflow (VerticalOverflowMethod, optional): How to handle renderable when it is too tall for the console. Defaults to "ellipsis".
        get_renderable (Callable[[], RenderableType], optional): Optional callable to get renderable. Defaults to None.
    NFTé   Úellipsis)	ÚconsoleÚscreenÚauto_refreshr   Ú	transientÚredirect_stdoutÚredirect_stderrÚvertical_overflowÚget_renderableÚ
renderabler;   r<   r=   r   r>   r?   r@   rA   rB   r   c       	         C   s¤   |dksJ dƒ‚|| _ |d ur|ntƒ | _|| _d| _|| _|| _d | _d | _t	ƒ | _
d | _|| _d| _|r8dn|| _d | _|| _|	| _|
| _t|  ¡ |	d�| _d S )Nr   zrefresh_per_second must be > 0FT)rA   )Ú_renderabler   r;   Ú_screenÚ_alt_screenÚ_redirect_stdoutÚ_redirect_stderrÚ_restore_stdoutÚ_restore_stderrr   r.   Ú
ipy_widgetr=   Ú_startedr>   Ú_refresh_threadr   rA   Ú_get_renderabler   rB   Ú_live_render)r$   rC   r;   r<   r=   r   r>   r?   r@   rA   rB   r'   r'   r(   r#   3   s*   ÿzLive.__init__c                 C   s   | j S )z'Check if live display has been started.)rL   r+   r'   r'   r(   Ú
is_started[   s   zLive.is_startedc                 C   s    | j d ur	|   ¡ n| j}|pdS )NÚ )rN   rD   ©r$   rC   r'   r'   r(   rB   `   s
   
ÿýzLive.get_renderabler0   c                 C   sÄ   | j �U | jr	 W d  ƒ dS | j | ¡ d| _| jr#| j d¡| _| j d¡ |  ¡  | j 	| ¡ |r9|  
¡  | jrPt| | jƒ| _| j ¡  W d  ƒ dS W d  ƒ dS 1 s[w   Y  dS )z|Start live rendering display.

        Args:
            refresh (bool, optional): Also refresh. Defaults to False.
        NTF)r.   rL   r;   Úset_liverE   Úset_alt_screenrF   Úshow_cursorÚ_enable_redirect_ioÚpush_render_hookr0   r=   r   r   rM   Ústart)r$   r0   r'   r'   r(   rX   h   s&   þò"ôz
Live.startc                 C   sÒ  | j �Ü | js	 W d  ƒ dS | j ¡  d| _| jr(| jdur(| j ¡  d| _d| _| j�™ zM| js;| jj	s;|  
¡  W |  ¡  | j ¡  | jsQ| jjrQ| j ¡  | j d¡ | jr`| j d¡ | jro| jso| j | j ¡ ¡ | jdur|| jr|| j ¡  nC|  ¡  | j ¡  | js’| jjr’| j ¡  | j d¡ | jr¡| j d¡ | jr°| js°| j | j ¡ ¡ | jdur¾| jr¿| j ¡  w w w W d  ƒ n1 sÊw   Y  W d  ƒ dS W d  ƒ dS 1 sâw   Y  dS )zStop live rendering display.NFÚvisibleT)r.   rL   r;   Ú
clear_liver=   rM   r,   rA   rF   Ú
is_jupyterr0   Ú_disable_redirect_ioÚpop_render_hookÚis_terminalÚlinerU   rT   r>   ÚcontrolrO   Úrestore_cursorrK   Úcloser+   r'   r'   r(   r,   ~   sX   þ

€


€õ

ÿ€ñõ"õz	Live.stopc                 C   s   | j | jd ud� | S )N©r0   )rX   rD   r+   r'   r'   r(   Ú	__enter__�   s   zLive.__enter__Úexc_typeÚexc_valÚexc_tbc                 C   s   |   ¡  d S r)   )r,   )r$   re   rf   rg   r'   r'   r(   Ú__exit__¡   s   zLive.__exit__c                 C   s€   | j js| j jr:| jr ttjtƒs tj| _t	dt| j tjƒƒt_| j
r<ttjtƒs>tj| _t	dt| j tjƒƒt_dS dS dS dS )z&Enable redirecting of stdout / stderr.r   N)r;   r^   r[   rG   Ú
isinstanceÚsysÚstdoutr   rI   r   rH   ÚstderrrJ   r+   r'   r'   r(   rV   ©   s   úzLive._enable_redirect_ioc                 C   s<   | j rtd| j ƒt_d| _ | jrtd| jƒt_d| _dS dS )z'Disable redirecting of stdout / stderr.r   N)rI   r   rj   rk   rJ   rl   r+   r'   r'   r(   r\   ³   s   
þzLive._disable_redirect_ioc                 C   s   |   ¡ }| jrt|ƒS |S )zwGet the renderable that is being displayed

        Returns:
            RenderableType: Displayed renderable.
        )rB   rF   r   rR   r'   r'   r(   rC   ¼   s   zLive.renderablerc   c                C   sN   | j � || _|r|  ¡  W d  ƒ dS W d  ƒ dS 1 s w   Y  dS )zÓUpdate the renderable that is being displayed

        Args:
            renderable (RenderableType): New renderable to use.
            refresh (bool, optional): Refresh the display. Defaults to False.
        N)r.   rD   r0   )r$   rC   r0   r'   r'   r(   ÚupdateÆ   s   
ý"þzLive.updatec              	   C   sÌ  | j �Ù | j | j¡ | jjrazddlm} ddlm	} W n t
y/   ddl}| d¡ Y n…w | jdu r>|ƒ | _|| jƒ | j� | jjdd� | j | jj¡ W d  ƒ n1 s[w   Y  nK| jjr„| jjs„| j� | j tƒ ¡ W d  ƒ n1 s~w   Y  n@| js¼| jsÌ| j� | j tƒ ¡ W d  ƒ n81 sŸw   Y  W d  ƒ dS W d  ƒ dS W d  ƒ dS W d  ƒ dS W d  ƒ dS W d  ƒ dS W d  ƒ dS 1 sßw   Y  dS )z&Update the display of the Live Render.r   )Údisplay)ÚOutputNz(install "ipywidgets" for Jupyter supportT)r-   )r.   rO   Úset_renderablerC   r;   r[   ÚIPython.displayrn   Ú
ipywidgetsro   ÚImportErrorÚwarningsÚwarnrK   Úclear_outputÚprintr^   Úis_dumb_terminalr   rL   r>   )r$   rn   ro   rt   r'   r'   r(   r0   Ò   sV   ý

þ€ÿ€ÿÿÿè€ 	÷ë€ ë"èzLive.refreshÚrenderablesc                 C   s„   | j | j_ | jjr3| j� | jrt ¡ n| j ¡ }|g|¢| j‘}W d  ƒ |S 1 s,w   Y  |S | j	s@| j
s@g |¢| j‘}|S )z;Process renderables to restore cursor and display progress.N)rA   rO   r;   Úis_interactiver.   rF   r   ÚhomeÚposition_cursorrL   r>   )r$   ry   Úresetr'   r'   r(   Úprocess_renderablesï   s$   

ÿý
úôüÿÿzLive.process_renderablesr)   )Fr2   )r   r   )r3   r4   r5   r6   r
   r   r   Úboolr7   r   r   r#   ÚpropertyrP   rB   rX   r,   rd   r   ÚBaseExceptionr   rh   rV   r\   rC   rm   r0   r	   r   r~   r'   r'   r'   r(   r   #   s|    þôþüûúùø	÷
öõô
ó(


þýü
û


		
ÿþr   Ú__main__)Úcycle)ÚDictr	   ÚTuple)ÚAlign)r   )r   )ÚPanel)ÚRule)ÚSyntax)ÚTablea~  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ÚpythonT)Úline_numbersÚfooÚbarÚbazÚ1Ú2Ú3z�You can make the terminal shorter and taller to see the live table hideText 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...ÚexamplezPretty printed)ÚtypeÚtextz	Syntax...zGive it a try!)ÚSGDÚMYRÚEURÚUSDÚAUDÚJPYÚCNHÚHKDÚCADÚINRÚDKKÚGBPÚRUBÚNZDÚMXNÚIDRÚTWDÚTHBÚVND)r;   Úexchange_rate_dictéd   gš™™™™™Ù?é
   éÈ   i@  zExchange Rates)ÚtitlezSource CurrencyzDestination CurrencyzExchange Ratez.4fg      ð?ÚredÚgreen)Ústyle)Trj   Ú	threadingr   r   r   Útypesr   Útypingr   r   r   r	   r
   r   r   r   rQ   r   r;   r   r   r   r   r`   r   Ú
file_proxyr   Újupyterr   Úlive_renderr   r   r<   r   r•   r   r   r   r3   ÚrandomÚtimeÚ	itertoolsrƒ   r„   r…   Úalignr†   r   Úpanelr‡   Úrulerˆ   Úsyntaxr‰   ÚtablerŠ   Úadd_rowÚprogress_renderablesÚexamplesÚ	exchangesÚ
live_tabler©   Ústrr7   Ú__annotations__ÚrangeÚindexÚlenÚselect_exchangeÚexchangeÚsleepÚrandintÚlogÚnextÚpopÚlistÚkeysÚ
add_columnÚitemsÚsourceÚdestÚexchange_raterm   Úcenterr'   r'   r'   r(   Ú<module>   s    
 ( 
cóö

ÿ



þý	åý$ý¹