
    `f               	          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 	 ddlZn# e$ r ddlZY nw xY wd	ZeeefZd
d
d
ddddd
dZd Zej        ej        fdZd Z ddZ!d Z" G d de          Z#d Z$ej        ej        fdZ%d Z&d Zd ZddZ'd Z(ej)        e*fdddfdZ+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                 *    t          | |fd|i          S )zCreate new exception class.
__module__)type)nameparentmodules      L/var/www/html/env/lib/python3.11/site-packages/celery/utils/serialization.pyr   r   !   s    vi,!7888    c                     t          | dg           }t          | j        t                    D ]/}	  || } | ||                     |c S # t          $ r Y ,w xY 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superexcs         r!   r   r   &   s    ( sFB''HCM+@AA  	x*HE%%//""" OOO  	 	 	D		 s   A
AAc                 D    t          fdt          |                     S )Nc                     | vS N )supstops    r!   <lambda>zitermro.<locals>.<lambda>F   s    D r"   )r   r   )clsr5   s    `r!   r&   r&   E   s#    0000&++>>>r"   c                 6    |st           }t          | ||          S )z&Dynamically create an exception class.)r)   r   )r   r    r   s      r!   r   r   I   s!     dFF333r"   c                     g }| D ]U}	  ||           |                     |           $# t          $ r% |                     t          |                     Y Rw xY 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args       r!   ensure_serializabler@   P   s     M 1 1	1GCLLL  %%%% 	1 	1 	1  300000	1s    ),AAc                   R     e Zd ZdZdZdZdZd fd	Zd Zd Z	e
d             Z x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                     t          |d           }|| _        || _        || _        || _        t                                          ||||           d S )Nc                 N    t          j        t          j        |                     S r2   )pickler+   r,   )vs    r!   r6   z7UnpickleableExceptionWrapper.__init__.<locals>.<lambda>   s    V\!__ = = r"   )r@   
exc_moduleexc_cls_namer-   textsuper__init__)selfrF   rG   r-   rH   r>   r'   s         r!   rJ   z%UnpickleableExceptionWrapper.__init__   si    +==
 
 %(%	\=	 	 	 	 	r"   c                 F     t          | j        | j                  | j         S r2   )r   rG   rF   r-   rK   s    r!   restorez$UnpickleableExceptionWrapper.restore   s/    5#D$5$(O5 56:mE 	Er"   c                     | j         S r2   )rH   rM   s    r!   __str__z$UnpickleableExceptionWrapper.__str__   s
    yr"   c           	           | |j         j        |j         j        t          |dg           t	          |                    }t          |d          r|                    |j                  }|S )Nr$   __traceback__)r'   r   __name__r%   r	   hasattrwith_tracebackrR   )r7   r*   ress      r!   from_exceptionz+UnpickleableExceptionWrapper.from_exception   sj    cM$M"C$$cNN	
 
 3(( 	8$$S%677C
r"   r2   )rS   r   __qualname____doc__rF   rG   r-   rJ   rN   rP   classmethodrW   __classcell__)r'   s   @r!   r   r   d   s         * J L H	 	 	 	 	 	E E E   	 	 [	 	 	 	 	r"   r   c                     	 t          j        t          j        |                      | S # t          $ r Y nw xY wt	          |           }|r|S t
                              |           S )z"Make sure exception is pickleable.)rD   r+   r,   r)   r   r   rW   )r*   nearests     r!   r   r      sz    V\#&&''' 
     (,,G '66s;;;s   &* 
77c                 ^    	  | ||                      | S # t           $ r
 t           cY S w xY w)zGet pickleable exception type.)r)   )r7   r+   r,   s      r!   r   r      sO    eeCjj 
    s    ,,c                 X    t          | t                    r|                                 S | S )z,Reverse of :meth:`get_pickleable_exception`.)
isinstancer   rN   )r*   s    r!   r   r      s(    #344 {{}}Jr"   c                 T    t          t          t          |                               S r2   )r   base64encoder
   ss    r!   r   r      s    \!__55666r"   c                 :    t          t          |                     S r2   )base64decoder
   rc   s    r!   r   r      s    Q(((r"   c                     |t           }t          | t                    r<	 ||                                          S # t          $ r t          d| d          w xY 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_TABLEr`   strlowerKeyError	TypeError)termtables     r!   r   r      sx    
 }'$ D	D&& 	D 	D 	DBTBBBCCC	DKs	   : Ac                    t          | t          j                  rT|                                 }| j        r|d d         |dd          z   }|                    d          r|d d         dz   }|S t          | t          j                  r'|                                 }| j        r
|d d         }|S |                                 S )N      z+00:00iZ   )r`   datetime	isoformatmicrosecondendswithtime)dtrs     r!   _datetime_to_jsonr{      s    "h'(( LLNN> 	 #2#233A::h 	#2#A	B	&	& LLNN> 	#2#A||~~r"   c           	         ddl m} t          t          |||          t	          | |          r|                     d          } | t	          | |          r| S t	          | t          t          f          rfd| D             S t	          | t                    r!fd| 	                                D             S t	          | t          j        t          j        f          rt          |           S t	          | t          j                  rt          |           S |&t!          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                 &    g | ]} |          S r3   r3   ).0rE   _jsonifys     r!   
<listcomp>zjsonify.<locals>.<listcomp>   s!    ))))))r"   c                 R    i | ]#\  }}r |          n	 	 | ||          $S )   )r   r3   )r   krE   r   r   s      r!   
<dictcomp>zjsonify.<locals>.<dictcomp>   sa     
 
 
&*a )
	!
 
/0
xxq!!!
 
 
r"   zUnsupported type:  z
 (parent: ))kombu.abstractr}   r   jsonifyr`   as_dictr;   listdictr<   rt   daterx   r{   	timedeltari   
ValueErrorr   )objr~   r   r   r   KombuDictTyper   s      `  @r!   r   r      s   
 766666wm!*+>@ @ @H #}%% (kk$k''
{jm44{
	C%	'	' ())))S))))	C		 (
 
 
 
 
.1iikk
 
 
 	
 
C(-7	8	8 	( %%%	C+	,	, (3xx&JT#YYJJ3JJCJJJ   #"3'''r"   c                 X    t          j                    }|s| |d         | u r | |d         )Nr   )sysexc_info)r*   r   s     r!   raise_with_contextr     s8    |~~H 		!		
8A;r"   r2   )-rY   rt   numbersr   base64r   rf   r   rb   	functoolsr   inspectr   	itertoolsr   kombu.utils.encodingr   r	   r
   cPicklerD   ImportError__all__r)   BaseExceptionobjectr(   rh   r   r+   r,   r   r&   r   r@   r   r   r   r   r   r{   Realri   r   r   r3   r"   r!   <module>r      s\   / /   



 , , , , , , , , , , , ,                   F F F F F F F F F F   MMMMM #M6: $)U#'4!%e5 5 
9 9 9
 *0$*L   >? ? ?4 4 4 4     (: : : : :9 : : :z< < < %+L      7 7 7) ) )     & #<-4 $( ( ( (D    s   = 	A	A	