a
    )ñ»jÕ;  ã                   @  s\  U d dl m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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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' eræd dl(m)Z) G dd„ deƒZ*G dd„ de eƒZ+e,dk�rXd dl-Z-d dl.Z.d dl/m0Z0 d dl	m1Z1mZm2Z2 ddl3m4Z4 ddlmZ ddl5m+Z+ ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= eƒ Ze;ddd d!�Z:e=d"d#d$ƒZ<e< >d%d&d'¡ d(e7d)ƒd*e<d+d,d-d.œd/e:e9d0ƒg	Z?e0e?ƒZ@g d1¢ZAe+ed2���BZBi ZCd3eDd4< eEd5ƒD �]ZFeAeFeGeAƒ  ZHeAD ]þZIeIeHk�rF�q4e. Jd6¡ e- Kd d7¡dk �rpe LeMe@ƒ¡ d8e- -¡ d9 d  eCeHeIf< eGeCƒeGeAƒd k�r¸eC NeOeC P¡ ƒd  ¡ e=d:d;�Z<e< Qd<¡ e< Qd=¡ e< Qd>¡ eC R¡ D ]6\\ZSZTZUe< >eSeTe'eUd?›eUd@k �rdAndBdC�¡ �qèeB Ve4 We<¡¡ �q4�qW d  ƒ n1 �sN0    Y  dS )Dé    )ÚannotationsN)ÚEventÚRLockÚThread)ÚTracebackType)	ÚIOÚTYPE_CHECKINGÚAnyÚCallableÚListÚOptionalÚTextIOÚTypeÚcasté   )Úget_console)ÚConsoleÚConsoleRenderableÚGroupÚRenderableTypeÚ
RenderHook)ÚControl)Ú	FileProxy)ÚJupyterMixin)Ú
LiveRenderÚVerticalOverflowMethod)ÚScreen)ÚText)ÚSelfc                      sF   e Zd ZdZddddœ‡ fdd„Zddœd	d
„Zddœdd„Z‡  ZS )Ú_RefreshThreadz3A thread that calls refresh() at regular intervals.z'Live'ÚfloatÚNone)ÚliveÚrefresh_per_secondÚreturnc                   s&   || _ || _tƒ | _tƒ jdd� d S )NT)Údaemon)r"   r#   r   ÚdoneÚsuperÚ__init__)Úselfr"   r#   ©Ú	__class__© ú/E:\soccer\ml_env\Lib\site-packages\rich/live.pyr(      s    z_RefreshThread.__init__©r$   c                 C  s   | j  ¡  d S ©N)r&   Úset©r)   r,   r,   r-   Ústop   s    z_RefreshThread.stopc                 C  sT   | j  d| j ¡sP| jj�$ | j  ¡ s0| j ¡  W d   ƒ q 1 sD0    Y  q d S )Nr   )r&   Úwaitr#   r"   Ú_lockÚis_setÚrefreshr1   r,   r,   r-   Úrun"   s    

z_RefreshThread.run)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   r2   r7   Ú__classcell__r,   r,   r*   r-   r      s   r   c                   @  s  e Zd ZdZd6ddddddddddœ	dd	d
d
dd
d
d
ddddœdd„Zed
dœdd„ƒZddœdd„Zd7d
ddœdd„Zddœdd„Z	ddœdd„Z
d d!d"dd#œd$d%„Zddœd&d'„Zddœd(d)„Zeddœd*d+„ƒZdd,œdd
dd-œd.d/„Zddœd0d1„Zd2d2d3œd4d5„ZdS )8ÚLiveaí  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. Defaults to 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_renderablezOptional[RenderableType]zOptional[Console]Úboolr    r   z&Optional[Callable[[], RenderableType]]r!   )Ú
renderabler@   rA   rB   r#   rC   rD   rE   rF   rG   r$   c       	         C  sª   |dksJ dƒ‚|| _ |d ur"|ntƒ | _|| _d| _|| _|| _d | _d | _t	ƒ | _
d | _|| _d| _|rpdn|| _d | _|| _|	| _|
| _t|  ¡ |	d�| _d| _d S )Nr   zrefresh_per_second must be > 0FT)rF   )Ú_renderabler   r@   Ú_screenÚ_alt_screenÚ_redirect_stdoutÚ_redirect_stderrÚ_restore_stdoutÚ_restore_stderrr   r4   Ú
ipy_widgetrB   Ú_startedrC   Ú_refresh_threadr#   rF   Ú_get_renderabler   rG   Ú_live_renderÚ_nested)r)   rI   r@   rA   rB   r#   rC   rD   rE   rF   rG   r,   r,   r-   r(   9   s,    ÿzLive.__init__r.   c                 C  s   | j S )z'Check if live display has been started.)rR   r1   r,   r,   r-   Ú
is_startedb   s    zLive.is_startedr   c                 C  s    | j d ur|   ¡ n| j}|pdS )NÚ )rT   rJ   )r)   rI   r,   r,   r-   rG   g   s
    ÿ
ýzLive.get_renderable)r6   r$   c              	   C  sè   | j �Î | jrW d  ƒ dS d| _| j | ¡sFd| _W d  ƒ dS | jrZ| j d¡| _| j d¡ |  	¡  | j 
| ¡ |r¨z|  ¡  W n ty¦   |  ¡  ‚ Y n0 | jrÆt| | jƒ| _| j ¡  W d  ƒ n1 sÚ0    Y  dS )z|Start live rendering display.

        Args:
            refresh (bool, optional): Also refresh. Defaults to False.
        NTF)r4   rR   r@   Úset_liverV   rK   Úset_alt_screenrL   Úshow_cursorÚ_enable_redirect_ioÚpush_render_hookr6   Ú	Exceptionr2   rB   r   r#   rS   Ústart)r)   r6   r,   r,   r-   r_   o   s*    z
Live.startc                 C  s  | j ��ö | js W d  ƒ dS d| _| j ¡  | jrZ| jsJ| j | j¡ W d  ƒ dS | jrz| j	durz| j	 
¡  d| _	d| _| j��V zª| js¢| jjs¢|  ¡  W |  ¡  | j ¡  | jsÖ| jjrÖ| jjrÖ| j ¡  | j d¡ | jrô| j d¡ | j�r| j�s| j | j ¡ ¡ | jdu�rÐ| j�rÐ| j ¡  nš|  ¡  | j ¡  | j�sn| jj�rn| jj�rn| j ¡  | j d¡ | j�rŽ| j d¡ | j�r°| j�s°| j | j ¡ ¡ | jdu�rÎ| j�rÎ| j ¡  0 W d  ƒ n1 �sæ0    Y  W d  ƒ n1 �s0    Y  dS )zStop live rendering display.NFÚvisibleT)r4   rR   r@   Ú
clear_liverV   rC   ÚprintrI   rB   rS   r2   rF   rL   Ú
is_jupyterr6   Ú_disable_redirect_ioÚpop_render_hookÚis_terminalrU   Zlast_render_heightÚliner[   rZ   ÚcontrolÚrestore_cursorrQ   Úcloser1   r,   r,   r-   r2   ‘   sb    





ÿþý
ò
ÿþý
z	Live.stopr   c                 C  s   | j | jd ud� | S )N©r6   )r_   rJ   r1   r,   r,   r-   Ú	__enter__·   s    zLive.__enter__zOptional[Type[BaseException]]zOptional[BaseException]zOptional[TracebackType])Úexc_typeÚexc_valÚexc_tbr$   c                 C  s   |   ¡  d S r/   )r2   )r)   rm   rn   ro   r,   r,   r-   Ú__exit__»   s    zLive.__exit__c                 C  st   | j js| j jrp| jr@ttjtƒs@tj| _t	dt| j tjƒƒt_| j
rpttjtƒsptj| _t	dt| j tjƒƒt_dS )z&Enable redirecting of stdout / stderr.r   N)r@   rf   rc   rM   Ú
isinstanceÚsysÚstdoutr   rO   r   rN   ÚstderrrP   r1   r,   r,   r-   r\   Ã   s    zLive._enable_redirect_ioc                 C  s8   | j rtd| j ƒt_d| _ | jr4td| jƒt_d| _dS )z'Disable redirecting of stdout / stderr.r   N)rO   r   rr   rs   rP   rt   r1   r,   r,   r-   rd   Í   s    zLive._disable_redirect_ioc                 C  sF   | j j}|r,| |d u r,tdd„ |D ƒŽ }n|  ¡ }| jrBt|ƒS |S )zwGet the renderable that is being displayed

        Returns:
            RenderableType: Displayed renderable.
        r   c                 S  s   g | ]}|  ¡ ‘qS r,   )rG   )Ú.0r"   r,   r,   r-   Ú
<listcomp>á   ó    z#Live.renderable.<locals>.<listcomp>)r@   Ú_live_stackr   rG   rL   r   )r)   Ú
live_stackrI   r,   r,   r-   rI   Ö   s
    zLive.renderablerk   )rI   r6   r$   c                C  sR   t |tƒr| j |¡}| j�" || _|r0|  ¡  W d  ƒ n1 sD0    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)rq   Ústrr@   Ú
render_strr4   rJ   r6   )r)   rI   r6   r,   r,   r-   Úupdateæ   s    
zLive.updatec              	   C  s¨  | j ��Š | j | j¡ | jrF| jjr6| jjd  ¡  W d  ƒ dS | jjròzddl	m
} ddlm} W n$ tyŽ   ddl}| d¡ Y nb0 | jdu r¬|ƒ | _|| jƒ | j�. | jjdd� | j | jj¡ W d  ƒ n1 sæ0    Y  n’| jj�r>| jj�s>| j� | j tƒ ¡ W d  ƒ n1 �s20    Y  nF| j�s„| j�s„| j� | j tƒ ¡ W d  ƒ n1 �sz0    Y  W d  ƒ n1 �sš0    Y  dS )z&Update the display of the Live Render.r   N)Údisplay)ÚOutputz(install "ipywidgets" for Jupyter supportT)r3   )r4   rU   Úset_renderablerI   rV   r@   rx   r6   rc   ÚIPython.displayr}   Ú
ipywidgetsr~   ÚImportErrorÚwarningsÚwarnrQ   Úclear_outputrb   rf   Úis_dumb_terminalr   rR   rC   )r)   r}   r~   rƒ   r,   r,   r-   r6   ô   s8    


00ÿÿzLive.refreshzList[ConsoleRenderable])Úrenderablesr$   c                 C  s€   | j | j_ | jjrb| j�8 | jr(t ¡ n| j ¡ }|g|¢| j‘}W d  ƒ q|1 sV0    Y  n| j	s|| j
s|g |¢| j‘}|S )z;Process renderables to restore cursor and display progress.N)rF   rU   r@   Úis_interactiver4   rL   r   ÚhomeÚposition_cursorrR   rC   )r)   r‡   Úresetr,   r,   r-   Úprocess_renderables  s    
ÿ
ý0ÿÿzLive.process_renderables)N)F)r8   r9   r:   r;   r(   ÚpropertyrW   rG   r_   r2   rl   rp   r\   rd   rI   r|   r6   rŒ   r,   r,   r,   r-   r=   )   s6    þô&)"&
	"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_numbersZfooÚbarZ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...ZexamplezPretty printed)ÚtypeÚtextz	Syntax...zGive it a try!)ZSGDZMYRZEURÚUSDZAUDZJPYZCNHZHKDZCADZINRZDKKZGBPZRUBZNZDZMXNZIDRZTWDZTHBZVND)r@   zDict[Tuple[str, str], float]Úexchange_rate_dictéd   gš™™™™™Ù?é
   éÈ   i@  zExchange Rates)ÚtitlezSource CurrencyzDestination CurrencyzExchange Ratez.4fg      ð?ÚredÚgreen)Ústyle)XÚ
__future__r   rr   Ú	threadingr   r   r   Útypesr   Útypingr   r   r	   r
   r   r   r   r   r   rX   r   r@   r   r   r   r   r   rh   r   Ú
file_proxyr   Újupyterr   Úlive_renderr   r   rA   r   rž   r   Ztyping_extensionsr   r   r=   r8   ÚrandomÚtimeÚ	itertoolsr�   r�   r‘   Úalignr’   r"   Úpanelr“   Úruler”   Úsyntaxr•   Útabler–   Úadd_rowZprogress_renderablesZexamplesZ	exchangesZ
live_tabler    Ú__annotations__ÚrangeÚindexÚlenZselect_exchangeZexchangeÚsleepÚrandintÚlogÚnextÚpopÚlistÚkeysÚ
add_columnÚitemsÚsourceÚdestZexchange_rater|   Úcenterr,   r,   r,   r-   Ú<module>   sž   ,  
óö

ÿ



þý	