o
    wvXjf.  ã                   @   s"  d Z ddlmZmZmZ ddlZddlZddl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 dd	lmZ dd
lmZ dZeeiZd ¡ ZdZeee	jd�Z G dd„ de!ƒZ"dd„ Z#dd„ Z$G dd„ dej%ƒZ&G dd„ de!ƒZ'G dd„ deƒZ(dd„ Z)e*dkr�e)ƒ  dS dS )z>The :program:`celery amqp` command.

.. program:: celery amqp
é    )Úabsolute_importÚprint_functionÚunicode_literalsN)Úpartial)Úcount)Úsafe_str)ÚCommand)Ústring_t)Úpadlist)Ú	strtobool)Ú	AMQPAdminÚAMQShellÚSpecÚamqpz
Commands
--------
z-
Example:
    -> queue.delete myqueue yes no
©Úfilec                   @   sJ   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Z	ddd„Z
dd„ ZdS )r   zãAMQP Command specification.

    Used to convert arguments to Python values and display various help
    and tool-tips.

    Arguments:
        args (Sequence): see :attr:`args`.
        returns (str): see :attr:`returns`.
    Nc                 O   s   || _ | d¡| _d S )NÚreturns)ÚargsÚgetr   ©Úselfr   Úkwargs© r   úL/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/bin/amqp.pyÚ__init__;   s   zSpec.__init__c                 C   s"   | j | }|d }t ||¡|ƒS )z#Coerce value for argument at index.é   )r   ÚCOERCEr   )r   ÚindexÚvalueÚarg_infoÚarg_typer   r   r   Úcoerce?   s   
zSpec.coercec                    s   t ‡ fdd„t|ƒD ƒƒS )zðProcess list of string arguments to values according to spec.

        Example:
            >>> spec = Spec([('queue', str), ('if_unused', bool)])
            >>> spec.str_args_to_python('pobox', 'true')
            ('pobox', True)
        c                 3   s    � | ]\}}ˆ   ||¡V  qd S ©N)r!   )Ú.0r   r   ©r   r   r   Ú	<genexpr>O   s   € 
ÿz*Spec.str_args_to_python.<locals>.<genexpr>)ÚtupleÚ	enumerate)r   Úarglistr   r$   r   Ústr_args_to_pythonG   s   ÿzSpec.str_args_to_pythonc                 C   s6   | j s|du r	dS |S t| j ƒr|   |¡S | j  |¡S )z@Format the return value of this command in a human-friendly way.Nzok.)r   ÚcallableÚformat)r   Úresponser   r   r   Úformat_responseR   s
   

zSpec.format_responsec                 C   s   |d ur
d  ||¡S |S )Nz{0}:{1}©r+   )r   ÚnameÚtypeÚdefault_valuer   r   r   Ú
format_argZ   s   zSpec.format_argc                    s   d  ‡ fdd„ˆ jD ƒ¡S )Nú c                 3   s$   � | ]}ˆ j tt|ƒd ƒŽ V  qdS )é   N)r2   r
   Úlist)r#   Úargr$   r   r   r%   `   s   € ÿz(Spec.format_signature.<locals>.<genexpr>)Újoinr   r$   r   r$   r   Úformat_signature_   s   ÿzSpec.format_signaturer"   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r)   r-   r2   r8   r   r   r   r   r   (   s    
r   c                 C   s   | d u rdS | j | j| jdœS )Nz.No messages in queue. basic.publish something.©ÚbodyÚ
propertiesÚdelivery_infor=   )Úmessager   r   r   Údump_messaged   s   þrB   c                 C   s
   dj | Ž S )Nz)ok. queue:{0} messages:{1} consumers:{2}.r.   )Úretr   r   r   Úformat_declare_queuel   s   
rD   c                   @   sÌ  e Zd ZdZdZdZdZd Ze_	dZ
dZedƒZddd	d
œZedefdefdedfdedfdedfdedfƒedefdefƒedefdefdefƒedefdedfdedfdedfdedfed�edefdedfdedfdd�edefdd�edefdedfed�edefdefdefdedfdedfƒedefƒdœ	Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ ZdBd,d-„Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Z d6d7„ Z!d8d9„ Z"d:d;„ Z#d<d=„ Z$d>d?„ Z%e&d@dA„ ƒZ'dS )Cr   a&  AMQP API Shell.

    Arguments:
        connect (Callable): Function used to connect to the server.
            Must return :class:`kombu.Connection` object.
        silent (bool): If enabled, the commands won't have annoying
            output not relevant when running in non-shell mode.
    Nz{self.counter}> Ú.Fr   é   Údo_exitÚdo_help)ÚEOFÚexitÚhelpÚexchanger0   ÚpassiveÚnoÚdurableÚauto_deleteÚinternalÚ	if_unusedÚqueueÚrouting_keyÚ	exclusive)r   Úif_emptyzok. {0} messages deleted.Úno_ackÚoffÚmsgÚ	mandatoryÚ	immediateÚdelivery_tag)	zexchange.declarezexchange.deletez
queue.bindzqueue.declarezqueue.deletezqueue.purgez	basic.getúbasic.publishz	basic.ackc                 C   sR   ddl m}m} t|j|ƒr'td|fdtfdtfdtdfdtdfƒ| j d	< d S d S )
Nr   )Ú
ConnectionÚMessagerY   rL   rT   rZ   rN   r[   r]   )r   r^   r_   Ú
isinstanceÚ
connectionr   ÚstrÚbool)r   Úconnr^   r_   r   r   r   Ú_prepare_spec­   s   üÿzAMQShell._prepare_specc                 O   sP   |  d¡| _|  dd¡| _|  dtj¡| _tjj| g|¢R i |¤Ž |  	¡  d S )NÚconnectÚsilentFÚout)
Úpoprf   rg   ÚsysÚstderrrh   Ú_cmdÚCmdr   Ú
_reconnectr   r   r   r   r   ·   s
   zAMQShell.__init__c                 C   s   | j st|| jd� dS dS )z7Say something to the user.  Disabled if :attr:`silent`.r   N©rg   Úsayrh   ©r   Úmr   r   r   Únote¾   s   ÿzAMQShell.notec                 C   s   t || jd� d S ©Nr   )rp   rh   rq   r   r   r   rp   Ã   s   zAMQShell.sayc                 C   sB   | j | }| |¡}| dd¡}| jr|  ¡  t| j|ƒ||jfS )a  Get AMQP command wrapper.

        With a command name and a list of arguments, convert the arguments
        to Python values and find the corresponding method on the AMQP channel
        object.

        Returns:
            Tuple: of `(method, processed_args)` pairs.
        rE   Ú_)r   r)   ÚreplaceÚneeds_reconnectrn   ÚgetattrÚchanr-   )r   Úcmdr(   Úspecr   Ú	attr_namer   r   r   Úget_amqp_api_commandÆ   s   


zAMQShell.get_amqp_api_commandc                 G   s   |   d¡ t d¡ dS )zThe `'exit'` command.z
-> please, don't leave!r   N)rs   rj   rJ   )r   r   r   r   r   rG   ×   s   
zAMQShell.do_exitc                 C   s$   | j | }|  d || ¡ ¡¡ d S )Nz{0} {1})r   rp   r+   r8   )r   rz   Úshortr{   r   r   r   Údisplay_command_helpÜ   s   
zAMQShell.display_command_helpc                 G   sH   |s|   t¡ | jD ]	}| j|dd� q
|   t¡ d S |  |d ¡ d S )NT)r~   r   )rp   ÚHELP_HEADERr   r   ÚEXAMPLE_TEXT)r   r   Úcmd_namer   r   r   rH   à   s   

zAMQShell.do_helpc                 C   s   |   d |¡¡ d S )Nz-unknown syntax: {0!r}. how about some 'help'?)rp   r+   )r   Úliner   r   r   Údefaulté   ó   zAMQShell.defaultc                 C   s   t | jƒt | jƒB S r"   )ÚsetÚbuiltinsr   r$   r   r   r   Ú	get_namesì   r…   zAMQShell.get_namesc                    s4   |   ¡ }‡ fdd„|D ƒ}|r|S ‡ fdd„|D ƒS )z=Return all commands starting with `text`, for tab-completion.c                    s"   g | ]}|  ˆ  d d¡¡r|‘qS )ru   rE   )Ú
startswithrv   ©r#   rz   ©Útextr   r   Ú
<listcomp>ò   s    
ÿz*AMQShell.completenames.<locals>.<listcomp>c                    s$   g | ]}|  d ¡d  ˆ ¡r|‘qS )rE   rF   )Ú	partitionr‰   rŠ   r‹   r   r   r�   ö   s    
ÿ)rˆ   )r   rŒ   ÚignoredÚnamesÚfirstr   r‹   r   Úcompletenamesï   s
   zAMQShell.completenamesc                 C   sT   t |tƒrt t|ƒ¡}|| jv rt| | j| ƒ|Ž S |  ||¡\}}}|||Ž ƒS )zgDispatch and execute the command.

        Look-up order is: :attr:`builtins` -> :attr:`amqp`.
        )r`   r	   ÚshlexÚsplitr   r‡   rx   r}   )r   rz   r(   Úfunr   Ú	formatterr   r   r   Údispatchù   s   

zAMQShell.dispatchc                 C   s$   |r|d |dd… d  |¡fS dS )zˆParse input line.

        Returns:
            Tuple: of three items:
                `(command_name, arglist, original_line)`
        r   r   Nr3   )Ú r˜   r˜   )r7   )r   Úpartsr   r   r   Ú	parseline  s   zAMQShell.parselinec              
   C   s¶   t |tƒrt t|ƒ¡}|  |¡\}}}|s|  ¡ S || _t| j	ƒ| _
z|  |  ||¡¡ W dS  ttfy@   |  |¡ Y dS  tyZ } z|  |¡ d| _W Y d}~dS d}~ww )zParse line and execute command.TN)r`   r	   r“   r”   r   rš   Ú	emptylineÚlastcmdÚnextÚinc_counterÚcounterÚrespondr—   ÚAttributeErrorÚKeyErrorr„   Ú	Exceptionrp   rw   )r   rƒ   rz   r6   Úexcr   r   r   Úonecmd  s    

€þzAMQShell.onecmdc                 C   s8   |durt |tƒr|  |¡ dS |  t |¡¡ dS dS )z.What to do with the return value of a command.N)r`   r	   rp   ÚpprintÚpformat)r   Úretvalr   r   r   r    !  s
   
üzAMQShell.respondc                 C   s.   |   | j¡| _|  | j¡ | jj| _d| _dS )z+Re-establish connection to the AMQP server.FN)rf   rd   re   Údefault_channelry   rw   r$   r   r   r   rn   )  s   

zAMQShell._reconnectc                 C   s   | j j| d�S )Nr$   )Ú
prompt_fmtr+   r$   r   r   r   Úprompt0  s   zAMQShell.prompt)F)(r9   r:   r;   r<   rd   ry   rª   Ú
identcharsrl   Ú
IDENTCHARSrw   rŸ   r   rž   r‡   r   rb   rc   rD   rB   Úintr   re   r   rs   rp   r}   rG   r   rH   r„   rˆ   r’   r—   rš   r¥   r    rn   Úpropertyr«   r   r   r   r   r   p   s�    	
ýûÿþûýÿþü
à#

	
r   c                   @   s6   e Zd ZdZeZdd„ Zddd„Zdd„ Zd	d
„ Z	dS )r   z*The celery :program:`celery amqp` utility.c                 O   s0   |d | _ | dtj¡| _| d¡| _|| _d S )NÚapprh   rg   )r°   Ú
setdefaultrj   rk   rh   r   rg   r   r   r   r   r   r   :  s   

zAMQPAdmin.__init__Nc                 C   s@   |r|  ¡  | j ¡ }|  d | ¡ ¡¡ | ¡  |  d¡ |S )Nz-> connecting to {0}.z-> connected.)Úcloser°   ra   rs   r+   Úas_urirf   )r   rd   r   r   r   rf   @  s   

zAMQPAdmin.connectc                 C   sN   | j | j| jd�}| jr| | j¡S z| ¡ W S  ty&   |  d¡ Y d S w )N)rf   rh   z(bibi))ÚShellrf   rh   r   r¥   ÚcmdloopÚKeyboardInterruptrs   )r   Úshellr   r   r   ÚrunI  s   
ÿzAMQPAdmin.runc                 C   s   | j st|| jd� d S d S rt   ro   rq   r   r   r   rs   R  s   ÿzAMQPAdmin.noter"   )
r9   r:   r;   r<   r   r´   r   rf   r¸   rs   r   r   r   r   r   5  s    
		r   c                   @   s   e Zd ZdZdd„ ZdS )r   a¿  AMQP Administration Shell.

    Also works for non-AMQP transports (but not ones that
    store declarations in memory).

    Examples:
        .. code-block:: console

            $ # start shell mode
            $ celery amqp
            $ # show list of commands
            $ celery amqp help

            $ celery amqp exchange.delete name
            $ celery amqp queue.delete queue
            $ celery amqp queue.delete queue yes yes
    c                 O   s   | j |d< t|i |¤Ž ¡ S )Nr°   )r°   r   r¸   )r   r   Úoptionsr   r   r   r¸   j  s   
zamqp.runN)r9   r:   r;   r<   r¸   r   r   r   r   r   W  s    r   c                   C   s   t ƒ  ¡  d S r"   )r   Úexecute_from_commandliner   r   r   r   Úmaino  s   r»   Ú__main__)+r<   Ú
__future__r   r   r   rz   rl   r¦   r“   rj   Ú	functoolsr   Ú	itertoolsr   Úkombu.utils.encodingr   Úcelery.bin.baser   Úcelery.fiver	   Úcelery.utils.functionalr
   Úcelery.utils.serializationr   Ú__all__rc   r   Úrstripr€   r�   Úprintrk   rp   Úobjectr   rB   rD   rm   r   r   r   r»   r9   r   r   r   r   Ú<module>   s>   ý< F"
ÿ