
    Rh+"                     @    d Z ddlmZ ddlmZ ddlmZ  G d d      Zy))	TaskGroup   )events)
exceptions)tasksc                   R    e Zd ZdZd Zd Zd Zd ZddddZd	e	d
e
fdZd Zd Zy)r   a9  Asynchronous context manager for managing groups of tasks.

    Example use:

        async with asyncio.TaskGroup() as group:
            task1 = group.create_task(some_coroutine(...))
            task2 = group.create_task(other_coroutine(...))
        print("Both tasks have completed now.")

    All tasks are awaited when the context manager exits.

    Any exceptions other than `asyncio.CancelledError` raised within
    a task will cancel all remaining tasks and wait for them to exit.
    The exceptions are then combined and raised as an `ExceptionGroup`.
    c                     d| _         d| _        d| _        d | _        d | _        d| _        t               | _        g | _        d | _	        d | _
        y )NF)_entered_exiting	_aborting_loop_parent_task_parent_cancel_requestedset_tasks_errors_base_error_on_completed_futselfs    )/usr/lib/python3.12/asyncio/taskgroups.py__init__zTaskGroup.__init__   sN    
 (-%e!%    c                 x   dg}| j                   r'|j                  dt        | j                                 | j                  r'|j                  dt        | j                                | j                  r|j                  d       n| j
                  r|j                  d       dj                  |      }d| dS )	N ztasks=zerrors=
cancellingentered z
<TaskGroup>)r   appendlenr   r   r	   join)r   infoinfo_strs      r   __repr__zTaskGroup.__repr__(   s    t;;KK&T[[!1 234<<KK'#dll"3!456>>KK%]]KK	"88D>H:Q''r   c                   K   | j                   rt        d| d      | j                  t        j                         | _        t        j                  | j                        | _        | j                  t        d| d      d| _         | S w)N
TaskGroup z has already been enteredz! cannot determine the parent taskT)r	   RuntimeErrorr   r   get_running_loopr   current_taskr   r   s    r   
__aenter__zTaskGroup.__aenter__6   s     ==TH$=>@ @::002DJ!..tzz:$TH$EFH Hs   B	Bc                   K   d| _         |$| j                  |      r| j                  || _        |t        j                  u r|nd }| j
                  r| j                  j                         dk(  rd }|| j                  s| j                          | j                  rT| j                  | j                  j                         | _        	 | j                   d {    d | _        | j                  rT| j                  rJ | j                  | j                  |r| j                  s||-|t        j                  ur| j                  j                  |       | j                  r	 t!        d| j                        }|d y 7 # t        j                  $ r(}| j                  s|}| j                          Y d }~d }~ww xY w# d | _        w xY ww)NT    zunhandled errors in a TaskGroup)r
   _is_base_errorr   r   CancelledErrorr   r   uncancelr   _abortr   r   r   create_futurer   r   BaseExceptionGroup)r   etexctbpropagate_cancellation_errorexmes          r   	__aexit__zTaskGroup.__aexit__D   s    O##C(  ("D 222C 	%((  ))+q0 04,>>>  kk%%-)-)A)A)C&",,,, &*D"' kk* ;;'""" (..>b
(A(AALL$<<$'(I4<<Xd" ; -,, "~~ 460KKM"H  $sa   CGE= E;E= G/A1G!F; :G;E= =F8F3.G3F88G;	GGN)namecontextc                   | j                   st        d| d      | j                  r| j                  st        d| d      | j                  rt        d| d      || j
                  j                  |      }n| j
                  j                  ||      }t        j                  ||       |j                         r| j                  |       |S | j                  j                  |       |j                  | j                         |S )zbCreate a new task in this group and return it.

        Similar to `asyncio.create_task`.
        r&   z has not been enteredz is finishedz is shutting down)r;   )r	   r'   r
   r   r   r   create_taskr   _set_task_namedone_on_task_doneaddadd_done_callback)r   coror:   r;   tasks        r   r=   zTaskGroup.create_task   s    
 }}D83HIJJ==D8<@AA>>D83DEFF?::))$/D::))$)@DT4( 99;t$  KKOOD!""4#5#56r   r4   returnc                 R    t        |t              sJ t        |t        t        f      S )N)
isinstanceBaseException
SystemExitKeyboardInterrupt)r   r4   s     r   r-   zTaskGroup._is_base_error   s%    #}---#
,=>??r   c                 v    d| _         | j                  D ]#  }|j                         r|j                          % y )NT)r   r   r?   cancel)r   ts     r   r0   zTaskGroup._abort   s.     	A668
	r   c                    | j                   j                  |       | j                  A| j                   s5| j                  j                         s| j                  j	                  d       |j                         ry |j                         }|y | j                  j                  |       | j                  |      r| j                  || _
        | j                  j                         r1| j                  j                  d|d| j                   d||d       y | j                  s?| j                  s2| j!                          d| _        | j                  j#                          y y y )NTzTask z% has errored out but its parent task z is already completed)message	exceptionrD   )r   discardr   r?   
set_result	cancelledrP   r   r   r-   r   r   r   call_exception_handlerr   r   r0   rL   )r   rD   r4   s      r   r@   zTaskGroup._on_task_done   s3   D!!!-dkk))..0&&11$7>>nn;C s#(8(8(@"D!!# JJ--"4( +##'#4#4"55JL 	/  ~~d&C&C& KKM,0D)$$&+ 'D~r   )__name__
__module____qualname____doc__r   r$   r*   r9   r=   rH   boolr-   r0   r@    r   r   r   r      sI    
&(O$b )-d <@- @D @2'r   r   N)__all__r   r   r   r   r   rZ   r   r   <module>r\      s!   
    d' d'r   