
    AHj                        d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlZddlmZmZmZ e	rddlmZ dd	lmZ ej.                  j1                  d
       G d d             Zy)z
Contains `WorkerManager`, a class to manage [workers](/guide/workers) for an app.

You access this object via [App.workers][textual.app.App.workers] or [Widget.workers][textual.dom.DOMNode.workers].
    )annotationsN)Counter)
attrgetter)TYPE_CHECKINGAnyIterableIterator)WorkerWorkerStateWorkType)App)DOMNodeT)angularc                      e Zd ZdZddZddZddZddZddZddZ	ddZ
	 d	 	 	 	 	 	 	 dd
Zdddd	d	ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd dZd!dZd!dZd"dZd#dZd$d%dZy)&WorkerManagerzAn object to manager a number of workers.

    You will not have to construct this class manually, as widgets, screens, and apps
    have a worker manager accessibly via a `workers` attribute.
    c                2    || _         	 t               | _        y)zVInitialize a worker manager.

        Args:
            app: An App instance.
        N)_appset_workers)selfapps     N/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/worker_manager.py__init__zWorkerManager.__init__   s     	%%(U(    c              #     K   t               }|j                  d | j                  D               t        |j	                               D ]  \  }}|j
                  |f  y w)Nc              3  4   K   | ]  }|j                     y wN)state).0workers     r   	<genexpr>z.WorkerManager.__rich_repr__.<locals>.<genexpr>,   s     @v||@s   )r   updater   sorteditemsname)r   counterr   counts       r   __rich_repr__zWorkerManager.__rich_repr__*   sP     (/	@$--@@"7==?3 	$LE5**e##	$s   AA!c                T    t        t        | j                  t        d                  S )N_created_time)keyiterr#   r   r   r   s    r   __iter__zWorkerManager.__iter__0   s    F4==j.IJKKr   c                V    t        t        | j                  t        d      d            S )Nr*   T)r+   reverser,   r.   s    r   __reversed__zWorkerManager.__reversed__3   s$    4==j&A4P
 	
r   c                ,    t        | j                        S r   )boolr   r.   s    r   __bool__zWorkerManager.__bool__8   s    DMM""r   c                ,    t        | j                        S r   )lenr   r.   s    r   __len__zWorkerManager.__len__;   s    4==!!r   c                    || j                   v S r   )r   r   r    s     r   __contains__zWorkerManager.__contains__>   s    &&r   Tc                    |r2|j                   r&| j                  |j                  |j                          | j                  j	                  |       |r'|j                  | j                  | j                         yy)zAdd a new worker.

        Args:
            worker: A Worker instance.
            start: Start the worker if True, otherwise the worker must be started manually.
            exclusive: Cancel all workers in the same group as `worker`.
        N)groupcancel_groupnoder   add_startr   _remove_worker)r   r    start	exclusives       r   
add_workerzWorkerManager.add_workerA   sW     fkk6<<8&!MM$))T%8%89 r    defaultF)r%   r=   descriptionexit_on_errorrC   rD   threadc          	         t        |||xs t        |dd      xs d||xs t        |      ||	      }
| j                  |
||       |
S )ac  Create a worker from a function, coroutine, or awaitable.

        Args:
            work: A callable, a coroutine, or other awaitable.
            name: A name to identify the worker.
            group: The worker group.
            description: A description of the worker.
            exit_on_error: Exit the app if the worker raises an error. Set to `False` to suppress exceptions.
            start: Automatically start the worker.
            exclusive: Cancel all workers in the same group.
            thread: Mark the worker as a thread worker.

        Returns:
            A Worker instance.
        __name__rF   )r%   r=   rH   rI   rJ   )rC   rD   )r
   getattrreprrE   )r   workr?   r%   r=   rH   rI   rC   rD   rJ   r    s              r   _new_workerzWorkerManager._new_workerQ   sX    8 %<z26<"#1tDz'
 	eyAr   c                :    | j                   j                  |       y)z`Remove a worker from the manager.

        Args:
            worker: A Worker instance.
        N)r   discardr:   s     r   rB   zWorkerManager._remove_workery   s     	f%r   c                r    | j                   D ](  }|j                  | j                  | j                         * y)zStart all the workers.N)r   rA   r   rB   r:   s     r   	start_allzWorkerManager.start_all   s-    mm 	:FMM$))T%8%89	:r   c                F    | j                   D ]  }|j                           y)zCancel all workers.N)r   cancelr:   s     r   
cancel_allzWorkerManager.cancel_all   s    mm 	FMMO	r   c                    | j                   D cg c]"  }|j                  |k(  r|j                  |k(  r|$ }}|D ]  }|j                           |S c c}w )zCancel a single group.

        Args:
            node: Worker DOM node.
            group: A group name.

        Returns:
            A list of workers that were cancelled.
        )r   r=   r?   rV   )r   r?   r=   r    workerss        r   r>   zWorkerManager.cancel_group   s`     --
%&++*= 
 

  	FMMO	
s   'Ac                    | j                   D cg c]  }|j                  |k(  s| }}|D ]  }|j                           |S c c}w )zCancel all workers associated with a given node

        Args:
            node: A DOM node (widget, screen, or App).

        Returns:
            List of cancelled workers.
        )r   r?   rV   )r   r?   r    rY   s       r   cancel_nodezWorkerManager.cancel_node   sI     )-Mf9L6MM 	FMMO	 Ns
   AANc                   K   	 t        j                  |xs | D cg c]  }|j                          c}  d{    yc c}w 7 
# t         j                  $ r Y yw xY ww)zWait for workers to complete.

        Args:
            workers: An iterable of workers or None to wait for all workers in the manager.
        N)asynciogatherwaitCancelledError)r   rY   r    s      r   wait_for_completezWorkerManager.wait_for_complete   sO     	..4"QV6;;="QRRR"QR%% 		s?   AA ?A AA AA AAAA)r   r   returnNone)rb   zrich.repr.Result)rb   zIterator[Worker[Any]])rb   r4   )rb   int)r    objectrb   r4   )TT)r    r
   rC   r4   rD   r4   rb   rc   )rO   r   r?   r   r%   z
str | Noner=   strrH   rf   rI   r4   rC   r4   rD   r4   rJ   r4   rb   r
   )r    r
   rb   rc   )rb   rc   )r?   r   r=   rf   rb   list[Worker])r?   r   rb   rg   r   )rY   zIterable[Worker] | Nonerb   rc   )rL   
__module____qualname____doc__r   r(   r/   r2   r5   r8   r;   rE   rP   rB   rT   rW   r>   r[   ra    r   r   r   r      s    	)$L

#"' EI::%):=A:	:* "&& &
 & & & & & & & 
&P&:

&	r   r   )rj   
__future__r   r]   collectionsr   operatorr   typingr   r   r   r	   	rich.reprrichtextual.workerr
   r   r   textual.appr   textual.domr   rN   autor   rk   r   r   <module>rv      s[    #    9 9  8 8# ] ] ]r   