o
    BDi3                     @   sR  d dl Z d dlZd dlmZmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ erd 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 dlmZ d dlmZ d dlmZ eeef Zeeeeef geeef f Zeeef Z ee!e"e#fZ$dZ%dZ&dZ'dZ(g Z)dd Z*G dd dZ+dd Z,dS )    N)MappingSequenceSet)datetime)AnnotatedValuecapture_internal_exceptiondisable_capture_eventformat_timestamp	safe_reprstrip_string)TYPE_CHECKING)TracebackType)Any)Callable)ContextManager)Dict)List)Optional)Type)Union)NotImplementedTypei@B    
   z<cyclic>c                 C   s   t |  d S N)global_repr_processorsappend)	processor r   N/var/www/Datamplify/venv/lib/python3.10/site-packages/sentry_sdk/serializer.pyadd_global_repr_processor=   s   r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Memo_ids_objsc                 C   s   i | _ g | _d S r   r!   )selfr   r   r   __init__E   s   
zMemo.__init__c                 C   s   | j | | S r   )r#   r   r$   objr   r   r   memoizeJ   s   zMemo.memoizec                 C   s.   | j d }t|| jv rdS || jt|< dS )NTF)r#   idr"   r&   r   r   r   	__enter__O   s
   
zMemo.__enter__c                 C   s   | j t| j d  d S r   )r"   popr*   r#   )r$   tyvaluetbr   r   r   __exit__X   s   zMemo.__exit__N)__name__
__module____qualname__	__slots__r%   r(   r+   r0   r   r   r   r   r    B   s    	r    c                    s  t  g g |dddk	|dd
|dd|ddfdd	fd
d fddfdd						dfdd	 fdd 	
fddtd z| fi |}srt|trd |d< |W td S td w )at  
    A very smart serializer that takes a dict and emits a json-friendly dict.
    Currently used for serializing the final Event and also prematurely while fetching the stack
    local variables for each frame in a stacktrace.

    It works internally with 'databags' which are arbitrary data structures like Mapping, Sequence and Set.
    The algorithm itself is a recursive graph walk down the data structures it encounters.

    It has the following responsibilities:
    * Trimming databags and keeping them within MAX_DATABAG_BREADTH and MAX_DATABAG_DEPTH.
    * Calling safe_repr() on objects appropriately to keep them informative and readable in the final payload.
    * Annotating the payload with the _meta field whenever trimming happens.

    :param max_request_body_size: If set to "always", will never trim request bodies.
    :param max_value_length: The max length to strip strings to, defaults to sentry_sdk.consts.DEFAULT_MAX_VALUE_LENGTH
    :param is_vars: If we're serializing vars early, we want to repr() things that are JSON-serializable to make their type more apparent. For example, it's useful to see the difference between a unicode-string and a bytestring when viewing a stacktrace.
    :param custom_repr: A custom repr function that runs before safe_repr on the object to be serialized. If it returns None or throws internally, we will fallback to safe_repr.

    max_request_body_sizeNalwaysmax_value_lengthis_varsFcustom_reprc                    s>   zd } d ur | }|pt | W S  ty   t |  Y S w r   )r
   	Exception)r.   
repr_value)r9   r   r   _safe_repr_wrapper   s   z%serialize.<locals>._safe_repr_wrapperc                     s   t  t kr5zt  d  } d t|i }W n ty'   i }Y nw  | t  t ks d di |  d S )N   r)    )len
setdefaultstr
IndexErrorr   update)metasegmentnode)
meta_stackpathr   r   	_annotate   s   
	zserialize.<locals>._annotatec                     sr   z.rW dS   } | dv r| W S d }|dkr%d dkr%d  W dS |dkr,W dS W d
S  t y8   Y d	S w )z
        A databag is any value that we need to trim.
        True for stuff like vars, request bodies, breadcrumbs and extra.

        :returns: `True` for "yes", `False` for :"no", `None` for "maybe soon".
        T)TNr   breadcrumbsr=   values   extraNFrB   )is_request_bodyp0)_is_request_bodyr8   rH   r   r   _is_databag   s"   zserialize.<locals>._is_databagc                      s@   z d dkr d dkrW dS W dS W dS  t y   Y d S w )Nr   requestr=   dataTFrN   r   )rH   r   r   rQ      s   z#serialize.<locals>._is_request_bodyc              	      s  |d ur	 | zzT| E}|r0tW  d    W W |d ur/  td d = S S  | |||||dW  d    W W |d urT  td d = S S 1 sXw   Y  W n= ty   tt  |rY W |d ur  td d = dS dS Y W |d ur  td d = d S d S w W |d ur  td d = d S d S |d urÈ  td d = w )Nr=   )
is_databagrO   should_repr_stringsremaining_depthremaining_breadthz=<failed to serialize, use init(debug=True) to see error logs>)	r   r(   CYCLE_MARKERr,   r?   BaseExceptionr   sysexc_info)r'   rU   rO   rV   rE   rX   rW   result)_serialize_node_implmemorG   rH   r   r   _serialize_node   s\   

z"serialize.<locals>._serialize_nodec                    s$   t | tr di | j | j} | S )Nr   )
isinstancer   metadatar.   )r'   )rI   r   r   _flatten_annotated   s   
z%serialize.<locals>._flatten_annotatedc                    s"  t | trd}|d u r}|d u r }|d u r }|r6|r*r*td}td}n|d u r0t}|d u r6t}| } |d urX|dkrX ddggd |rVt| dS d S |rutru	|d}tD ]}|| |}|turt|  S qctt	| d	d }	| d u st | t
ttfr|st | trt| st| r| S | S t|	r|	| S t | tr|stt| S | S t | trt|  } i }
d}|  D ]5\}}|d ur||kr t| d
  |
S t|}||||||d ur|d nd |d}||
|< |d7 }q|
S t | tsLt | ttfrLg }t| D ]0\}}|d ur1||kr1 t| d
  |S |||||||d urB|d nd |d q|S |rT| } nt | ts`t | trf| dd} t | tsp| } t
dko
d dko
d dk}|r| S t| dS )NFinfr   z!limitx)rem)
max_length)r_   rW   __sentry_repr__)r?   r=   )rE   rV   rU   rO   rW   rX   zutf-8replace   spansr)   description)ra   r   floatMAX_DATABAG_DEPTHMAX_DATABAG_BREADTHr   r   NotImplementedgetattrtypeboolintmathisinfisnancallabler   rA   r	   r   dictitemsr?   serializable_str_typesr   r   	enumerater   bytes	bytearraydecode)r'   rU   rO   rV   rW   rX   hintsr   r]   sentry_reprrv_dictikvstr_krv_listis_span_description)rI   rc   rR   rQ   r<   r`   r8   keep_request_bodiesr7   r_   rH   r   r   r^      s   
	





&z'serialize.<locals>._serialize_node_implTr   _meta)NNNNNN)r    r,   r   setra   ry   )eventkwargsserialized_eventr   )rI   rc   rR   rQ   r<   r`   r^   r9   r8   r   r7   r_   rG   rH   r   	serializeb   s:   
&  
r   )-r[   ru   collections.abcr   r   r   r   sentry_sdk.utilsr   r   r   r	   r
   r   typingr   typesr   r   r   r   r   r   r   r   r   sentry_sdk._typesr   rA   SpanReprProcessorrt   Segmentr}   r~   
memoryviewr{   MAX_EVENT_BYTESrn   ro   rY   r   r   r    r   r   r   r   r   <module>   s:     	  