
    h               	          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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jR                  e*fdddfdZ+d Z,y# e$ r ddlZY w xY w)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      V/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/utils/serialization.pyr   r   !   s    vi,!788    c                     t        | dg       }t        | j                  t              D ]  }	  || } | ||             |c S  y# t        $ r Y (w xY w)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CMM+@A	*H%/" O B  		s   A	AAc                 4    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&+>>r"   c                 ,    |st         }t        | ||      S )z&Dynamically create an exception class.)r)   r   )r   r    r   s      r!   r   r   I   s    dFF33r"   c                     g }| D ]  }	  ||       |j                  |        t        |      S # t        $ r |j                  t        |             Y Ow xY w)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CL  %    	1  30	1s   /#AAc                   L     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
        |   ||||       y )Nc                 R    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__   sH    +=
 %(%	\=	r"   c                 \     t        | j                  | j                        | j                   S r2   )r   rG   rF   r-   rK   s    r!   restorez$UnpickleableExceptionWrapper.restore   s1    5#D$5$5$(OO56:mmE 	Er"   c                     | j                   S r2   )rH   rM   s    r!   __str__z$UnpickleableExceptionWrapper.__str__   s    yyr"   c           	           | |j                   j                  |j                   j                  t        |dg       t	        |            }t        |d      r|j                  |j                        }|S )Nr$   __traceback__)r'   r   __name__r%   r	   hasattrwith_tracebackrR   )r7   r*   ress      r!   from_exceptionz+UnpickleableExceptionWrapper.from_exception   s`    MM$$MM""C$cN	
 3($$S%6%67C
r"   r2   )rS   r   __qualname____doc__rF   rG   r-   rJ   rN   rP   classmethodrW   __classcell__)r'   s   @r!   r   r   d   sA    * J L H	E 	 	r"   r   c                     	 t        j                  t        j                  |              | S # t        $ r Y nw xY wt	        |       }|r|S t
        j                  |       S )z"Make sure exception is pickleable.)rD   r+   r,   r)   r   r   rW   )r*   nearests     r!   r   r      s\    V\\#&' 
   (,G'66s;;s   (, 	88c                 N    	  | ||              | S # t         $ r	 t         cY S w xY w)zGet pickleable exception type.)r)   )r7   r+   r,   s      r!   r   r      s1    eCj 
  s    $$c                 F    t        | t              r| j                         S | S )z,Reverse of :meth:`get_pickleable_exception`.)
isinstancer   rN   )r*   s    r!   r   r      s    #34{{}Jr"   c                 <    t        t        t        |                   S r2   )r   base64encoder
   ss    r!   r   r      s    \!_566r"   c                 *    t        t        |             S r2   )base64decoder
   rc   s    r!   r   r      s    Q((r"   c                     |t         }t        | t              r	 || j                            S | S # t        $ r t        d| d      w xY w)z_Convert common terms for true/false to bool.

    Examples (true/false/yes/no/on/off/1/0).
    zCannot coerce z to type bool)STRTOBOOL_DEFAULT_TABLEr`   strlowerKeyError	TypeError)termtables     r!   r   r      s]    
 }'$	D&& K  	DnTHMBCC	Ds	   / Ac                 T   t        | t        j                        rB| j                         }| j                  r|d d |dd  z   }|j	                  d      r|d d dz   }|S t        | t        j
                        r#| j                         }| j                  r|d d }|S | j                         S )N      z+00:00iZ   )r`   datetime	isoformatmicrosecondendswithtime)dtrs     r!   _datetime_to_jsonr{      s    "h''(LLN>>#223A::h#2A	B	&LLN>>#2A||~r"   c           	         ddl m} t        t        ||||      }t	        | |      r| j                  d      } | t	        | |      r| S t	        | t        t        f      r| D cg c]
  } ||       c}S t	        | t              r8| j                         D ci c]  \  }}|r	 ||      rn	 | |||       c}}S t	        | t        j                  t        j                  f      rt        |       S t	        | t        j                        rt        |       S |t!        dt#        |       d| d	| d
       ||       S c c}w c c}}w )z;Transform object making it suitable for json serialization.r   )Object)builtin_typeskey	keyfilterunknown_type_filterT)recurse)r   zUnsupported type:  z
 (parent: ))kombu.abstractr}   r   jsonifyr`   as_dictr;   listdictr<   rt   daterx   r{   	timedeltari   
ValueErrorr   )	objr~   r   r   r   KombuDictType_jsonifyrE   ks	            r!   r   r      s9   
 7wm!*+>@H #}%kk$k'
{jm4
	C%	'%()))	C	.1iik
&*a )	!q xq!!
 	
 
C(--7	8 %%	C++	,3x&$T#YM3'C5J  #3'' *
s   #D?!Ec                 N    t        j                         }|s| |d   | u r | |d   )N   )sysexc_info)r*   r   s     r!   raise_with_contextr     s0    ||~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 #M6: $)U#'4!%e5 
9
 *0$*LL>?4 (:9 :z< %+LL 7)& #<<-4 $(Dy  s   C 	CC