o
    h                     @  s   d dl mZ d dlZd dlmZ d dlmZmZmZ erDd 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mZ d d
lmZ G dd dZdS )    )annotationsN)contextmanager)TYPE_CHECKINGAnyCallable)Iterator)WidgetState)WidgetStates)RegisterWidgetResultTWidgetMetadata)QueryParams)SessionStatec                   @  s   e Zd ZU dZded< ded< ded< d@d
dZdAddZdBddZdCddZdDddZ	dEd d!Z
dFd$d%ZedGd'd(ZdHd+d,ZdId.d/ZdJd0d1ZdKd2d3ZdHd4d5ZdId6d7ZdJd8d9Zd:d; ZedLd=d>Zd?S )MSafeSessionStateav  Thread-safe wrapper around SessionState.

    When AppSession gets a re-run request, it can interrupt its existing
    ScriptRunner and spin up a new ScriptRunner to handle the request.
    When this happens, the existing ScriptRunner will continue executing
    its script until it reaches a yield point - but during this time, it
    must not mutate its SessionState.
    r   _statezthreading.RLock_lockCallable[[], None]_yield_callbackstateyield_callbackc                 C  s2   t | d| t | dt  t | d| d S )Nr   r   r   )object__setattr__	threadingRLock)selfr   r    r   ^/var/www/vscode/kcb/lib/python3.10/site-packages/streamlit/runtime/state/safe_session_state.py__init__-   s   zSafeSessionState.__init__metadataWidgetMetadata[T]user_key
str | NonereturnRegisterWidgetResult[T]c                 C  s@   |    | j | j||W  d    S 1 sw   Y  d S N)r   r   r   register_widget)r   r   r    r   r   r   r%   6   s   $z SafeSessionState.register_widgetlatest_widget_statesWidgetStatesProtoNonec                 C  s@   |    | j | j| W d    d S 1 sw   Y  d S r$   )r   r   r   on_script_will_rerun)r   r&   r   r   r   r)   =   s   "z%SafeSessionState.on_script_will_rerunwidget_ids_this_runset[str]c                 C  s8   | j  | j| W d    d S 1 sw   Y  d S r$   )r   r   on_script_finished)r   r*   r   r   r   r,   F   s   "z#SafeSessionState.on_script_finishedc                 C  s6   | j  | j  W d    d S 1 sw   Y  d S r$   )r   r   maybe_check_serializabler   r   r   r   r-   J   s   "z)SafeSessionState.maybe_check_serializablelist[WidgetStateProto]c                 C  s4   | j  | j W  d   S 1 sw   Y  dS )zGReturn a list of serialized widget values for each widget with a value.N)r   r   get_widget_statesr.   r   r   r   r0   N   s   $z"SafeSessionState.get_widget_statesstrboolc                 C  s6   | j  | j|W  d    S 1 sw   Y  d S r$   )r   r   is_new_state_value)r   r    r   r   r   r3   S   s   
$z#SafeSessionState.is_new_state_valuedict[str, Any]c                 C  s2   | j  | jjW  d   S 1 sw   Y  dS )zAThe combined session and widget state, excluding keyless widgets.N)r   r   filtered_stater.   r   r   r   r5   W   s   $zSafeSessionState.filtered_statekeyr   c                 C  s<   |    | j | j| W  d    S 1 sw   Y  d S r$   r   r   r   r   r6   r   r   r   __getitem__]      $zSafeSessionState.__getitem__valuec                 C  s>   |    | j || j|< W d    d S 1 sw   Y  d S r$   r7   r   r6   r;   r   r   r   __setitem__b   s   "zSafeSessionState.__setitem__c                 C  s<   |    | j | j|= W d    d S 1 sw   Y  d S r$   r7   r8   r   r   r   __delitem__g   s   
"zSafeSessionState.__delitem__c                 C  s<   |    | j || jv W  d    S 1 sw   Y  d S r$   r7   r8   r   r   r   __contains__l   r:   zSafeSessionState.__contains__c                 C  s(   z| | W S  t y   t| dw Nz not found in session_state.KeyErrorAttributeErrorr8   r   r   r   __getattr__q   s
   
zSafeSessionState.__getattr__c                 C  s   || |< d S r$   r   r<   r   r   r   r   w   s   zSafeSessionState.__setattr__c                 C  s*   z| |= W d S  t y   t| dw r@   rA   r8   r   r   r   __delattr__z   s
   zSafeSessionState.__delattr__c                   s8    fdd j  D }ddd |D }d| dS )zIPresents itself as a simple dict of the underlying SessionState instance.c                 3  s    | ]
}| j | fV  qd S r$   )r   ).0kr.   r   r   	<genexpr>   s    z,SafeSessionState.__repr__.<locals>.<genexpr>z, c                 s  s"    | ]\}}| d |V  qdS )z: Nr   )rF   rG   vr   r   r   rH      s     {})r   _keysjoin)r   kvsr   r.   r   __repr__   s   zSafeSessionState.__repr__Iterator[QueryParams]c                 c  s@    |    | j | jjV  W d    d S 1 sw   Y  d S r$   )r   r   r   query_paramsr.   r   r   r   rR      s
   "zSafeSessionState.query_paramsN)r   r   r   r   )r   r   r    r!   r"   r#   )r&   r'   r"   r(   )r*   r+   r"   r(   )r"   r(   )r"   r/   )r    r1   r"   r2   )r"   r4   )r6   r1   r"   r   )r6   r1   r;   r   r"   r(   )r6   r1   r"   r(   )r6   r1   r"   r2   )r"   rQ   )__name__
__module____qualname____doc____annotations__r   r%   r)   r,   r-   r0   r3   propertyr5   r9   r=   r>   r?   rD   r   rE   rP   r   rR   r   r   r   r   r      s0   
 	

	

	









r   )
__future__r   r   
contextlibr   typingr   r   r   collections.abcr    streamlit.proto.WidgetStates_pb2r   WidgetStateProtor	   r'   streamlit.runtime.state.commonr
   r   r   $streamlit.runtime.state.query_paramsr   %streamlit.runtime.state.session_stater   r   r   r   r   r   <module>   s   