Ë
    ˜V.j8  ã                   óˆ  — d Z ddlZddlmZ ddlmZmZ ddl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ZdZ G d„ de«      Z G d„ d«      Z	 	 d#d„Zd$d„Zd„ Zeddfd„Zd„ Z	 	 d%d„Zd„ Zd„ Z d„ Z!d„ Z" G d„ d«      Z#	 	 	 	 d&d„Z$d„ Z%d„ Z&d „ Z'd!„ Z( eee¬"«      Z) ee%e¬"«      Z* ee&e¬"«      Z+ ee'e¬"«      Z,y)'z,Message migration tools (Broker <-> Broker).é    N)Úpartial)ÚcycleÚislice)ÚQueueÚ	eventloop)Úmaybe_declare)Úensure_bytes)Úapp_or_default)Úworker_direct)Ústr_to_list)ÚStopFilteringÚStateÚ	republishÚmigrate_taskÚmigrate_tasksÚmoveÚ
task_id_eqÚ
task_id_inÚstart_filterÚmove_task_by_idÚmove_by_idmapÚmove_by_taskmapÚmove_directÚmove_direct_by_idzGMoving task {state.filtered}/{state.strtotal}: {body[task]}[{body[id]}]c                   ó   — e Zd ZdZy)r   z*Semi-predicate used to signal filter stop.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úXC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\celery/contrib/migrate.pyr   r      s   „ Ú4r!   r   c                   ó2   — e Zd ZdZdZdZdZed„ «       Zd„ Z	y)r   zMigration progress state.r   c                 óF   — | j                   syt        | j                   «      S )NÚ?)Ú	total_apxÚstr©Úselfs    r"   ÚstrtotalzState.strtotal&   s   € à�~Š~ØÜ�4—>‘>Ó"Ð"r!   c                 ón   — | j                   rd| j                   › �S | j                  › d| j                  › �S )NÚ^Ú/)ÚfilteredÚcountr*   r(   s    r"   Ú__repr__zState.__repr__,   s3   € Ø�=Š=Ø�t—}‘}�oÐ&Ð&Ø—*‘*�˜Q˜tŸ}™}˜oÐ.Ð.r!   N)
r   r   r   r   r/   r.   r&   Úpropertyr*   r0   r    r!   r"   r   r      s+   „ Ù#à€EØ€HØ€Iàñ#ó ð#ó
/r!   r   c                 ó¶  — |sg d¢}t        |j                  «      }|j                  |j                  |j                  }}}|€|d   n|}|€|d   n|}|j
                  |j                  }
}	|j                  dd«      }|j                  dd«      }|�t        |«      nd}|D ]  }|j                  |d«       Œ  | j                  t        |«      f|||||	|
|dœ|¤Ž y)zRepublish message.)Úapplication_headersÚcontent_typeÚcontent_encodingÚheadersNÚexchangeÚrouting_keyÚcompressionÚ
expiration)r7   r8   r9   r6   r4   r5   r:   )
r	   ÚbodyÚdelivery_infor6   Ú
propertiesr4   r5   ÚpopÚfloatÚpublish)ÚproducerÚmessager7   r8   Úremove_propsr;   Úinfor6   ÚpropsÚctypeÚencr9   r:   Úkeys                 r"   r   r   2   sø   € ñ ò7ˆä˜Ÿ™Ó%€DØ#×1Ñ1Ø#ŸO™O¨W×-?Ñ-?ð ˆ'€Dà#+Ð#3ˆt�JÒ¸€HØ)4Ð)<�$�}Ò%À+€KØ×%Ñ% w×'?Ñ'?ˆ3€Eð —+‘+˜m¨TÓ2€Kà—‘˜<¨Ó.€Jà&0Ð&<”�zÔ"À$€JãˆØ�	‰	�#�tÕð ð €H×Ñ”\ $Ó'ð °(Ø!,¸+Ø$°5Ø&)°jñð ó	r!   c           	      óŽ   — |j                   }|€i n|}t        | ||j                  |d   «      |j                  |d   «      ¬«       y)zMigrate single task message.Nr7   r8   ©r7   r8   )r<   r   Úget)rA   Úbody_rB   ÚqueuesrD   s        r"   r   r   P   sF   € à× Ñ €DØ�>‰R v€FÜˆh˜Ø—z‘z $ zÑ"2Ó3Ø Ÿ*™* T¨-Ñ%8Ó9ö;r!   c                 ó   ‡ ‡— ˆ ˆfd„}|S )Nc                 ó*   •— ‰r| d   ‰vry  ‰| |«      S ©NÚtaskr    )r;   rB   ÚcallbackÚtaskss     €€r"   r.   z!filter_callback.<locals>.filtered[   s!   ø€ Ù�T˜&‘\¨Ñ.Øá˜˜gÓ&Ð&r!   r    )rR   rS   r.   s   `` r"   Úfilter_callbackrT   Y   s   ù€ õ'ð
 €Or!   c                 ó¶   ‡‡— t        |«      }t        ‰«      Š|j                  j                  |d¬«      Št	        |‰‰¬«      }ˆˆfd„}t        || |f‰|dœ|¤ŽS )z)Migrate tasks from one broker to another.F)Úauto_declare©rM   c                 óØ  •—  | ‰j                   «      }‰j                  | j                  | j                  «      |_        |j                  | j                  k(  r+‰j                  | j                  |j                  «      |_        |j                  j                  | j                  k(  r5‰j                  | j                  | j                  «      |j                  _        |j                  «        y ©N)ÚchannelrK   Únamer8   r7   Údeclare)ÚqueueÚ	new_queuerA   rM   s     €€r"   Úon_declare_queuez'migrate_tasks.<locals>.on_declare_queuek   s¥   ø€ Ù˜(×*Ñ*Ó+ˆ	ØŸ™ E§J¡J°·
±
Ó;ˆ	ŒØ× Ñ  E§J¡JÒ.Ø$*§J¡J¨u¯z©zØ/8×/DÑ/Dó%FˆIÔ!à×Ñ×"Ñ" e§j¡jÒ0Ø&,§j¡j°·±¸U¿Z¹ZÓ&HˆI×ÑÔ#Ø×ÑÕr!   )rM   r_   )r
   Úprepare_queuesÚamqpÚProducerr   r   )ÚsourceÚdestÚmigrateÚapprM   Úkwargsr_   rA   s       `  @r"   r   r   c   sp   ù€ ô ˜Ó
€CÜ˜FÓ#€FØ�x‰x× Ñ  °EÐ Ó:€HÜ�g˜x°Ô7€Gõô ˜˜V Wð E°VØ)9ñEØ=CñEð Er!   c                 óX   — t        |t        «      r| j                  j                  |   S |S rY   )Ú
isinstancer'   ra   rM   )rf   Úqs     r"   Ú_maybe_queuerk   y   s$   € Ü�!”SÔØ�x‰x�‰˜qÑ!Ð!Ø€Hr!   c	           
      óN  ‡ ‡‡‡‡‡‡‡‡— t        |«      }|xs g D �
cg c]  }
t        ||
«      ‘Œ c}
xs d}|j                  |d¬«      5 Š|j                  j	                  ‰«      Št        «       Šˆˆˆˆˆ ˆˆˆˆf	d„}t        |‰|fd|i|	¤Žcddd«       S c c}
w # 1 sw Y   yxY w)aG	  Find tasks by filtering them and move the tasks to a new queue.

    Arguments:
        predicate (Callable): Filter function used to decide the messages
            to move.  Must accept the standard signature of ``(body, message)``
            used by Kombu consumer callbacks.  If the predicate wants the
            message to be moved it must return either:

                1) a tuple of ``(exchange, routing_key)``, or

                2) a :class:`~kombu.entity.Queue` instance, or

                3) any other true value means the specified
                    ``exchange`` and ``routing_key`` arguments will be used.
        connection (kombu.Connection): Custom connection to use.
        source: List[Union[str, kombu.Queue]]: Optional list of source
            queues to use instead of the default (queues
            in :setting:`task_queues`).  This list can also contain
            :class:`~kombu.entity.Queue` instances.
        exchange (str, kombu.Exchange): Default destination exchange.
        routing_key (str): Default destination routing key.
        limit (int): Limit number of messages to filter.
        callback (Callable): Callback called after message moved,
            with signature ``(state, body, message)``.
        transform (Callable): Optional function to transform the return
            value (destination) of the filter function.

    Also supports the same keyword arguments as :func:`start_filter`.

    To demonstrate, the :func:`move_task_by_id` operation can be implemented
    like this:

    .. code-block:: python

        def is_wanted_task(body, message):
            if body['id'] == wanted_id:
                return Queue('foo', exchange=Exchange('foo'),
                             routing_key='foo')

        move(is_wanted_task)

    or with a transform:

    .. code-block:: python

        def transform(value):
            if isinstance(value, str):
                return Queue(value, Exchange(value), value)
            return value

        move(is_wanted_task, transform=transform)

    Note:
        The predicate may also return a tuple of ``(exchange, routing_key)``
        to specify the destination to where the task should be moved,
        or a :class:`~kombu.entity.Queue` instance.
        Any other true value means that the task will be moved to the
        default exchange/routing_key.
    NF)Úpoolc                 óœ  •	—  ‰	| |«      }|rÀ‰r ‰|«      }t        |t        «      r9t        |‰j                  «       |j                  j
                  |j                  }}nt        |‰‰«      \  }}t        ‰
|||¬«       |j                  «        ‰xj                  dz  c_
        ‰r
 ‰‰| |«       ‰r‰j                  ‰k\  r
t        «       ‚y y y )NrJ   é   )ri   r   r   Údefault_channelr7   r[   r8   Úexpand_destr   Úackr.   r   )r;   rB   ÚretÚexÚrkrR   Úconnr7   ÚlimitÚ	predicaterA   r8   ÚstateÚ	transforms        €€€€€€€€€r"   Úon_taskzmove.<locals>.on_taskÃ   sº   ø€ Ù˜D 'Ó*ˆCÙÙÙ# C›.�CÜ˜c¤5Ô)Ü! # t×';Ñ';Ô<Ø Ÿ\™\×.Ñ.°·±˜‘Bä(¨¨h¸ÓD‘F�B˜Ü˜( GØ#%°2õ7à—‘”à—’ !Ñ#•ÙÙ˜U D¨'Ô2Ù˜UŸ^™^¨uÒ4Ü'›/Ð)ð 5�5ð r!   Úconsume_from)r
   rk   Úconnection_or_acquirera   rb   r   r   )rx   Ú
connectionr7   r8   rc   rf   rR   rw   rz   rg   r]   rM   r{   rv   rA   ry   s   ` ``  ```    @@@r"   r   r      sž   ÿø€ ô| ˜Ó
€CØ4:²L¸b°LÓA±L¨5Œl˜3 Õ&°LÑAÒIÀT€FØ	×	"Ñ	" :°EÐ	"Ô	:¸dØ—8‘8×$Ñ$ TÓ*ˆÜ“ˆ÷	*ô 	*ô( ˜C  wÑN¸VÐNÀvÑN÷1 
;Ñ	:ùò Bß	:Ð	:ús   �BÁ
ABÂB$c                 óN   — 	 | \  }}||fS # t         t        f$ r
 ||}}Y ||fS w xY wrY   )Ú	TypeErrorÚ
ValueError)rs   r7   r8   rt   ru   s        r"   rq   rq   Ú   sC   € ð'Ø‰ˆˆBð ˆrˆ6€Møô ”zÐ"ò 'Ø˜;ˆB‰Øˆrˆ6€Mð'ús   ‚ ‹$£$c                 ó   — |d   | k(  S )z'Return true if task id equals task_id'.Úidr    )Útask_idr;   rB   s      r"   r   r   â   s   € à�‰:˜Ñ Ð r!   c                 ó   — |d   | v S )z-Return true if task id is member of set ids'.rƒ   r    )Úidsr;   rB   s      r"   r   r   ç   s   € à�‰:˜ÐÐr!   c                 ó”   — t        | t        «      r| j                  d«      } t        | t        «      rt	        d„ | D «       «      } | €i } | S )NÚ,c           
   3   óx   K  — | ]2  }t        t        t        |j                  d «      «      dd«      «      –— Œ4 y­w)Ú:Né   )Útupler   r   Úsplit)Ú.0rj   s     r"   Ú	<genexpr>z!prepare_queues.<locals>.<genexpr>ð   s3   è ø€ ð 'Ù%˜!ô œF¤5¨¯©°«Ó#6¸¸aÓ@×AÙ%ùs   ‚8:)ri   r'   r�   ÚlistÚdictrW   s    r"   r`   r`   ì   sJ   € Ü�&œ#ÔØ—‘˜cÓ"ˆÜ�&œ$ÔÜñ 'Ù%ó'ó 'ˆà€~ØˆØ€Mr!   c                   ó@   — e Zd Z	 	 	 	 d	d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)
ÚFiltererNc                 óš  — || _         || _        || _        || _        || _        || _        t        t        |«      xs g «      | _        t        |«      | _
        |	| _        |
| _        || _        |xs t        | j                  «      D �cg c]  }t        | j                   |«      ‘Œ c}| _        |xs
 t#        «       | _        || _        y c c}w rY   )rf   rv   Úfilterrw   ÚtimeoutÚack_messagesÚsetr   rS   r`   rM   rR   Úforeverr_   r�   rk   r|   r   ry   Úaccept)r)   rf   rv   r•   rw   r–   r—   rS   rM   rR   r™   r_   r|   ry   rš   rg   rj   s                    r"   Ú__init__zFilterer.__init__ù   sÁ   € ð
 ˆŒØˆŒ	ØˆŒØˆŒ
ØˆŒØ(ˆÔÜœ UÓ+Ò1¨rÓ2ˆŒ
Ü$ VÓ,ˆŒØ ˆŒØˆŒØ 0ˆÔð "Ò6¤T¨$¯+©+Ó%6Ð6ó
á6�ô ˜Ÿ™ 1Õ%Ø6ñ
ˆÔð Ò%œe›gˆŒ
Øˆ�ùò
s   ÂCc                 óD  — | j                  | j                  «       «      5  	 t        | j                  | j                  | j
                  ¬«      D ]  }Œ 	 d d d «       | j                  S # t        j                  $ r Y Œ)t        $ r Y Œ3w xY w# 1 sw Y   | j                  S xY w)N)r–   Úignore_timeouts)	Úprepare_consumerÚcreate_consumerr   rv   r–   r™   Úsocketr   ry   )r)   Ú_s     r"   ÚstartzFilterer.start  sŽ   € à×"Ñ" 4×#7Ñ#7Ó#9Õ:ðÜ" 4§9¡9Ø+/¯<©<Ø37·<±<÷A�Að ñA÷ ;ð �z‰zÐøô	 —>‘>ò ÙÜ ò Ùðú÷ ;ð �z‰zÐús:    B¢1A(ÁBÁ(BÁ;BÁ=BÂBÂBÂBÂBc                 ó¶   — | j                   xj                  dz  c_        | j                  r.| j                   j                  | j                  k\  r
t        «       ‚y y )Nro   )ry   r/   rw   r   ©r)   r;   rB   s      r"   Úupdate_statezFilterer.update_state  sB   € Ø�
‰
×Ò˜AÑÕØ�:Š:˜$Ÿ*™*×*Ñ*¨d¯j©jÒ8Ü“/Ð!ð 9ˆ:r!   c                 ó$   — |j                  «        y rY   )rr   r¤   s      r"   Úack_messagezFilterer.ack_message#  s   € Ø�‰�r!   c                 óŽ   — | j                   j                  j                  | j                  | j                  | j
                  ¬«      S )N)rM   rš   )rf   ra   ÚTaskConsumerrv   r|   rš   r(   s    r"   rŸ   zFilterer.create_consumer&  s9   € Ø�x‰x�}‰}×)Ñ)Ø�I‰IØ×$Ñ$Ø—;‘;ð *ó 
ð 	
r!   c                 ó\  — | j                   }| j                  }| j                  }| j                  rBt	        || j                  «      }t	        || j                  «      }t	        || j                  «      }|j                  |«       |j                  |«       | j                  r|j                  | j                  «       | j                  �St        | j                  | j                  «      }| j                  rt	        || j                  «      }|j                  |«       | j                  |«       |S rY   )r•   r¥   r§   rS   rT   Úregister_callbackr—   rR   r   ry   Údeclare_queues)r)   Úconsumerr•   r¥   r§   rR   s         r"   rž   zFilterer.prepare_consumer-  sç   € Ø—‘ˆØ×(Ñ(ˆØ×&Ñ&ˆØ�:Š:Ü$ V¨T¯Z©ZÓ8ˆFÜ*¨<¸¿¹ÓDˆLÜ)¨+°t·z±zÓBˆKØ×"Ñ" 6Ô*Ø×"Ñ" <Ô0Ø×ÒØ×&Ñ& t×'7Ñ'7Ô8Ø�=‰=Ð$Ü˜tŸ}™}¨d¯j©jÓ9ˆHØ�zŠzÜ*¨8°T·Z±ZÓ@�Ø×&Ñ& xÔ0Ø×Ñ˜HÔ%Øˆr!   c                 óx  — |j                   D ]Œ  }| j                   r|j                  | j                   vrŒ(| j                  �| j                  |«       	  ||j                  «      j	                  d¬«      \  }}}|r| j
                  xj                  |z  c_        ŒŽ y # | j                  j                  $ r Y Œ«w xY w)NT)Úpassive)	rM   r[   r_   rZ   Úqueue_declarery   r&   rv   Úchannel_errors)r)   r­   r]   r¡   Úmcounts        r"   r¬   zFilterer.declare_queuesA  s§   € à—_”_ˆEØ�{Š{˜uŸz™z°·±Ñ<ØØ×$Ñ$Ð0Ø×%Ñ% eÔ,ðÙ$Ø×$Ñ$ó &ß&3¡m¸D mÓ&Añ ��6˜1áØ—J‘J×(Ò(¨FÑ2Õ(øñ %øð —9‘9×+Ñ+ò Ùðús   ÁABÂB9Â8B9©Ng      ð?FNNNFNNNN)
r   r   r   r›   r¢   r¥   r§   rŸ   rž   r¬   r    r!   r"   r“   r“   ÷   s3   „ ð &)Ø8<Ø@DØ7;ó	ò.ò"ò
ò
òó(r!   r“   c                 óR   — t        | ||f|||||||	|
|||dœ|¤Žj                  «       S )zFilter tasks.)rw   r–   r—   rS   rM   rR   r™   r_   r|   ry   rš   )r“   r¢   )rf   rv   r•   rw   r–   r—   rS   rM   rR   r™   r_   r|   ry   rš   rg   s                  r"   r   r   Q  sQ   € ô
 ØˆT�6ðàØØ!ØØØØØ)Ø!ØØñð ñ÷ ‘%“'ðr!   c                 ó   — t        | |ifi |¤ŽS )a‹  Find a task by id and move it to another queue.

    Arguments:
        task_id (str): Id of task to find and move.
        dest: (str, kombu.Queue): Destination queue.
        transform (Callable): Optional function to transform the return
            value (destination) of the filter function.
        **kwargs (Any): Also supports the same keyword
            arguments as :func:`move`.
    )r   )r„   rd   rg   s      r"   r   r   f  s   € ô ˜' 4˜Ñ3¨FÑ3Ð3r!   c                 ó<   ‡ — ˆ fd„}t        |fdt        ‰ «      i|¤ŽS )a“  Move tasks by matching from a ``task_id: queue`` mapping.

    Where ``queue`` is a queue to move the task to.

    Example:
        >>> move_by_idmap({
        ...     '5bee6e82-f4ac-468e-bd3d-13e8600250bc': Queue('name'),
        ...     'ada8652d-aef3-466b-abd2-becdaf1b82b3': Queue('name'),
        ...     '3a2b140d-7db1-41ba-ac90-c36a0ef4ab1f': Queue('name')},
        ...   queues=['hipri'])
    c                 ó@   •— ‰j                  |j                  d   «      S )NÚcorrelation_id)rK   r=   ©r;   rB   Úmaps     €r"   Útask_id_in_mapz%move_by_idmap.<locals>.task_id_in_map€  s   ø€ Ø�w‰w�w×)Ñ)Ð*:Ñ;Ó<Ð<r!   rw   )r   Úlen)rº   rg   r»   s   `  r"   r   r   t  s#   ø€ ô=ô
 �Ñ9¤c¨#£hÐ9°&Ñ9Ð9r!   c                 ó&   ‡ — ˆ fd„}t        |fi |¤ŽS )a  Move tasks by matching from a ``task_name: queue`` mapping.

    ``queue`` is the queue to move the task to.

    Example:
        >>> move_by_taskmap({
        ...     'tasks.add': Queue('name'),
        ...     'tasks.mul': Queue('name'),
        ... })
    c                 ó,   •— ‰j                  | d   «      S rP   )rK   r¹   s     €r"   Útask_name_in_mapz)move_by_taskmap.<locals>.task_name_in_map“  s   ø€ Ø�w‰w�t˜F‘|Ó$Ð$r!   )r   )rº   rg   r¿   s   `  r"   r   r   ˆ  s   ø€ ô%ô Ð Ñ+ FÑ+Ð+r!   c                 óF   — t        t        j                  d| |dœ|¤Ž«       y )N)ry   r;   r    )ÚprintÚMOVING_PROGRESS_FMTÚformat)ry   r;   rB   rg   s       r"   Úfilter_statusrÄ   ™  s    € Ü	Ô
×
$Ñ
$Ð
F¨5°tÑ
F¸vÑ
FÕGr!   )rz   )NNNrY   )NNNNNNNNr³   )-r   r    Ú	functoolsr   Ú	itertoolsr   r   Úkombur   r   Úkombu.commonr   Úkombu.utils.encodingr	   Ú
celery.appr
   Úcelery.utils.nodenamesr   Úcelery.utils.textr   Ú__all__rÂ   Ú	Exceptionr   r   r   r   rT   r   rk   r   rq   r   r   r`   r“   r   r   r   r   rÄ   r   r   Úmove_direct_by_idmapÚmove_direct_by_taskmapr    r!   r"   Ú<module>rÑ      s  ðÙ 2Û Ý ß #ç "Ý &Ý -å %Ý 0Ý )ð€ðÐ ô5�Iô 5÷/ñ /ð& =AØóó<;òð )5¸$ØóEò,ð AEØEIóXOòvò!ò
ò
÷Wñ Wðt 9<Ø8<Ø@DØ7;óò*4ò:ò(,ò"Hñ �d mÔ4€Ù˜O°}ÔEÐ Ù˜}¸ÔFÐ Ù  ¸MÔJÑ r!   