o
    h4                     @   sb  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*ee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      t |  d S N)global_repr_processorsappend)	processor r   W/var/www/html/pro-man-master/venv/lib/python3.10/site-packages/sentry_sdk/serializer.pyadd_global_repr_processor=      r    c                 C   r   r   )sequence_typesr   )tyr   r   r   add_repr_sequence_typeE   r!   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__M   s   
zMemo.__init__c                 C   s   | j | | S r   )r(   r   r)   objr   r   r   memoizeR   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__W   s
   
zMemo.__enter__c                 C   s   | j t| j d  d S r   )r'   popr/   r(   )r)   r#   valuetbr   r   r   __exit__`   s   zMemo.__exit__N)__name__
__module____qualname__	__slots__r*   r-   r0   r4   r   r   r   r   r%   J   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fdd						dfdd	 fdd 	
fddtd z| fi |}	srt|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)r2   
repr_value)r=   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   breadcrumbsrA   values   extraNFrF   )is_request_bodyp0)_is_request_bodyr<   rL   r   r   _is_databag   s"   zserialize.<locals>._is_databagc                      @   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   spansrP   dataTFrR   r   rL   r   r   _is_span_attribute      z%serialize.<locals>._is_span_attributec                      rW   )Nr   requestrA   rY   TFrR   r   rZ   r   r   rU      r\   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 )NrA   )
is_databagrS   should_repr_stringsremaining_depthremaining_breadthz=<failed to serialize, use init(debug=True) to see error logs>)	r   r-   CYCLE_MARKERr1   rC   BaseExceptionr   sysexc_info)r,   r^   rS   r_   rI   ra   r`   result)_serialize_node_implmemorK   rL   r   r   _serialize_node   s\   

z"serialize.<locals>._serialize_nodec                    s$   t | tr di | j | j} | S )Nr   )
isinstancer   metadatar2   )r,   )rM   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  }|s_|rztrz
|d}tD ]}|| |}	|	tury|	  S qht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sQt | ttrQg }t| D ]0\}}|d ur6||kr6 t| d
  |S |||||||d urG|d nd |d q|S |rY| } nt | tset | trk| dd} t | tsu| } tdkod dkod dk}|r| S t| 	dS )NFinfr   z!limitx)rem)
max_length)rh   r`   __sentry_repr__)rC   rA   )rI   r_   r^   rS   r`   ra   zutf-8replace   rX   r.   description)rj   r   floatMAX_DATABAG_DEPTHMAX_DATABAG_BREADTHr   r   NotImplementedgetattrtypeboolintmathisinfisnancallabler   rE   r	   r   dictitemsrC   serializable_str_typestupler"   	enumerater   bytes	bytearraydecode)r,   r^   rS   r_   r`   ra   is_span_attributehintsr   rf   sentry_reprrv_dictikvstr_krv_listis_span_description)rM   rl   rV   rU   r[   r@   ri   r<   keep_request_bodiesr;   rh   rL   r   r   rg      s   
	





&z'serialize.<locals>._serialize_node_implTr   _meta)NNNNNN)r%   r1   r   setrj   r   )eventkwargsserialized_eventr   )rM   rl   rV   rU   r[   r@   ri   rg   r=   r<   r   r;   rh   rK   rL   r   	serializej   s<   

&" 
r   )/rd   r}   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   rE   SpanReprProcessorr|   Segmentr   r   
memoryviewr   MAX_EVENT_BYTESrv   rw   rb   r   r    r"   r$   r%   r   r   r   r   r   <module>   s>     	  