o
    ›¨Êh(  ã                	   @   s²   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	m
Z
 dddhd	d
ddddœZG dd„ dƒZG dd„ dee	jƒƒZddddeddfdd„Zedd„ ƒZeddd„ƒZdS )z-Create Celery app instances used for testing.é    N)Úcontextmanager)Údeepcopy)Úsymbol_by_name)ÚCeleryÚ_stateFÚjsonTÚUTCz	memory://zcache+memory://)Úworker_hijack_root_loggerÚworker_log_colorÚaccept_contentÚ
enable_utcÚtimezoneÚ
broker_urlÚresult_backendÚbroker_heartbeatc                   @   s   e Zd ZdZdd„ ZdS )ÚTrapz·Trap that pretends to be an app but raises an exception instead.

    This to protect from code that does not properly pass app instances,
    then falls back to the current_app.
    c                 C   s$   |dks|dkr
d S t |ƒ tdƒ‚)NÚ_is_coroutineÚ__func__zTest depends on current_app)ÚprintÚRuntimeError)ÚselfÚname© r   úL/var/www/html/env/lib/python3.10/site-packages/celery/contrib/testing/app.pyÚ__getattr__   s   zTrap.__getattr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s    r   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚUnitLoggingz)Sets up logging for the test application.c                    s   t ƒ j|i |¤Ž d| _d S )NT)ÚsuperÚ__init__Úalready_setup)r   ÚargsÚkwargs©Ú	__class__r   r   r!   *   s   
zUnitLogging.__init__)r   r   r   r   r!   Ú__classcell__r   r   r%   r   r   '   s    r   c           
      K   s„   ddl m} tttƒfi |pi ¤Ž}|dur| dd¡ |dur&| dd¡ |r*dn|}t| p0df||||dœ|¤Ž}	|	 |¡ |	S )zApp used for testing.é   )ÚtasksNr   r   zcelery.tests)Úset_as_currentÚlogÚbrokerÚbackend)Ú r)   Údictr   ÚDEFAULT_TEST_CONFIGÚpopr   Úadd_defaults)
r   ÚconfigÚenable_loggingr*   r+   r-   r,   r$   r)   Útest_appr   r   r   ÚTestApp/   s&   ÿûú
r6   c                 #   sN   � t ƒ ‰ tj}t ˆ ¡ G ‡ fdd„dƒ}|ƒ t_z	dV  W |t_dS |t_w )z—Contextmanager that installs the trap app.

    The trap means that anything trying to use the current or default app
    will raise an exception.
    c                       s   e Zd Z” ZdS )zset_trap.<locals>.NonTLSN)r   r   r   Úcurrent_appr   ©Útrapr   r   ÚNonTLSO   s    r:   N)r   r   Ú_tlsÚset_default_app)ÚappÚprev_tlsr:   r   r8   r   Úset_trapD   s   €
r?   c              	   c   sÆ   � t  ¡ }t j}tt jƒ}t t j¡}z7|r.t| ƒ� dV  W d  ƒ n1 s(w   Y  ndV  W t  	|¡ |t j
_| |urC|  ¡  |t _|t _dS t  	|¡ |t j
_| |ur\|  ¡  |t _|t _w )zWSetup default app for testing.

    Ensures state is clean after the test returns.
    N)r   Úget_current_appÚdefault_appÚsetÚ_on_app_finalizersÚweakrefÚWeakSetÚ_appsr?   r<   r;   r7   Úclose)r=   Úuse_trapÚprev_current_appÚprev_default_appÚprev_finalizersÚ	prev_appsr   r   r   Úsetup_default_appY   s2   €

ÿ€€


ûrM   )F)r   rD   Ú
contextlibr   Úcopyr   Úkombu.utils.importsr   Úceleryr   r   r0   r   Úlog_clsr   r6   r?   rM   r   r   r   r   Ú<module>   s0    ø
ÿ
