
    xai%d                        d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ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 ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z$ dZ%dZ&dZ' edd      Z(ddZ) G d de*      Z+ G d d      Z,y)z/Sending/Receiving Messages (Kombu integration).    N)
namedtuple)Mapping)	timedelta)WeakValueDictionary)
ConnectionConsumerExchangeProducerQueuepools)	Broadcast)
maybe_list)cached_property)signals)anon_nodename)saferepr)indent)maybe_make_aware   )routes)AMQPQueuestask_messagei   zS
.> {0.name:<16} exchange={0.exchange.name}({0.exchange.type}) key={0.routing_key}
r   headers
propertiesbody
sent_eventc                     | j                         D ci c])  \  }}t        |t              r|j                  |      n||+ c}}S c c}}w N)items
isinstancebytesdecode)dencodingkvs       a/var/www/html/BankruptcyAI-uat/bankruptcy-ai/venv/lib/python3.12/site-packages/celery/app/amqp.pyutf8dictr*   $   sE    	#1 #-Q"6AHHXAq@ # # #s   .Ac                        e Zd ZdZdZ	 	 	 	 d fd	Z fdZ fdZd Zd Z	d Z
d	 Zd
 ZddZd Zd Zd Zd Zed        Z xZS )r   u  Queue name⇒ declaration mapping.

    Arguments:
        queues (Iterable): Initial list/tuple or dict of queues.
        create_missing (bool): By default any unknown queues will be
            added automatically, but if this flag is disabled the occurrence
            of unknown queues in `wanted` will raise :exc:`KeyError`.
        create_missing_queue_type (str): Type of queue to create for missing queues.
            Must be either 'classic' (default) or 'quorum'. If set to 'quorum',
            the broker will declare new queues using the quorum type.
        create_missing_queue_exchange_type (str): Type of exchange to use
            when creating missing queues. If not set, the default exchange type
            will be used. If set, the exchange type will be set to this value
            when creating missing queues.
        max_priority (int): Default x-max-priority for queues with none set.
    Nc	                    t         |           t               | _        || _        || _        || _        || _        || _        |t        n|| _
        || _        |*t        |t              s|D 	ci c]  }	|	j                  |	 }}	|xs i }|j                         D ]9  \  }
}	t        |	t               r| j#                  |	      n | j$                  |
fi |	 ; y c c}	w r    )super__init__r   aliasesdefault_exchangedefault_routing_keycreate_missingcreate_missing_queue_type"create_missing_queue_exchange_typer	   autoexchangemax_priorityr"   r   namer!   r   add
add_compat)selfqueuesr0   r2   r3   r4   r5   r6   r1   qr7   	__class__s              r)   r.   zQueues.__init__?   s     	*, 0#6 ,)B&2T/(4(<H,(j&A)/0Aaffai0F02||~ 	PGD!%a/DHHQK_T__T5OQ5O	P 1s   .Cc                 `    	 | j                   |   S # t        $ r t        |   |      cY S w xY wr    )r/   KeyErrorr-   __getitem__)r:   r7   r=   s     r)   r@   zQueues.__getitem__T   s6    	-<<%% 	-7&t,,	-s    --c                     | j                   r|j                  s| j                   |_        t        |   ||       |j                  r|| j
                  |j                  <   y y r    )r0   exchanger-   __setitem__aliasr/   )r:   r7   queuer=   s      r)   rC   zQueues.__setitem__Z   sL      !22END%(;;(-DLL%     c                 p    | j                   r | j                  | j                  |            S t        |      r    )r2   r8   new_missingr?   )r:   r7   s     r)   __missing__zQueues.__missing__a   s/    88D,,T233tnrF   c                 j    t        |t              s | j                  |fi |S | j                  |      S )a  Add new queue.

        The first argument can either be a :class:`kombu.Queue` instance,
        or the name of a queue.  If the former the rest of the keyword
        arguments are ignored, and options are simply taken from the queue
        instance.

        Arguments:
            queue (kombu.Queue, str): Queue to add.
            exchange (kombu.Exchange, str):
                if queue is str, specifies exchange name.
            routing_key (str): if queue is str, specifies binding key.
            exchange_type (str): if queue is str, specifies type of exchange.
            **options (Any): Additional declaration options used when
                queue is a str.
        )r"   r   r9   _add)r:   rE   kwargss      r)   r8   z
Queues.addf   s3    " %'"4??53F33yyrF   c                     |j                  d|j                  d             |d   ||d<   | j                  t        j                  |fi |      S )Nrouting_keybinding_key)
setdefaultgetrK   r   	from_dict)r:   r7   optionss      r)   r9   zQueues.add_compat{   sM    ='++m*DE=!)%)GM"yy99::rF   c                 >   |j                   |j                   j                  dk(  r| j                  |_         |j                  s| j                  |_        | j
                  .|j                  i |_        | j                  |j                         || |j                  <   |S )N )rB   r7   r0   rN   r1   r6   queue_arguments_set_max_priority)r:   rE   s     r)   rK   zQueues._add   s    >>!U^^%8%8B%>!22EN   $ 8 8E($$,(*%""5#8#89 UZZrF   c                 `    d|vr*| j                   |j                  d| j                   i      S y y )Nzx-max-priority)r6   update)r:   argss     r)   rW   zQueues._set_max_priority   s9    4'D,=,=,I;; 0$2C2CDEE -J'rF   c                 L   | j                   }|syt        |j                               D cg c](  \  }}t        j	                         j                  |      * }}}|rt        dj                  |      |      S |d   dz   t        dj                  |dd       |      z   S c c}}w )z/Format routing table into string for log dumps.rU   
r   r   N)consume_fromsortedr!   QUEUE_FORMATstripformat
textindentjoin)r:   r   indent_firstactive_r<   infos          r)   ra   zQueues.format   s    """6<<>24Aq ""$++A. 4 4diiov66Aw~
499T!"X+> GGG	4s   -B c                 v     | j                   |fi |}| j                  || j                  |j                  <   |S )zAdd new task queue that'll be consumed from.

        The queue will be active even when a subset has been selected
        using the :option:`celery worker -Q` option.
        )r8   _consume_fromr7   )r:   rE   rL   r<   s       r)   
select_addzQueues.select_add   s>     DHHU%f%))*Dqvv&rF   c                 X    |r#t        |      D ci c]  }|| |   
 c}| _        yyc c}w )zSelect a subset of currently defined queues to consume from.

        Arguments:
            include (Sequence[str], str): Names of queues to consume from.
        N)r   ri   )r:   includer7   s      r)   selectzQueues.select   s7     -7-@"%)d4j "D "s   'c                     rUt              | j                  | j                  fd| D              S D ]  }| j                  j                  |d         yy)zDeselect queues so that they won't be consumed from.

        Arguments:
            exclude (Sequence[str], str): Names of queues to avoid
                consuming from.
        Nc              3   ,   K   | ]  }|vs|  y wr     ).0r'   excludes     r)   	<genexpr>z"Queues.deselect.<locals>.<genexpr>   s     "Gaw6F1"Gs   	)r   ri   rm   pop)r:   rr   rE   s    ` r)   deselectzQueues.deselect   s]      )G!!){{"Gd"GGG  4""&&ud34 rF   c                 ,   d }| j                   rD| j                   dk7  r5| j                   dvrt        d| j                    d      d| j                   i}| j                  rt        || j                        }n| j	                  |      }t        ||||      S )Nclassic)rw   quorumzInvalid queue type 'z*'. Valid types are 'classic' and 'quorum'.x-queue-type)rV   )r3   
ValueErrorr4   r	   r5   r   )r:   r7   rV   rB   s       r)   rH   zQueues.new_missing   s    ))d.L.LPY.Y--5JJ *4+I+I*J K> >   .t/M/MNO22d&M&MNH((.HT8T?KKrF   c                 6    | j                   | j                   S | S r    )ri   r:   s    r)   r]   zQueues.consume_from   s    )%%%rF   )NNTNNNNN)r   T)__name__
__module____qualname____doc__ri   r.   r@   rC   rI   r8   r9   rK   rW   ra   rj   rm   ru   rH   propertyr]   __classcell__)r=   s   @r)   r   r   )   sv    & M 15;?BF37	P*-.
 *;
F	H		4 L"  rF   r   c                      e Zd ZdZeZeZeZeZeZ	dZ
dZdZdZdZd Zed        Zed        Z	 	 ddZddZd	 Zdd
Z	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 ddZd Zd Zed        Zed        Zej8                  d        Zed        Zed        Zej8                  d        Zed        Z e Z!ed        Z"ed        Z#ed        Z$d Z%y)r   zApp AMQP API: app.amqp.Ni   c                     || _         | j                  | j                  d| _        | j                   j                  j                  | j                         y )N)r      )app
as_task_v1
as_task_v2task_protocols_confbind_to_handle_conf_update)r:   r   s     r)   r.   zAMQP.__init__   s?    
 	t778rF   c                 \    | j                   | j                  j                  j                     S r    )r   r   conftask_protocolr|   s    r)   create_task_messagezAMQP.create_task_message  s!    ""488==#>#>??rF   c                 "    | j                         S r    )_create_task_senderr|   s    r)   send_task_messagezAMQP.send_task_message  s    ''))rF   c           
         | j                   j                  }|j                  }||j                  }||j                  }||j
                  }||j                  }|sE|j                  r9d }	|j                  dk(  rddi}	t        |j                  | j                  ||	      f}|| j                  n|}| j                  || j                  ||||||      S )Nrx   ry   )rB   rN   rV   )r0   r2   r3   r4   r5   r6   r1   )r   r   task_default_routing_keytask_create_missing_queuestask_create_missing_queue_type'task_create_missing_queue_exchange_typetask_queue_max_prioritytask_default_queuetask_default_queue_typer   r0   r5   
queues_cls)
r:   r;   r2   r3   r4   r5   r6   r   r1   rV   s
             r)   r   zAMQP.Queues  s     xx}}";;!!<<N$,(,(K(K%-5151]1].77L$11"O++x7#18"<D33%)%:%:(;,;= ?F .:-A))) 	!22)&?/Q%% 3  	
 		
rF   c                     t        j                  | j                  |xs | j                  | j                  j                  d|      | j                        S )zReturn the current task router.r   )r   )_routesRouterr   r;   r   either)r:   r;   r2   s      r)   r   zAMQP.Router.  sC    ~~dkk6+@T[["hhoo.J.<>CG88M 	MrF   c                 t    t        j                  | j                  j                  j                        | _        y r    )r   preparer   r   task_routes_rtabler|   s    r)   flush_routeszAMQP.flush_routes4  s     txx}}'@'@ArF   c                     | | j                   j                  j                  } | j                  |f||xs- t	        | j
                  j                  j                               d|S )N)acceptr;   )r   r   accept_contentr   listr;   r]   values)r:   channelr;   r   kws        r)   TaskConsumerzAMQP.TaskConsumer7  sb    >XX]]11Ft}}
"DT$++":":"A"A"CD
 
 	
rF   c                 |   |xs d}|xs i }t        |t        t        f      st        d      t        |t              st        d      |rd| j                  |d       |xs | j                  j                         }|xs | j                  j                  }t        |t        |      z   |      }t        |	t        j                        rd| j                  |	d       |xs | j                  j                         }|xs | j                  j                  }t        |t        |	      z   |      }	t        |t              s|xr |j                         }t        |	t              s|	xr |	j                         }	|t        || j                         }|t        || j"                        }|s|}|xs g D ci c]  }|||   
 } }i dd	d
|d|d|d|d|	d|d|d|
d||gd|d|d|d|d|xs
 t%               d|d||| d}!t'        |!||xs dd||||||df|r|||||||
||	d	      S d       S c c}w )Nrp   !task args must be a list or tuple(task keyword arguments must be a mapping	countdownseconds)tzexpireslangpytaskidshadowetagroupgroup_indexretries	timelimitroot_id	parent_idargsrepr
kwargsreproriginignore_resultreplaced_task_nesting)stamped_headersstampsrU   correlation_idreply_to)	callbackserrbackschainchord)	uuidr   r   r7   rZ   rL   r   r   r   r   )r"   r   tuple	TypeErrorr   _verify_secondsr   nowtimezoner   r   numbersRealstr	isoformatr   argsrepr_maxsizekwargsrepr_maxsizer   r   )"r:   task_idr7   rZ   rL   r   r   group_idr   r   r   r   r   r   r   
time_limitsoft_time_limitcreate_sent_eventr   r   r   r   r   r   r   r   r   r   r   r   rS   headerr   r   s"                                     r)   r   zAMQP.as_task_v2@  s    zr2$u.?@@&'*FGG  K8'C4488#4#4H"i	22xC gw||,  )4'C4488#4#4H&i00XG #s#)#--/C'3'5'"3"3"5Gd&;&;<H!&$*A*ABJG8G8M2Nf&'&/)NN
D
D
 '
 f	

 3
 w
 X
 ;
 w
 *o6
 w
 
 
 *
 f/
  ]!
" $%:#
$  /'
, ")$N
 f!* (""	$ #  "& $""

 	
0 )-1
 	
/ Os   1H9c                    |xs d}|xs i }| j                   }t        |t        t        f      st	        d      t        |t
              st	        d      |r?| j                  |d       |xs | j                  j                         }|t        |      z   }t        |	t        j                        r?| j                  |	d       |xs | j                  j                         }|t        |	      z   }	|xr |j                         }|	xr |	j                         }	t        i ||xs dd|||||||
||	|||||f||d	|r!||t        |      t        |      |
||	d
      S d       S )Nrp   r   r   r   r   r   rU   r   )r   r   rZ   rL   r   r   r   r   r   utcr   r   r   tasksetr   )r   r7   rZ   rL   r   r   r   r   )r   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   )r:   r   r7   rZ   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   compat_kwargsr   s                            r)   r   zAMQP.as_task_v1  sz    zr2hh$u.?@@&'*FGG  K8'C	)44Cgw||,  )4'CIg66G%cmmo1g//1")$N
  !*""&$(/:#2 #   "6*""/ 
  	
> )-? 
  	
rF   c                 8    |t         k  rt        | d|      |S )Nz is out of range: )INT_MINrz   )r:   swhats      r)   r   zAMQP._verify_seconds  s%    w;v%7u=>>rF   c                 v  	
 | j                   j                  j                  
| j                   j                  j                  | j                   j                  j                  | j
                  	| j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  | j                  | j                  | j                   j                  j                  | j                   j                  j                   | j                   j                  j"                  	 	 	 	 	 	 	 d	
fd	}|S )Nc                 $   |#n|}|\  }}}}|r|j                  |       |r|j                  |       |}||"}|$t        |t              r|&|   }}n|j                  }|
	 |j                  j
                  }
|
xs }
|	 |j                  j                  }|r|s
|dk(  rd|}}n0|.|j                  j                  xs  }|xs |j                  xs $}||rt        |t              s|g}|#n|}|rt        !fi |n!}r (||||||||        | j                  |f|||	xs %|xs |||
||||d|}r '|||||       *rMt        |t              r )||d   ||d   |d   |d	   |d
          n )||d   ||d   |d   |d	   |d          |rO|xs }|}t        |t              r|j                  }|j                  |||d       |j                  d|| ||       |S # t        $ r Y w xY w# t        $ r d}Y sw xY w)NdirectrU   )senderr   rB   rN   declarer   r   retry_policy)rB   rN   
serializercompressionretryr   delivery_moder   r   timeoutconfirm_timeout)r   r   r   rB   rN   r   r   r   r   r   )r   r   r   rZ   rL   r   r   rZ   rL   r   )rE   rB   rN   z	task-sent)r   r   )rY   r"   r   r7   rB   r   AttributeErrortyperN   r   dictpublishr   r	   )+producerr7   messagerB   rN   rE   event_dispatcherr   r   r   r   r   r   r   exchange_typer   r   rL   headers2r   r   r   qname_rpretevdexnameafter_receiversbefore_receiversdefault_compressordefault_delivery_modedefault_evdr0   default_policydefault_queuedefault_retrydefault_rkeydefault_serializerr;   send_after_publishsend_before_publishsend_task_sentsent_receiverss+                              r)   r   z3AMQP._create_task_sender.<locals>.send_task_message  s    &+]ME5<2Hj$
(!!&)E}!1% eS)#(&-5E!JJE$$)NN$@$@M !. F1F$-$)NN$7$7M
 K]h5N(*E+! >>..B2B)NU->->N,5E91M ' &+]ME;G47,7&   #d%;#X)	 #(""!'%;);'=+=#+W  C "$T8,4+OdE*"#Xd^$!!WT!W$UOXg5F ##T$Zd!&\$x. Ki
 &5+!fh/#[[F!!" &#.# 
 K$E  NJQ &  & -$,M-s$   &G0 H  0	G=<G= HH)NNNNNNNNNNNNNN)r   r   task_publish_retrytask_publish_retry_policytask_default_delivery_moder
  r;   r   before_task_publishsend	receiversafter_task_publish	task_sent_event_dispatcherr0   r   task_serializertask_compression)r:   r   r  r  r  r  r  r0   r	  r
  r  r  r  r;   r  r  r  r  s     @@@@@@@@@@@@@@@@r)   r   zAMQP._create_task_sender  sA   88@@ $ H H**%99>>"66@@$77<<!44>> **// **44,,00xx}}==!XX]]::!XX]];; FJ/37;=A8<:><@c	 c	 c	H ! rF   c                 \    | j                   | j                  j                  j                     S r    )r;   r   r   r   r|   s    r)   r
  zAMQP.default_queueZ  s    {{488==;;<<rF   c                 `    | j                  | j                  j                  j                        S )u"   Queue name⇒ declaration mapping.)r   r   r   task_queuesr|   s    r)   r;   zAMQP.queues^  s!     {{488==4455rF   c                 $    | j                  |      S r    )r   )r:   r;   s     r)   r;   zAMQP.queuesc  s    {{6""rF   c                 R    | j                   | j                          | j                   S r    )r   r   r|   s    r)   r   zAMQP.routesg  s"    <<||rF   c                 "    | j                         S r    )r   r|   s    r)   routerzAMQP.routerm  s    {{}rF   c                     |S r    rp   )r:   values     r)   r#  zAMQP.routerq  s    rF   c                     | j                   _t        j                  | j                  j	                            | _         | j                  j
                  j                  | j                   _        | j                   S r    )_producer_poolr   	producersr   connection_for_writepoollimitr|   s    r)   producer_poolzAMQP.producer_poolu  sW    &"'//--/#1D(,(;(;D%"""rF   c                     t        | j                  j                  j                  | j                  j                  j                        S r    )r	   r   r   task_default_exchangetask_default_exchange_typer|   s    r)   r0   zAMQP.default_exchange~  s2    ;;@@B 	BrF   c                 B    | j                   j                  j                  S r    )r   r   
enable_utcr|   s    r)   r   zAMQP.utc  s    xx}}'''rF   c                 N    | j                   j                  j                  d      S )NF)enabled)r   events
Dispatcherr|   s    r)   r  zAMQP._event_dispatcher  s      xx))%)88rF   c                 ^    d|v sd|v r%| j                          | j                         | _        y )Nr   )r   r   r#  )r:   rZ   rL   s      r)   r   zAMQP._handle_conf_update  s-    V#}'<++-DKrF   )NNNNN)NN)NNNNNNNr   NNNNNNFNNNNNNNFNNNr   )NNNNNNNr   NNNNNNFNNNNN)&r}   r~   r   r   r   r   r
   BrokerConnectionr   r   r   r'  r5   r   r   r.   r   r   r   r   r   r   r   r   r   r   r
  r;   setterr   r   r#  r,  publisher_poolr0   r   r  r   rp   rF   r)   r   r      s   !JHH "J G N L  9 @ @ * * MQX\!
FMB
 ;?HL26;?48DH?Cei)*\
| ;?HL)*GK48DH37:
x
y!v = = 6 6 ]]# #  
   ]]  # # #NB B ( ( 9 9
rF   r   )zutf-8)-r   r   collectionsr   collections.abcr   datetimer   weakrefr   kombur   r   r	   r
   r   r   kombu.commonr   kombu.utils.functionalr   kombu.utils.objectsr   celeryr   celery.utils.nodenamesr   celery.utils.safereprr   celery.utils.textr   rb   celery.utils.timer   rU   r   r   __all__r   r_   r   r*   r   r   r   rp   rF   r)   <module>rH     s}    5  " #  ' H H " - /  0 * 2 . 
, 
 .IK#
oT odv vrF   