a
    xd;@                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZmZmZm	Z	m
Z
 d dlZd dlmZmZmZmZmZ d dlmZ erBd 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 d dlm Z  d dlm!Z!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rbd dl(m)Z)m*Z*m+Z+ eZ,nd dl-m)Z)m*Z*m+Z+ e#e.fZ,dZ/dZ0dZ1dZ2g Z3dd Z4G dd de5Z6dddZ7dS )    N)datetime)AnnotatedValuecapture_internal_exceptiondisable_capture_eventformat_timestamp
json_dumps	safe_reprstrip_string)	text_typePY2string_typesnumber_types	iteritems)MYPY)	timedelta)TracebackType)Any)Callable)ContextManager)Dict)List)Optional)Tuple)Type)Union)NotImplementedTypeEvent)MappingSequenceSeti@B    
   z<cyclic>c                 C   s   t |  d S N)global_repr_processorsappend)	processor r&   M/var/www/html/Ranjet/env/lib/python3.9/site-packages/sentry_sdk/serializer.pyadd_global_repr_processorO   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__W   s    zMemo.__init__c                 C   s   | j | | S r"   )r,   r$   r-   objr&   r&   r'   memoize\   s    zMemo.memoizec                 C   s2   | j d }t|| jv rdS || jt|< dS d S )NTF)r,   idr+   r/   r&   r&   r'   	__enter__a   s
    
zMemo.__enter__c                 C   s   | j t| j d  d S r"   )r+   popr3   r,   )r-   tyvaluetbr&   r&   r'   __exit__j   s    zMemo.__exit__N)__name__
__module____qualname__	__slots__r.   r1   r4   r9   r&   r&   r&   r'   r)   T   s
   	r)   Fc           
   	      sd  t  g g g 
fdd fddfdddfdd	 fd	d
 	
f	ddfdd}td z| fi |}rt|trd |d< t
}	rD|dkrDt| dpg }|tj	j
 }||krDtt|}|t }	|	dkrD||| |	 rDt|trDd |d< |W td S td 0 d S )Nc                     sv   t  t kr\z(t  d  } d t|i }W n tyN   i }Y n0  | q  d di |  d S )N   r2    )len
setdefaultr
   
IndexErrorr$   update)metasegmentnode)
meta_stackpathr&   r'   	_annotate{   s    
zserialize.<locals>._annotatec                     s   zp d } | dkr0 d dkr0 d dkr0W dS | dv rn d d	krn d dkrn d
 dkrn d dkrnW dS W n t y   Y dS 0 dS )a  
        By default non-serializable objects are going through
        safe_repr(). For certain places in the event (local vars) we
        want to repr() even 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.

        For container-types we still don't do anything different.
        Generally we just try to make the Sentry UI present exactly
        what a pretty-printed repr would look like.

        :returns: `True` if we are somewhere in frame variables, and `False` if
            we are in a position where we will never encounter frame variables
            when recursing (for example, we're in `event.extra`). `None` if we
            are not (yet) in frame variables, but might encounter them when
            recursing (e.g.  we're in `event.exception`)
        r   Z
stacktracer>   frames   varsT)threads	exceptionvalues      NFrB   )p0)rH   r&   r'   _should_repr_strings   s$     




z'serialize.<locals>._should_repr_stringsc                     s   zj  } | dv r| W S d }|dkr8d dkr8W dS |dkrZd dkrZd	  W dS |d
krhW dS W n t y~   Y dS 0 dS )z
        A databag is any value that we need to trim.

        :returns: Works like `_should_repr_strings()`. `True` for "yes",
            `False` for :"no", `None` for "maybe soon".
        )TNr   requestr>   dataTZbreadcrumbsrO      extraNFrR   )rvrS   )rT   rH   r&   r'   _is_databag   s    
zserialize.<locals>._is_databagc              	      s  |d ur | zFz| }|r`tW  d    W W |d ur^  td d = S  | ||||dW  d    W W |d ur  td d = S 1 s0    Y  W nz ty2   tt  |rY W |d ur  td d = dS Y W |d ur.  td d = d S 0 W |d ur  td d = n&|d ur  td d = 0 d S )Nr>   )
is_databagshould_repr_stringsremaining_depthremaining_breadthz=<failed to serialize, use init(debug=True) to see error logs>)	r$   r1   CYCLE_MARKERr5   r@   BaseExceptionr   sysexc_info)r0   r[   r\   rE   r^   r]   result)_serialize_node_implmemorG   rH   r&   r'   _serialize_node   sP    	




z"serialize.<locals>._serialize_nodec                    s$   t | tr  f i | j | j} | S r"   )
isinstancer   metadatar7   )r0   )rI   r&   r'   _flatten_annotated   s    
z%serialize.<locals>._flatten_annotatedc                    s  |d u r }|d u r }|r,|d u r,t }|r<|d u r<t}| } |d ur||dkr| ddggd |rxtt| S d S |rtr|d}tD ]"}|| |}|tur|  S qtt| dd }| d u st| t	t
fr|st| trt| st| rt| S | S nbt|r*|| S t| trP|sHtt| S t| S t| trtt| } i }	d}
t| D ]p\}}|d ur|
|kr t| d  qt|}|||||d ur|d nd |d	}||	|< |
d7 }
qx|	S t| tszt| ttfrzg }t| D ]^\}
}|d urF|
|krF t| d  qv|||
|||d urf|d nd |d	 q|S |rt| } n,t| tr| d
d} t| tst| } rtdkrd dkrd dkrt|  | S t| S )Nr   z!limitx)rem)re   r]   Z__sentry_repr__)r@   r>   )rE   r\   r[   r]   r^   zutf-8replacerK   spansr2   description)MAX_DATABAG_DEPTHMAX_DATABAG_BREADTHr	   r   r#   NotImplementedgetattrtyperg   boolr   floatmathisinfisnancallabler   r
   r   r   dictr   r@   serializable_str_typesr   r   	enumerater$   bytesdecoder   )r0   r[   r\   r]   r^   hintsr%   rc   Zsentry_reprZrv_dictikvZstr_kZrv_list)	rI   ri   rZ   rf   rT   re   rH   smart_transaction_trimmingspan_description_bytesr&   r'   rd      s    








z'serialize.<locals>._serialize_node_implc                    s   d} fdd} d tt| dp*g |dD ]~\}}|dpHd}t||krXq4|t|| 8 }|dg t||d|d< d	d
= td d
= |dkr4 qq4  td d
= d
S )a  
        Modifies serialized_event in-place trying to remove excess_bytes from
        span descriptions. The original event is used read-only to access the
        span timestamps (represented as RFC3399-formatted strings in
        serialized_event).

        It uses heuristics to prioritize preserving the description of spans
        that might be the most interesting ones in terms of understanding and
        optimizing performance.
        r!   c           	         s\   | \}} d | }t  }|dp(|}|dp6|}|| }|dpLd}|t| fS )Nrm   Zstart_timestamp	timestamprn   r?   )r   utcnowgetr@   )	argsr   Zserialized_spanspannowstartenddurationrn   eventr&   r'   +shortest_duration_longest_description_first  s    zcserialize.<locals>._truncate_span_descriptions.<locals>.shortest_duration_longest_description_firstrm   )keyrn   r?   )
max_lengthNr>   r   )r$   sortedr|   r   r@   extendr	   r5   )Zserialized_eventr   excess_bytesZ
min_lengthr   r   r   rn   )ri   rG   rH   r   r'   _truncate_span_descriptionsx  s*    


z.serialize.<locals>._truncate_span_descriptionsTr   Z_metarm   F)NNNNN)r)   r   setrg   rz   sumr@   r   
sentry_sdkutilsZMAX_STRING_LENGTHr   MAX_EVENT_BYTES)
r   r   kwargsr   rY   Zsum_span_description_bytesZ
span_countZdescriptions_budget_bytesoriginal_bytesr   r&   )rI   ri   rZ   rf   rd   rT   re   rG   rH   r   r   r'   	serializet   sJ    &     $ 6



r   )F)8ra   rv   r   Zsentry_sdk.utilsr   r   r   r   r   r   r	   r   Zsentry_sdk._compatr
   r   r   r   r   Zsentry_sdk._typesr   r   typesr   typingr   r   r   r   r   r   r   r   r   r   r   strZSpanZReprProcessorintZSegmentcollectionsr   r   r   r{   collections.abcr}   r   ro   rp   r_   r#   r(   objectr)   r   r&   r&   r&   r'   <module>   sF   $
  