Ë
    õ�DjÝ#  ã                   ó4  — d dl Z d dlZd dlZd dlmZmZ d dlm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 er*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„Zedd„«       Zd„ Zd„ Zedd„«       Zedd„«       ZdZdZd„ Z  G d„ d«      Z!y)é    N)ÚThreadÚLock)Úcontextmanager)ÚEnvelope)ÚSession)Úformat_timestamp)ÚTYPE_CHECKING)ÚAny)ÚCallable)ÚDict)Ú	Generator)ÚList)ÚOptional)ÚUnionc                 ó  — t        j                  dt        d¬«       | €t        j                  j
                  } | j                  j                  }|€6| j                  r| j                  j                  ni }|j                  dd«      }|S )zHDEPRECATED: Utility function to find out if session tracking is enabled.únThis function is deprecated and will be removed in the next major release. There is no public API replacement.é   ©Ú
stacklevelÚauto_session_trackingF)ÚwarningsÚwarnÚDeprecationWarningÚ
sentry_sdkÚHubÚcurrentÚscopeÚ_force_auto_session_trackingÚclientÚoptionsÚget)ÚhubÚshould_trackÚclient_optionss      úWC:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\sentry_sdk/sessions.pyÚ is_auto_session_tracking_enabledr&      sv   € ô
 ‡M�Mð	.äØõ	ð €{Ü�n‰n×$Ñ$ˆà—9‘9×9Ñ9€LàÐØ/2¯zªz˜Ÿ™×+Ò+¸rˆØ%×)Ñ)Ð*AÀ5ÓIˆàÐó    c              #   ó   K  — t        j                  dt        d¬«       | €t        j                  j
                  } t        j                  «       5  t        j                  dt        «       t        | «      }ddd«       r| j                  |¬«       	 d–— |r| j                  «        yy# 1 sw Y   Œ6xY w# |r| j                  «        w w xY w­w)zgDEPRECATED: Use track_session instead
    Starts and stops a session automatically around a block.
    zeThis function is deprecated and will be removed in the next major release. Use track_session instead.r   r   NÚignore©Úsession_mode)r   r   r   r   r   r   Úcatch_warningsÚsimplefilterr&   Ústart_sessionÚend_session)r"   r+   r#   s      r%   r   r   0   sµ   è ø€ ô ‡M�Mð	%äØõ	ð €{Ü�n‰n×$Ñ$ˆÜ	×	 Ñ	 Ó	"ñ =Ü×Ñ˜hÔ(:Ô;Ü7¸Ó<ˆ÷=ñ Ø×Ñ |ÐÔ4ðÛáØ�O‰OÕð ÷=ð =ûñ Ø�O‰OÕð üs6   ‚ACÁ&B*Á5CÂB6 ÂCÂ*B3Â/CÂ6CÃCc                 óP   — t        j                  dt        d¬«       t        | «      S )zR
    DEPRECATED: Utility function to find out if session tracking is enabled.
    r   r   r   )r   r   r   Ú!_is_auto_session_tracking_enabled)r   s    r%   Ú&is_auto_session_tracking_enabled_scoper2   K   s(   € ô ‡M�Mð	.äØõ	ô -¨UÓ3Ð3r'   c                 ó‚   — | j                   }|€0t        j                  «       j                  }|j	                  dd«      }|S )zF
    Utility function to find out if session tracking is enabled.
    r   F)r   r   Ú
get_clientr    r!   )r   r#   r$   s      r%   r1   r1   \   sB   € ð ×5Ñ5€LØÐÜ#×.Ñ.Ó0×8Ñ8ˆØ%×)Ñ)Ð*AÀ5ÓIˆàÐr'   c              #   ó�   K  — t        j                  dt        d¬«       t        | |¬«      5  d–— ddd«       y# 1 sw Y   yxY w­w)z„DEPRECATED: This function is a deprecated alias for track_session.
    Starts and stops a session automatically around a block.
    zdThis function is a deprecated alias for track_session and will be removed in the next major release.r   r   r*   N)r   r   r   Útrack_session)r   r+   s     r%   Úauto_session_tracking_scoper7   j   s@   è ø€ ô ‡M�MØnÜØõô 
�u¨<Ô	8ñ Û÷÷ ñ üs   ‚*A¬:±	AºA¿Ac              #   óª   K  — t        | «      }|r| j                  |¬«       	 d–— |r| j                  «        yy# |r| j                  «        w w xY w­w)z¢
    Start a new session in the provided scope, assuming session tracking is enabled.
    This is a no-op context manager if session tracking is not enabled.
    r*   N)r1   r.   r/   )r   r+   r#   s      r%   r6   r6   {   sV   è ø€ ô 5°UÓ;€LÙØ×Ñ¨ÐÔ6ð ÛáØ×ÑÕð ø‰<Ø×ÑÕð üs   ‚ A£; §A»AÁA)ÚexitedÚabnormalÚcrashedéd   c                 óL   — t        |«      t        | j                  «       «      dœS )N)ÚattrsÚ
aggregates)ÚdictÚlistÚvalues)Úaggregate_statesr>   s     r%   Úmake_aggregate_enveloperD   ‘   s    € ä˜%“[´Ð5E×5LÑ5LÓ5NÓ0OÑPÐPr'   c                   ó:   — e Zd Z	 d	d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)
ÚSessionFlusherc                 ó¢   — || _         || _        g | _        i | _        d | _        t        «       | _        t        «       | _        d | _        d| _	        y )NT)
Úcapture_funcÚflush_intervalÚpending_sessionsÚpending_aggregatesÚ_threadr   Ú_thread_lockÚ_aggregate_lockÚ_thread_for_pidÚ_running)ÚselfrH   rI   s      r%   Ú__init__zSessionFlusher.__init__—   sN   € ð )ˆÔØ,ˆÔØ "ˆÔØ"$ˆÔØˆŒÜ ›FˆÔÜ#›vˆÔØ#ˆÔØˆ�r'   c                 ól  — | j                   }g | _         | j                  5  | j                  }i | _        d d d «       t        «       }|D ]J  }t	        |j
                  «      t        k(  r| j                  |«       t        «       }|j                  |«       ŒL j                  «       D ]W  \  }}t	        |j
                  «      t        k(  r| j                  |«       t        «       }|j                  t        ||«      «       ŒY t	        |j
                  «      dkD  r| j                  |«       y y # 1 sw Y   Œ÷xY w)Nr   )rJ   rN   rK   r   ÚlenÚitemsÚMAX_ENVELOPE_ITEMSrH   Úadd_sessionÚadd_sessionsrD   )rQ   rJ   rK   ÚenvelopeÚsessionr>   Ústatess          r%   ÚflushzSessionFlusher.flush§   s  € à×0Ñ0ÐØ "ˆÔà×!Ñ!ñ 	)Ø!%×!8Ñ!8ÐØ&(ˆDÔ#÷	)ô “:ˆØ'ò 	*ˆGÜ�8—>‘>Ó"Ô&8Ò8Ø×!Ñ! (Ô+Ü#›:�à× Ñ  Õ)ð	*ð 0×5Ñ5Ó7ò 	J‰MˆE�6Ü�8—>‘>Ó"Ô&8Ò8Ø×!Ñ! (Ô+Ü#›:�à×!Ñ!Ô"9¸&À%Ó"HÕIð	Jô ˆx�~‰~Ó Ò"Ø×Ñ˜hÕ'ð #÷'	)ð 	)ús    D*Ä*D3c                 óà  ‡ — ‰ j                   t        j                  «       k(  r‰ j                  �y‰ j                  5  ‰ j                   t        j                  «       k(  r‰ j                  �
	 ddd«       yˆ fd„}t        |¬«      }d|_        	 |j                  «        |‰ _        t        j                  «       ‰ _         ddd«       y# t        $ r d‰ _	        Y ddd«       yw xY w# 1 sw Y   yxY w)a%  
        Check that we have an active thread to run in, or create one if not.

        Note that this might fail (e.g. in Python 3.12 it's not possible to
        spawn new threads at interpreter shutdown). In that case self._running
        will be False after running this function.
        Nc                  ó°   •— ‰ j                   rIt        j                  ‰ j                  «       ‰ j                   r‰ j	                  «        ‰ j                   rŒHy y ©N)rP   ÚtimeÚsleeprI   r\   ©rQ   s   €r%   rL   z/SessionFlusher._ensure_running.<locals>._threadÑ   s5   ø€ à—m’mÜ—J‘J˜t×2Ñ2Ô3Ø—}’}ØŸ
™
œð —m•mr'   )ÚtargetTF)
rO   ÚosÚgetpidrL   rM   r   ÚdaemonÚstartÚRuntimeErrorrP   )rQ   rL   Úthreads   `  r%   Ú_ensure_runningzSessionFlusher._ensure_runningÂ   sÖ   ø€ ð ×Ñ¤2§9¡9£;Ò.°4·<±<Ð3KØØ×Ññ 	/Ø×#Ñ#¤r§y¡y£{Ò2°t·|±|Ð7OØ÷	/ð 	/ô%ô  7Ô+ˆFØ ˆFŒMðØ—‘”ð "ˆDŒLÜ#%§9¡9£;ˆDÔ ÷-	/ð0 øô  ò ð !&�”Ø÷'	/ð 	/ðú÷	/ð0 ús5   ¼/C$Á4C$ÂCÂ C$ÃC!ÃC$Ã C!Ã!C$Ã$C-c                 óz  — | j                   5  |j                  d¬«      }t        t        |j	                  «       «      «      }|j
                  }| j                  j                  |i «      }|j                  |i «      }d|vrt        |j
                  «      |d<   |j                  dk(  r|j                  dd«      dz   |d<   nh|j                  dk(  r|j                  dd«      dz   |d<   n@|j                  dkD  r|j                  dd«      dz   |d<   n|j                  d	d«      dz   |d	<   d d d «       y # 1 sw Y   y xY w)
NF)Úwith_user_infoÚstartedr;   r   é   r:   Úerroredr9   )rN   Úget_json_attrsÚtupleÚsortedrU   Útruncated_startedrK   Ú
setdefaultr   Ústatusr!   Úerrors)rQ   rZ   r>   Úprimary_keyÚsecondary_keyr[   Ústates          r%   Úadd_aggregate_sessionz$SessionFlusher.add_aggregate_sessionç   s)  € ð ×!Ñ!ñ 	=Ø×*Ñ*¸%Ð*Ó@ˆEÜ¤ u§{¡{£}Ó 5Ó6ˆKØ#×5Ñ5ˆMØ×,Ñ,×7Ñ7¸ÀRÓHˆFØ×%Ñ% m°RÓ8ˆEà Ñ%Ü#3°G×4MÑ4MÓ#N��iÑ ð �~‰~ Ò*Ø#(§9¡9¨Y¸Ó#:¸QÑ#>��iÒ Ø—‘ :Ò-Ø$)§I¡I¨j¸!Ó$<¸qÑ$@��jÒ!Ø—‘ !Ò#Ø#(§9¡9¨Y¸Ó#:¸QÑ#>��iÒ à"'§)¡)¨H°aÓ"8¸1Ñ"<��h‘÷%	=÷ 	=ñ 	=ús   �DD1Ä1D:c                 ó¸   — |j                   dk(  r| j                  |«       n)| j                  j                  |j	                  «       «       | j                  «        y )NÚrequest)r+   rz   rJ   ÚappendÚto_jsonrj   )rQ   rZ   s     r%   rW   zSessionFlusher.add_session  sG   € ð ×Ñ 9Ò,Ø×&Ñ& wÕ/à×!Ñ!×(Ñ(¨¯©Ó):Ô;Ø×ÑÕr'   c                 ó   — d| _         y )NF)rP   rb   s    r%   ÚkillzSessionFlusher.kill  s	   € àˆ�r'   c                 ó$   — | j                  «        y r_   )r€   rb   s    r%   Ú__del__zSessionFlusher.__del__  s   € à�	‰	�r'   N)é<   )
Ú__name__Ú
__module__Ú__qualname__rR   r\   rj   rz   rW   r€   r‚   © r'   r%   rF   rF   –   s+   „ ð óò (ò6#òJ=ò>òór'   rF   r_   )NÚapplication)rˆ   )"rd   r`   r   Ú	threadingr   r   Ú
contextlibr   r   Úsentry_sdk.enveloper   Úsentry_sdk.sessionr   Úsentry_sdk.utilsr   Útypingr	   r
   r   r   r   r   r   r   r&   r   r2   r1   r7   r6   ÚTERMINAL_SESSION_STATESrV   rD   rF   r‡   r'   r%   ú<module>r�      s¦   ðÛ 	Û Û ß "Ý %ã Ý (Ý &Ý -å  áÝÝÝÝ ÝÝÝóð0 òó ðò44ò"ð òó ðð  ò ó ð ð" <Ð ØÐ òQ÷
@ò @r'   