ó
    Ãu„jç5  ã                  ó8  • % S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJ	r	  SSK
Jr  SSKJrJrJrJrJrJrJrJr  SSKrSSKJr  SS	KJr  \(       a  SS
KJr  SSKJr  \" S5      rS\ S'     " S S\!5      r" " S S\!5      r# " S S\#5      r$ " S S\#5      r% " S S\#5      r&S$S jr' " S S\RP                  5      r)\" S5      r*\\/ \SS\*4   4   \/ \*4   \\*   4   r+S\ S'     " S S 5      r,\RZ                  R]                  S!S"9 " S# S\\*   5      5       r/g)%zx
This module contains the `Worker` class and related objects.

See the guide for how to use [workers](/guide/workers).

é    )ÚannotationsN)Ú
ContextVar)ÚEvent)Ú	monotonic)ÚTYPE_CHECKINGÚ	AwaitableÚCallableÚ	CoroutineÚGenericÚTypeVarÚUnionÚcast)Ú	TypeAlias)ÚMessage)ÚApp)ÚDOMNodeÚactive_workerzContextVar[Worker]c                  ó   • \ rS rSrSrSrg)ÚNoActiveWorkeré)   zThere is no active worker.© N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    ÚœC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\textual/worker.pyr   r   )   s   † Ü$r   r   c                  ó   • \ rS rSrSrSrg)ÚWorkerErroré-   zA worker related error.r   Nr   r   r   r    r"   r"   -   s   † Ü!r   r"   c                  ó0   ^ • \ rS rSrSrSU 4S jjrSrU =r$ )ÚWorkerFailedé1   z4The worker raised an exception and did not complete.c                ó8   >• Xl         [        TU ]	  SU< 35        g )NzWorker raised exception: )ÚerrorÚsuperÚ__init__)Úselfr(   Ú	__class__s     €r    r*   ÚWorkerFailed.__init__4   s   ø€ ØŒ
Ü‰ÑÐ4°U±IÐ>Õ?r   )r(   )r(   ÚBaseExceptionÚreturnÚNone)r   r   r   r   r   r*   r   Ú__classcell__©r,   s   @r    r%   r%   1   s   ø† Ù>÷@õ @r   r%   c                  ó   • \ rS rSrSrSrg)ÚDeadlockErroré9   z)The operation would result in a deadlock.r   Nr   r   r   r    r4   r4   9   s   † Ü3r   r4   c                  ó   • \ rS rSrSrSrg)ÚWorkerCancelledé=   z.The worker was cancelled and did not complete.r   Nr   r   r   r    r7   r7   =   s   † Ü8r   r7   ÚWorkerc                 ó`   •  [         R                  5       $ ! [         a    [        S5      Sef = f)z}Get the currently active worker.

Raises:
    NoActiveWorker: If there is no active worker.

Returns:
    A Worker instance.
z1There is no active worker in this task or thread.N)r   ÚgetÚLookupErrorr   r   r   r    Úget_current_workerr=   A   s8   € ðÜ× Ñ Ó"Ð"øÜó ÜØ?ó
àð	ðús   ‚ –-c                  ó4   • \ rS rSrSrSr Sr Sr Sr Sr	Sr
g	)
ÚWorkerStateéR   z,A description of the worker's current state.é   é   é   é   é   r   N)r   r   r   r   r   ÚPENDINGÚRUNNINGÚ	CANCELLEDÚERRORÚSUCCESSr   r   r   r    r?   r?   R   s-   † Ù6à€GØ1Ø€GØØ€IØ3Ø€EØ:Ø€GÚ<r   r?   Ú
ResultTyper   ÚWorkTypec                  ó,   • \ rS rSrSrSS jrSS jrSrg)	Ú	_ReprTextél   z-Shim to insert a word into the Worker's repr.c                ó   • Xl         g ©N©Útext)r+   rS   s     r    r*   Ú_ReprText.__init__o   s   € Ø�	r   c                ó   • U R                   $ rQ   rR   ©r+   s    r    Ú__repr__Ú_ReprText.__repr__r   s   € Ø�y‰yÐr   rR   N)rS   Ústrr/   r0   )r/   rY   )r   r   r   r   r   r*   rW   r   r   r   r    rN   rN   l   s   † Ù7ô÷r   rN   T)Úangularc            	      ó  • \ rS rSrSr\R                  R                   " S S\SSS95       r	SS	SS
SS.               S$S jjr
S%S jr\S&S j5       r\S'S j5       r\R                  S(S j5       r\S)S j5       r\S)S j5       r\S)S j5       r\S*S j5       r\S+S j5       r\S,S j5       r\S-S j5       r\S.S j5       r S/     S0S jjrS1S2S jjrS3S jrS3S jrS3S jrS4S jr S5     S6S  jjrS7S! jrS3S" jr S#r!g)8r9   év   z>A class to manage concurrent work (either a task or a thread).c                  ó:   ^ • \ rS rSrSrSU 4S jjrSS jrSrU =r$ )ÚWorker.StateChangedéz   zThe worker state changed.c                ó:   >• Xl         X l        [        TU ]  5         g)zaInitialize the StateChanged message.

Args:
    worker: The worker object.
    state: New state.
N)ÚworkerÚstater)   r*   )r+   ra   rb   r,   s      €r    r*   ÚWorker.StateChanged.__init__~   s   ø€ ð !ŒKØŒJÜ‰GÑÕr   c              #  óD   #   • U R                   v •  U R                  v •  g 7frQ   )ra   rb   rV   s    r    Ú__rich_repr__Ú!Worker.StateChanged.__rich_repr__‰   s   é € Ø—+‘+ÒØ—*‘*Óùs   ‚ )rb   ra   )ra   r9   rb   r?   r/   r0   ©r/   zrich.repr.Result)	r   r   r   r   r   r*   re   r   r1   r2   s   @r    ÚStateChangedr^   z   s   ø† á'÷		÷	ò 	r   rh   Fra   )ÚbubbleÚ	namespaceÚ ÚdefaultT)ÚnameÚgroupÚdescriptionÚexit_on_errorÚthreadc               óÎ  • Xl         X l        X0l        X@l        [	        U5      S::  a  UOUSS S-   U l        X`l        [        5       U l         Xpl	        [        R                  U l        U R                  U l        SU l        SU l        SU l        SU l        [%        5       U l        SU l        SU l        U R                   R-                  U R/                  X R                  5      5        g)aù  Initialize a Worker.

Args:
    node: The widget, screen, or App that initiated the work.
    work: A callable, coroutine, or other awaitable object to run in the worker.
    name: Name of the worker (short string to help identify when debugging).
    group: The worker group.
    description: Description of the worker (longer string with more details).
    exit_on_error: Exit the app if the worker raises an error. Set to `False` to suppress exceptions.
    thread: Mark the worker as a thread worker.
iè  Nz...r   F)Ú_nodeÚ_workrm   rn   Úlenro   rp   r   Úcancelled_eventÚ_thread_workerr?   rF   Ú_staterb   Ú_errorÚ_completed_stepsÚ_total_stepsÚ
_cancelledr   Ú_created_timeÚ_resultÚ_taskÚpost_messagerh   )r+   ÚnodeÚworkrm   rn   ro   rp   rq   s           r    r*   ÚWorker.__init__�   sÇ   € ð, Œ
ØŒ
ØŒ	ØŒ
ä˜{Ó+¨tÓ3‰K¸ÀUÀdÐ9KÈeÑ9Sð 	Ôð +ÔÜ&+£gˆÔØAØ$ÔÜ!×)Ñ)ˆŒØ—[‘[ˆŒ
Ø,0ˆŒØ%&ˆÔØ(,ˆÔØ %ˆŒÜ&›[ˆÔØ*.ˆŒØ*.ˆŒ
Ø�
‰
×Ñ × 1Ñ 1°$¿¹Ó DÕEr   c              #  óê   #   • [        U R                  R                  5      v •  SU R                  S4v •  SU R                  S4v •  SU R                  S4v •  S[        U R                  S5      S4v •  g 7f)	Nrm   rk   rn   rl   ro   ÚprogressrA   ç        )rN   rb   rm   rn   ro   Úroundr…   rV   s    r    re   ÚWorker.__rich_repr__¹   se   é € Ü˜Ÿ
™
Ÿ™Ó(Ò(Ø�d—i‘i Ð#Ò#Ø�t—z‘z 9Ð,Ò,Ø˜T×-Ñ-¨rÐ1Ò1Øœ% §¡¨qÓ1°3Ð6Ó6ùs   ‚A1A3c                ó   • U R                   $ )z(The node where this worker was run from.)rs   rV   s    r    r�   ÚWorker.nodeÀ   s   € ð �z‰zÐr   c                ó   • U R                   $ )z The current state of the worker.)rx   rV   s    r    rb   ÚWorker.stateÅ   ó   € ð �{‰{Ðr   c                ó�   • XR                   :g  nXl         U(       a+  U R                  R                  U R                  X5      5        gg)z"Set the state, and send a message.N)rx   rs   r€   rh   )r+   rb   Úchangeds      r    rb   rŒ   Ê   s:   € ð Ÿ;™;Ñ&ˆØŒÞØ�J‰J×#Ñ# D×$5Ñ$5°dÓ$BÕCð r   c                ó   • U R                   $ )zMHas the work been cancelled?

Note that cancelled work may still be running.
)r|   rV   s    r    Úis_cancelledÚWorker.is_cancelledÒ   s   € ð �‰Ðr   c                ó<   • U R                   [        R                  :H  $ )zIs the task running?)rb   r?   rG   rV   s    r    Ú
is_runningÚWorker.is_runningÚ   s   € ð �z‰zœ[×0Ñ0Ñ0Ð0r   c                óz   • U R                   [        R                  [        R                  [        R                  4;   $ )z5Has the task finished (cancelled, error, or success)?)rb   r?   rH   rI   rJ   rV   s    r    Úis_finishedÚWorker.is_finishedß   s5   € ð �z‰zÜ×!Ñ!Ü×ÑÜ×Ñð
ñ 
ð 	
r   c                ó   • U R                   $ )zThe number of completed steps.©rz   rV   s    r    Úcompleted_stepsÚWorker.completed_stepsè   s   € ð ×$Ñ$Ð$r   c                ó   • U R                   $ )z4The number of total steps, or None if indeterminate.)r{   rV   s    r    Útotal_stepsÚWorker.total_stepsí   s   € ð × Ñ Ð r   c                ó†   • U R                   (       d  g[        S[        SU R                  U R                   -  S-  5      5      $ )z‚Progress as a percentage.

If the total steps is None, then this will return 0. The percentage will be clamped between 0 and 100.
r†   r   éd   g      Y@)r{   ÚmaxÚminrz   rV   s    r    r…   ÚWorker.progressò   s:   € ð × × ØÜ�1”c˜# × 5Ñ 5¸×8IÑ8IÑ IÈUÑRÓSÓTÐTr   c                ó   • U R                   $ )z:The result of the worker, or `None` if there is no result.)r~   rV   s    r    ÚresultÚWorker.resultü   s   € ð �|‰|Ðr   c                ó   • U R                   $ )zDThe exception raised by the worker, or `None` if there was no error.)ry   rV   s    r    r(   ÚWorker.error  r�   r   Nc                ón   • Ub  U =R                   U-  sl         US:w  a  Uc  SO[        SU5      U l        gg)zÙUpdate the number of completed steps.

Args:
    completed_steps: The number of completed seps, or `None` to not change.
    total_steps: The total number of steps, `None` for indeterminate, or -1 to leave unchanged.
Néÿÿÿÿr   )rz   r¢   r{   )r+   r›   rž   s      r    ÚupdateÚWorker.update  s>   € ð Ñ&Ø×!Ò! _Ñ4Õ!Ø˜"ÓØ(3Ñ(;¡ÄÀQÈÓATˆDÕð r   c                ó.   • U =R                   U-  sl         g)zUAdvance the number of completed steps.

Args:
    steps: Number of steps to advance.
Nrš   )r+   Ústepss     r    ÚadvanceÚWorker.advance  s   € ð 	×Ò Ñ&Ör   c              ƒ  óL  ^ ^#   • SU 4S jjm    SU4S jjnS	U 4S jjn[         R                  " T R                  5      (       dJ  [        T R                  S5      (       a2  [         R                  " T R                  R                  5      (       a  UnOP[         R
                  " T R                  5      (       a  TnO([        T R                  5      (       a  UnO[        S5      e[        R                  " 5       nUc   eUR                  SUT R                  5      I Sh  v•N $  N7f)
z?Run a threaded worker.

Returns:
    Return value of the work.
c                óN   >^ • SUU 4S jjn[         R                  " U" 5       5      $ )z.Set the active worker and await the awaitable.c               “  óN   >#   • [         R                  T 5        TI S h  v•N $  N7frQ   ©r   Úset)r+   r‚   s   €€r    Údo_workÚ<Worker._run_threaded.<locals>.run_awaitable.<locals>.do_work&  s   øé € Ü×!Ñ! $Ô'Ø!—zÐ!‘zùs   ƒ%ž#Ÿ%©r/   rK   )ÚasyncioÚrun)r‚   r·   r+   s   ` €r    Úrun_awaitableÚ+Worker._run_threaded.<locals>.run_awaitable#  s    ù€ ÷"ð "ô —;’;™w›yÓ)Ð)r   c                ó   >• T" U " 5       5      $ )z*Set the active worker and await coroutine.r   )r‚   r¼   s    €r    Úrun_coroutineÚ+Worker._run_threaded.<locals>.run_coroutine,  s   ø€ ñ !¡£Ó(Ð(r   c                ó<   >• [         R                  T5        U " 5       $ )z-Set the active worker, and call the callable.rµ   )r‚   r+   s    €r    Úrun_callableÚ*Worker._run_threaded.<locals>.run_callable2  s   ø€ ä×Ñ˜dÔ#Ù“6ˆMr   Úfuncz*Unsupported attempt to run a thread workerN)r‚   zAwaitable[ResultType]r/   rK   )r‚   z/Callable[[], Coroutine[None, None, ResultType]]r/   rK   )r‚   zCallable[[], ResultType]r/   rK   )ÚinspectÚiscoroutinefunctionrt   ÚhasattrrÄ   ÚisawaitableÚcallabler"   rº   Úget_running_loopÚrun_in_executor)r+   r¿   rÂ   ÚrunnerÚloopr¼   s   `    @r    Ú_run_threadedÚWorker._run_threaded  sÞ   ùé € ÷	*ð	)ØAð	)à÷	)÷	ô ×'Ò'¨¯
©
×3Ñ3Ü�t—z‘z 6×*Ñ*Ü×+Ò+¨D¯J©J¯O©O×<Ñ<à"‰FÜ× Ò  §¡×,Ñ,Ø"‰FÜ�d—j‘j×!Ñ!Ø!‰FäÐJÓKÐKä×'Ò'Ó)ˆØÑÐÐØ×)Ñ)¨$°¸¿
¹
ÓC×CÐCÑCùs   „DD$ÄD"ÄD$c              ƒ  óò  #   • [         R                  " U R                  5      (       dJ  [        U R                  S5      (       aG  [         R                  " U R                  R                  5      (       a  U R                  5       I Sh  v•N $ [         R
                  " U R                  5      (       a  U R                  I Sh  v•N $ [        U R                  5      (       a  [        S5      e[        S5      e Nm N67f)z=Run an async worker.

Returns:
    Return value of the work.
rÄ   Nz6Request to run a non-async function as an async workerz*Unsupported attempt to run an async worker)rÅ   rÆ   rt   rÇ   rÄ   rÈ   rÉ   r"   rV   s    r    Ú
_run_asyncÚWorker._run_asyncH  s¦   é € ô ×'Ò'¨¯
©
×3Ñ3Ü�t—z‘z 6×*Ñ*Ü×+Ò+¨D¯J©J¯O©O×<Ñ<àŸ™›×%Ð%Ü× Ò  §¡×,Ñ,ØŸ™×#Ð#Ü�d—j‘j×!Ñ!ÜÐVÓWÐWÜÐFÓGÐGñ &á#ùs$   ‚BC7ÂC3Â8C7Â>C5Â?5C7Ã5C7c              ƒ  ó€   #   • U R                   (       a  U R                  5       OU R                  5       I Sh  v•N $  N7f)zƒRun the work.

Implement this method in a subclass, or pass a callable to the constructor.

Returns:
    Return value of the work.
N)rw   rÎ   rÑ   rV   s    r    r»   Ú
Worker.runZ  s3   é € ð %)×$7×$7ˆD×ÑÔ ¸T¿_¹_Ó=N÷
ð 	
ñ 
ùs   ‚5>·<¸>c           	   ƒ  óš  #   • UR                  5          [        R                  U 5        [        R                  U l        UR                  R                  U 5         U R                  5       I Sh  v•N U l	        [        R                  U l        UR                  R                  U 5        SSS5        g NB! [        R                   a@  n[        R                  U l        X l        UR                  R                  U 5         SnANZSnAf[         a©  n[        R                   U l        X l        UR                  R                  U S[#        U5      5        SSKJn  UR                  R                  U" 5       5        U R(                  (       a&  [+        U R                  5      nUR-                  U5         SnAGNSnAff = f! , (       d  f       g= f7f)z.Run the worker.

Args:
    app: App instance.
NÚfailedr   )Ú	Traceback)Ú_contextr   r¶   r?   rG   rb   Úlogra   r»   r~   rJ   rº   ÚCancelledErrorrH   ry   Ú	ExceptionrI   ÚreprÚrich.tracebackr×   rp   r%   Ú_handle_exception)r+   Úappr(   r×   Úworker_faileds        r    Ú_runÚWorker._runf  s+  é € ð �\‰\�^Ü×Ñ˜dÔ#ä$×,Ñ,ˆDŒJØ�G‰G�N‰N˜4Ô ð%Ø%)§X¡X£Z×/�”ô  )×0Ñ0�”
Ø—‘—‘˜tÔ$÷/ ˆ^ñ  0øÜ×)Ñ)ó %Ü(×2Ñ2�”
Ø#”Ø—‘—‘˜t×$Ñ$ûÜó 	9Ü(×.Ñ.�”
Ø#”Ø—‘—‘˜t X¬t°E«{Ô;Ý4à—‘—‘™y›{Ô+Ø×%×%Ü$0°·±Ó$=�MØ×)Ñ)¨-Ô8ÿùð	9ú÷ �^üsl   ‚G“AF:ÁB2Á-B0Á.	B2Á70F:Â'	GÂ0B2Â2F7Ã6DÃ<F:ÄF7ÄBF2Æ,F:Æ2F7Æ7F:Æ:
GÇGc                óê   ^ ^• T R                   b  g[        R                  T l        [        R
                  " T R                  U5      5      T l         SUU 4S jjnT R                   R                  U5        g)zpStart the worker.

Args:
    app: An app instance.
    done_callback: A callback to call when the task is done.
Nc                ó   >• Tb	  T" T5        gg)zURun the callback.

Called by `Task.add_done_callback`.

Args:
    The worker's task.
Nr   )r   Údone_callbackr+   s    €€r    Útask_done_callbackÚ)Worker._start.<locals>.task_done_callback“  s   ø€ ð Ñ(Ù˜dÕ#ð )r   )r   zasyncio.Taskr/   r0   )r   r?   rG   rb   rº   Úcreate_taskrá   Úadd_done_callback)r+   rß   rå   ræ   s   ` ` r    Ú_startÚWorker._start…  sX   ù€ ð �:‰:Ñ!ØÜ ×(Ñ(ˆŒ
Ü×(Ò(¨¯©°3«Ó8ˆŒ
÷		$ð 		$ð 	�
‰
×$Ñ$Ð%7Õ8r   c                ó”   • SU l         U R                  b  U R                  R                  5         U R                  R	                  5         g)zCancel the task.TN)r|   r   Úcancelrv   r¶   rV   s    r    rí   ÚWorker.cancel   s5   € àˆŒØ�:‰:Ñ!Ø�J‰J×ÑÔØ×Ñ× Ñ Õ"r   c              ƒ  ó†  #   •  [         R                  5       U L a  [        S5      e U R                  [
        R                  :X  a  [        S5      eU R                  b   U R                  I Sh  v•N   U R                  [
        R                  :X  a$  U R                  c   e[        U R                  5      eU R                  [
        R                  :X  a  [        S5      e[!        SU R"                  5      $ ! [         a     NØf = f N•! [        R                   a%  n[
        R                  U l        Xl         SnANÇSnAff = f7f)zÏWait for the work to complete.

Raises:
    WorkerFailed: If the Worker raised an exception.
    WorkerCancelled: If the Worker was cancelled before it completed.

Returns:
    The return value of the work.
z7Can't call worker.wait from within the worker function!z2Worker must be started before calling this method.Nz+Worker was cancelled, and did not complete.rK   )r   r;   r4   r<   rb   r?   rF   r"   r   rº   rÚ   rH   ry   rI   r%   r7   r   r~   )r+   r(   s     r    ÚwaitÚWorker.wait§  s  é € ð	Ü× Ñ Ó" dÒ*Ü#ØMóð ð +ð �:‰:œ×,Ñ,Ó,ÜÐRÓSÐSØ�:‰:Ñ!ð$Ø—j‘j× Ð ð �:‰:œ×*Ñ*Ó*Ø—;‘;Ñ*Ð*Ð*Ü˜tŸ{™{Ó+Ð+Ø�Z‰Zœ;×0Ñ0Ó0Ü!Ð"OÓPÐPÜ�L $§,¡,Ó/Ð/øô# ó 	áð	úñ !øÜ×)Ñ)ó $Ü(×2Ñ2�”
Ø#—‘ûð$üsd   ‚E„"C3 ¦7EÁD Á-DÁ.D Á2BEÃ3
D Ã=EÃ?D Ä EÄD ÄD>ÄD9Ä4EÄ9D>Ä>E)r|   rz   r}   ry   rs   r~   rx   r   rw   r{   rt   rv   ro   rp   rn   rm   rb   )r�   r   r‚   rL   rm   rY   rn   rY   ro   rY   rp   Úboolrq   rò   r/   r0   rg   )r/   r   )r/   r?   )rb   r?   r/   r0   )r/   rò   )r/   Úint)r/   ú
int | None)r/   Úfloat)r/   zResultType | None)r/   zBaseException | None)Nr«   )r›   rô   rž   rô   r/   r0   )rA   )r¯   ró   r/   r0   r¹   )rß   r   r/   r0   rQ   )rß   r   rå   zCallable[[Worker], None] | Noner/   r0   )r/   r0   )"r   r   r   r   r   ÚrichrÜ   Úautor   rh   r*   re   Úpropertyr�   rb   Úsetterr‘   r”   r—   r›   rž   r…   r¦   r(   r¬   r°   rÎ   rÑ   r»   rá   rê   rí   rð   r   r   r   r    r9   r9   v   sô  † áHà	‡Y�Y‡^�^ô�w u¸ñ ó ðð. ØØØ"Øñ*Fàð*Fð ð*Fð
 ð*Fð ð*Fð ð*Fð ð*Fð ð*Fð 
õ*FôX7ð óó ðð óó ðð ‡\�\óDó ðDð óó ðð ó1ó ð1ð ó
ó ð
ð ó%ó ð%ð ó!ó ð!ð óUó ðUð óó ðð óó ðð
 MOðUØ)ðUØ?IðUà	õUö'ô*DôXHô$

ô%ð@ JNð9Øð9Ø'Fð9à	õ9ô6#÷ 0r   )r/   r9   )0r   Ú
__future__r   rº   ÚenumrÅ   Úcontextvarsr   Ú	threadingr   Útimer   Útypingr   r   r	   r
   r   r   r   r   Ú	rich.reprrö   Útyping_extensionsr   Útextual.messager   Útextual.appr   Útextual.domr   r   Ú__annotations__rÛ   r   r"   r%   r4   r7   r=   ÚEnumr?   rK   rL   rN   rÜ   r÷   r9   r   r   r    Ú<module>r     s>  ðòõ #ã Û Û Ý "Ý Ý ÷	÷ 	ó 	ó Ý 'å #æÝÝ#ñ %/¨Ó$?€Ð!Ó ?Ø *ô%�Yô %ô"�)ô "ô@�;ô @ô4�Kô 4ô9�kô 9ôô"=�$—)‘)ô =ñ �\Ó"€
ð ØˆR�˜4  zÐ1Ñ2Ð2Ñ3ØˆR�ˆ^ÑØˆjÑðñ€ˆ)ó ð
 0÷ñ ð ‡�‡�˜€ÐôP0ˆW�ZÑ ó P0ó ñP0r   