o
    ›¨Êh   ã                	   @   sd  d 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mZmZ zddlZW n eyI   ddlZY nw d	ZeeefZd
d
d
ddddd
dœZdd„ Zejejfdd„Zdd„ Z d+dd„Z!dd„ Z"G dd„ deƒZ#dd„ Z$ejejfdd„Z%dd„ Z&dd „ Zd!d"„ Zd+d#d$„Z'd%d&„ Z(ej)e*fdddfd'd(„Z+d)d*„ Z,dS ),z)Utilities for safely pickling exceptions.é    N)Ú	b64decode)Ú	b64encode)Úpartial)Úgetmro)Ú	takewhile)Úbytes_to_strÚ	safe_reprÚstr_to_bytes)ÚUnpickleableExceptionWrapperÚsubclass_exceptionÚfind_pickleable_exceptionÚcreate_exception_clsÚget_pickleable_exceptionÚget_pickleable_etypeÚget_pickled_exceptionÚ	strtoboolFT)ÚfalseÚnoÚ0ÚtrueÚyesÚ1ÚonÚoffc                 C   s   t | |fd|iƒS )zCreate new exception class.Ú
__module__)Útype)ÚnameÚparentÚmodule© r   úL/var/www/html/env/lib/python3.10/site-packages/celery/utils/serialization.pyr   !   s   r   c              	   C   sR   t | dg ƒ}t| jtƒD ]}z||Ž }|||ƒƒ W |  S  ty&   Y qw dS )aÆ  Find first pickleable exception base class.

    With an exception instance, iterate over its super classes (by MRO)
    and find the first super exception that's pickleable.  It does
    not go below :exc:`Exception` (i.e., it skips :exc:`Exception`,
    :class:`BaseException` and :class:`object`).  If that happens
    you should use :exc:`UnpickleableException` instead.

    Arguments:
        exc (BaseException): An exception instance.
        loads: decoder to use.
        dumps: encoder to use

    Returns:
        Exception: Nearest pickleable parent exception class
            (except :exc:`Exception` and parents), or if the exception is
            pickleable it will return :const:`None`.
    ÚargsN)ÚgetattrÚitermroÚ	__class__Úunwanted_base_classesÚ	Exception)ÚexcÚloadsÚdumpsÚexc_argsÚsuperclsÚsuperexcr   r   r    r   &   s   ýÿür   c                    s   t ‡ fdd„t| ƒƒS )Nc                    s   | ˆ vS ©Nr   )Úsup©Ústopr   r    Ú<lambda>F   s    zitermro.<locals>.<lambda>)r   r   )Úclsr0   r   r/   r    r#   E   s   r#   c                 C   s   |st }t| ||ƒS )z&Dynamically create an exception class.)r&   r   )r   r   r   r   r   r    r   I   s   r   c              	   C   sL   g }| D ]}z||ƒ |  |¡ W q ty!   |  t|ƒ¡ Y qw t|ƒS )a  Ensure items will serialize.

    For a given list of arbitrary objects, return the object
    or a string representation, safe for serialization.

    Arguments:
        items (Iterable[Any]): Objects to serialize.
        encoder (Callable): Callable function to serialize with.
    )Úappendr&   r   Útuple)ÚitemsÚencoderÚsafe_exc_argsÚargr   r   r    Úensure_serializableP   s   
ÿr9   c                       sJ   e Zd ZdZdZdZdZd‡ fdd„	Zdd„ Zdd„ Z	e
d	d
„ ƒZ‡  ZS )r
   at  Wraps unpickleable exceptions.

    Arguments:
        exc_module (str): See :attr:`exc_module`.
        exc_cls_name (str): See :attr:`exc_cls_name`.
        exc_args (Tuple[Any, ...]): See :attr:`exc_args`.

    Example:
        >>> def pickle_it(raising_function):
        ...     try:
        ...         raising_function()
        ...     except Exception as e:
        ...         exc = UnpickleableExceptionWrapper(
        ...             e.__class__.__module__,
        ...             e.__class__.__name__,
        ...             e.args,
        ...         )
        ...         pickle.dumps(exc)  # Works fine.
    Nc                    s<   t |dd„ ƒ}|| _|| _|| _|| _tƒ  ||||¡ d S )Nc                 S   s   t  t  | ¡¡S r-   )Úpickler(   r)   )Úvr   r   r    r1   „   s    z7UnpickleableExceptionWrapper.__init__.<locals>.<lambda>)r9   Ú
exc_moduleÚexc_cls_namer*   ÚtextÚsuperÚ__init__)Úselfr<   r=   r*   r>   r7   ©r$   r   r    r@   ‚   s   ÿÿz%UnpickleableExceptionWrapper.__init__c                 C   s   t | j| jƒ| jŽ S r-   )r   r=   r<   r*   ©rA   r   r   r    Úrestore�   s
   ÿÿz$UnpickleableExceptionWrapper.restorec                 C   s   | j S r-   )r>   rC   r   r   r    Ú__str__‘   s   z$UnpickleableExceptionWrapper.__str__c                 C   s<   | |j j|j jt|dg ƒt|ƒƒ}t|dƒr| |j¡}|S )Nr!   Ú__traceback__)r$   r   Ú__name__r"   r   ÚhasattrÚwith_tracebackrF   )r2   r'   Úresr   r   r    Úfrom_exception”   s   
ü
z+UnpickleableExceptionWrapper.from_exceptionr-   )rG   r   Ú__qualname__Ú__doc__r<   r=   r*   r@   rD   rE   ÚclassmethodrK   Ú__classcell__r   r   rB   r    r
   d   s    r
   c                 C   sD   zt  t  | ¡¡ W | S  ty   Y nw t| ƒ}|r|S t | ¡S )z"Make sure exception is pickleable.)r:   r(   r)   r&   r   r
   rK   )r'   Únearestr   r   r    r   ¡   s   ýÿ
r   c                 C   s*   z	||| ƒƒ W | S  t y   t  Y S w )zGet pickleable exception type.)r&   )r2   r(   r)   r   r   r    r   ¯   s   ýÿr   c                 C   s   t | tƒr	|  ¡ S | S )z,Reverse of :meth:`get_pickleable_exception`.)Ú
isinstancer
   rD   )r'   r   r   r    r   ¹   s   
r   c                 C   s   t tt| ƒƒƒS r-   )r   Úbase64encoder	   ©Úsr   r   r    r   À   s   r   c                 C   s   t t| ƒƒS r-   )Úbase64decoder	   rS   r   r   r    r   Ä   s   r   c                 C   sH   |du rt }t| tƒr"z||  ¡  W S  ty!   td| ›d�ƒ‚w | S )z_Convert common terms for true/false to bool.

    Examples (true/false/yes/no/on/off/1/0).
    NzCannot coerce z to type bool)ÚSTRTOBOOL_DEFAULT_TABLErQ   ÚstrÚlowerÚKeyErrorÚ	TypeError)ÚtermÚtabler   r   r    r   È   s   
ÿr   c                 C   s‚   t | tjƒr(|  ¡ }| jr|d d… |dd …  }| d¡r&|d d… d }|S t | tjƒr=|  ¡ }| jr;|d d… }|S |  ¡ S )Né   é   z+00:00iúÿÿÿÚZé   )rQ   ÚdatetimeÚ	isoformatÚmicrosecondÚendswithÚtime)ÚdtÚrr   r   r    Ú_datetime_to_json×   s   
rh   c                    sê   ddl m} tt||ˆ|d�‰ t| |ƒr| jdd�} | du s#t| |ƒr%| S t| ttfƒr5‡ fdd„| D ƒS t| tƒrF‡ ‡fd	d
„|  	¡ D ƒS t| t
jt
jfƒrSt| ƒS t| t
jƒr]t| ƒS |du rqtdt| ƒ›d| ›d|› d�ƒ‚|| ƒS )z;Transform object making it suitable for json serialization.r   )ÚObject)Úbuiltin_typesÚkeyÚ	keyfilterÚunknown_type_filterT)ÚrecurseNc                    s   g | ]}ˆ |ƒ‘qS r   r   )Ú.0r;   )Ú_jsonifyr   r    Ú
<listcomp>ù   s    zjsonify.<locals>.<listcomp>c                    s0   i | ]\}}ˆrˆ|ƒrn	 	 |ˆ ||d�“qS )é   )rk   r   )ro   Úkr;   ©rp   rl   r   r    Ú
<dictcomp>û   s    þþþÿzjsonify.<locals>.<dictcomp>zUnsupported type: ú z
 (parent: ú))Úkombu.abstractri   r   ÚjsonifyrQ   Úas_dictr4   ÚlistÚdictr5   ra   Údatere   rh   Ú	timedeltarW   Ú
ValueErrorr   )Úobjrj   rk   rl   rm   ÚKombuDictTyper   rt   r    ry   é   s0   þ

ÿÿry   c                 C   s(   t  ¡ }|s| ‚|d | u r‚ | |d ‚)Nrr   )ÚsysÚexc_info)r'   rƒ   r   r   r    Úraise_with_context  s   
r„   r-   )-rM   ra   Únumbersr‚   Úbase64r   rU   r   rR   Ú	functoolsr   Úinspectr   Ú	itertoolsr   Úkombu.utils.encodingr   r   r	   ÚcPickler:   ÚImportErrorÚ__all__r&   ÚBaseExceptionÚobjectr%   rV   r   r(   r)   r   r#   r   r9   r
   r   r   r   r   rh   ÚRealrW   ry   r„   r   r   r   r    Ú<module>   sR    ÿ
þ
ÿ
=



ý"