o 7]h5 @sJUddlZddlmZmZmZddlmZddlmZm Z m Z m Z m Z m Z mZmZddlmZddlmZmZmZmZddlmZdd lmZdd lmZdd lmZmZdd l m!Z!dd l"m#Z#GdddeZ$GdddeeZ%e&dkrddl'Z'ddl(Z(ddl)m*Z*ddlm+Z+m Z m,Z,ddl-m.Z.ddlmZddl/m%Z%ddl0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7eZe5ddddZ4e7d d!d"Z6e68d#d$d%d&e1d'd(e6d)d*d+d,d-e4e3d.g Z9e*e9Z:gd/Z;e%ed0Ze>fe?fe@d1<eAd2D]ZBe;eBeCe;ZDe;D]ZEeEeDkrqe(Fd3e'Gdd4dkr,eHeIe:d5e''d6de=eDeEf<eCe=eCe;dkrPe=JeKe=Lde7d7d8Z6e6Md9e6Md:e6Md;e=ND]\\ZOZPZQe68eOePe#eQd<eQd=kr}d>nd?d@qher?r@rArBrc Cs|dksJd||_|dur|nt|_||_d|_||_||_d|_d|_t |_ d|_ ||_ d|_ |r8dn||_d|_||_| |_| |_t|| d|_dS)Nrzrefresh_per_second must be > 0FT)rA) _renderablerr;_screen _alt_screen_redirect_stdout_redirect_stderr_restore_stdout_restore_stderrrr. ipy_widgetr=_startedr>_refresh_threadrrA_get_renderablerrB _live_render) r$rCr;r<r=rr>r?r@rArBr'r'r(r#3s* z Live.__init__cCs|jS)z'Check if live display has been started.)rLr+r'r'r( is_started[szLive.is_startedcCs |jdur |n|j}|pdS)N)rNrDr$rCr'r'r(rB`s zLive.get_renderabler0cCs|jU|jr WddS|j|d|_|jr#|jd|_|jd||j ||r9| |j rPt ||j |_|jWddSWddS1s[wYdS)z|Start live rendering display. Args: refresh (bool, optional): Also refresh. Defaults to False. NTF)r.rLr;set_liverEset_alt_screenrF show_cursor_enable_redirect_iopush_render_hookr0r=rrrMstart)r$r0r'r'r(rXhs&     "z Live.startc Cs|j|js WddS|jd|_|jr(|jdur(|jd|_d|_|jzM|js;|jj s;| W| |j |jsQ|jj rQ|j|jd|jr`|jd|jro|jso|j|j|jdur||jr||jnC| |j |js|jj r|j|jd|jr|jd|jr|js|j|j|jdur|jr|jwwwWdn1swYWddSWddS1swYdS)zStop live rendering display.NFvisibleT)r.rLr; clear_liver=rMr,rArF is_jupyterr0_disable_redirect_iopop_render_hook is_terminallinerUrTr>controlrOrestore_cursorrKcloser+r'r'r(r,~sX               "z Live.stopcCs|j|jdud|S)Nr0)rXrDr+r'r'r( __enter__szLive.__enter__exc_typeexc_valexc_tbcCs |dSr))r,)r$rerfrgr'r'r(__exit__s z Live.__exit__cCs|jjs|jjr:|jr ttjts tj|_t dt|jtjt_|j rtj |_ t dt|jtj t_ dSdSdSdS)z&Enable redirecting of stdout / stderr.r N) r;r^r[rG isinstancesysstdoutrrIr rHstderrrJr+r'r'r(rVszLive._enable_redirect_iocCs<|jr td|jt_d|_|jrtd|jt_d|_dSdS)z'Disable redirecting of stdout / stderr.r N)rIr rjrkrJrlr+r'r'r(r\s zLive._disable_redirect_iocCs|}|jr t|S|S)zwGet the renderable that is being displayed Returns: RenderableType: Displayed renderable. )rBrFrrRr'r'r(rCszLive.renderablerccCsN|j||_|r|WddSWddS1s wYdS)zUpdate the renderable that is being displayed Args: renderable (RenderableType): New renderable to use. refresh (bool, optional): Refresh the display. Defaults to False. N)r.rDr0)r$rCr0r'r'r(updates "z Live.updatec Cs|j|j|j|jjrazddlm}ddlm }Wnt y/ddl }| dYnw|j dur>||_ ||j |j |j jdd|j|jjWdn1s[wYnK|jjr|jjs|j|jtWdn1s~wYn@|js|js|j|jtWdn81swYWddSWddSWddSWddSWddSWddSWddS1swYdS)z&Update the display of the Live Render.r)display)OutputNz(install "ipywidgets" for Jupyter supportT)r-)r.rOset_renderablerCr;r[IPython.displayrn ipywidgetsro ImportErrorwarningswarnrK clear_outputprintr^is_dumb_terminalrrLr>)r$rnrortr'r'r(r0sV     "z Live.refresh renderablescCs|j|j_|jjr3|j|jrtn|j}|g||j}Wd|S1s,wY|S|j s@|j s@g||j}|S)z;Process renderables to restore cursor and display progress.N) rArOr;is_interactiver.rFrhomeposition_cursorrLr>)r$ryresetr'r'r(process_renderabless$     zLive.process_renderablesr))Fr2)rr)r3r4r5r6r rrboolr7rrr#propertyrPrBrXr,rdr BaseExceptionrrhrVr\rCrmr0r rr~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_valuepythonT) line_numbersfoobarbaz123zYou 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 workzSuch as [magenta]tables[/]...zPretty printed structures...examplezPretty printed)typetextz Syntax...zGive it a try!)SGDMYREURUSDAUDJPYCNHHKDCADINRDKKGBPRUBNZDMXNIDRTWDTHBVND)r;exchange_rate_dictdg? i@zExchange Rates)titlezSource CurrencyzDestination Currencyz Exchange Ratez.4fg?redgreen)style)Trj threadingrrrtypesrtypingrrrr r r r r rQrr;rrrrr`r file_proxyrjupyterr live_renderrrr<rrrrrr3randomtime itertoolsrrralignrrpanelrrulersyntaxrtableradd_rowprogress_renderablesexamples exchanges live_tablerstrr7__annotations__rangeindexlenselect_exchangeexchangesleeprandintlognextpoplistkeys add_columnitemssourcedest exchange_ratermcenterr'r'r'r(s  (       c                     $