
    &e2                        d dl mZ d dl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 d 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 d dlmZ d dlmZmZ  G d de          ZdddZ dS )    )annotationsN)Any)parse)runtime)
ForwardMsg)WidgetStates)ForwardMsgQueue)MemoryUploadedFileManager)	RerunDataScriptRunnerScriptRunnerEvent)ScriptCache)ScriptRunContext)SafeSessionState)ElementTreeparse_tree_from_messagesc                  T     e Zd ZdZd fdZdd	ZddZ	 	 	 dd dZd!dZd"dZ	 xZ
S )#LocalScriptRunnerz9Subclasses ScriptRunner to provide some testing features.script_pathstrsession_stater   c           
         t           j                            |          sJ d|             t                       _        | _        | _        t                                          d| j        j	        t          d          t                      t                      ddi           g  _        g  _        d fd} j                            |d           dS )z7Initializes the ScriptRunner for the given script_path.zFile not found at ztest session idz/mock/uploademailztest@test.com)
session_idmain_script_pathr   uploaded_file_mgrscript_cacheinitial_rerun_data	user_infosenderScriptRunner | Noneeventr   returnNonec                    | | k    s
J d            j                             |           j                            |           |t          j        k    r$|d         }j                            |           d S d S )Nz$Unexpected ScriptRunnerEvent sender!forward_msg)eventsappend
event_datar   ENQUEUE_FORWARD_MSGforward_msg_queueenqueue)r    r"   kwargsr&   selfs       Hlib/python3.11/site-packages/streamlit/testing/v1/local_script_runner.pyrecord_eventz0LocalScriptRunner.__init__.<locals>.record_event?   s     &D...5 #1.. Ku%%%O""6*** )===$]3&..{;;;;; >=    F)weakN)r    r!   r"   r   r#   r$   )ospathisfiler	   r+   r   r   super__init___stater
   r   r   r'   r)   on_eventconnect)r.   r   r   r0   	__class__s   `   r/   r7   zLocalScriptRunner.__init__$   s     w~~k**NN,N,N,NNNN!0!2!2&*((,37GG$({{0 	 	
 	
 	
 02%'	< 	< 	< 	< 	< 	<" 	l77777r1   r#   r$   c                J    | j         | j                                          dS dS )z7Wait for the script thread to finish, if it is running.N)_script_threadjoinr.   s    r/   r>   zLocalScriptRunner.joinR   s.    *$$&&&&& +*r1   list[ForwardMsg]c                    | j         j        S )z+Return all messages in our ForwardMsgQueue.)r+   _queuer?   s    r/   forward_msgszLocalScriptRunner.forward_msgsW   s    %,,r1   N   widget_stateWidgetStates | Nonetimeoutfloatr   c                   d}|rt          j        |d          }t          ||          }|                     |           | j        s|                                  t          | |           t          |                                           }|S )z|Run the script, and parse the output messages for querying
        and interaction.

        Timeout is in seconds.
         T)doseq)widget_statesquery_string)	r   	urlencoder   request_rerunr=   startrequire_widgets_deltasr   rC   )r.   rE   query_paramsrG   rM   
rerun_datatrees          r/   runzLocalScriptRunner.run[   s      	E ?<tDDDL\UUU
:&&&" 	JJLLLtW---'(9(9(;(;<<r1   boolc                @    | j         D ]}|t          j        k    r dS dS )NTF)r'   r   SHUTDOWN)r.   es     r/   script_stoppedz LocalScriptRunner.script_stoppedt   s3     	 	A%...tt /ur1   ctxr   r"   r   premature_stopc                    |s$| j         j                            |j                   | j                            | |           t          j                    j        	                                 d S )N)r"   )
_session_stater8   _remove_stale_widgetswidget_ids_this_runr9   sendr   get_instancemedia_file_mgrremove_orphaned_files)r.   r[   r"   r\   s       r/   _on_script_finishedz%LocalScriptRunner._on_script_finishedz   sm    
  	V&<<S=TUUU 	4u--- 	-CCEEEEEr1   )r   r   r   r   )r#   r$   )r#   r@   )NNrD   )rE   rF   rG   rH   r#   r   )r#   rV   )r[   r   r"   r   r\   rV   r#   r$   )__name__
__module____qualname____doc__r7   r>   rC   rU   rZ   re   __classcell__)r;   s   @r/   r   r   !   s        CC,8 ,8 ,8 ,8 ,8 ,8\' ' ' '
- - - - -1	    2   F F F F F F F Fr1   r   rD   runnerrG   rH   r#   r$   c                ^   t          j                     }t          j                     |z
  |k     rDt          j        d           |                                 rdS t          j                     |z
  |k     Dd| d}|                                  |                                  t          |          )zWait for the given ScriptRunner to emit a completion event. If the timeout
    is reached, the runner will be shutdown and an error will be thrown.
    gMbP?Nz#AppTest script run timed out after z(s))timesleeprZ   request_stopr>   RuntimeError)rk   rG   t0
err_strings       r/   rQ   rQ      s    
 
B
)++
W
$
$
5  "" 	F )++
W
$
$ DwCCCJ 
KKMMM
z
"
""r1   )rD   )rk   r   rG   rH   r#   r$   )!
__future__r   r3   rm   typingr   urllibr   	streamlitr   streamlit.proto.ForwardMsg_pb2r    streamlit.proto.WidgetStates_pb2r   #streamlit.runtime.forward_msg_queuer	   .streamlit.runtime.memory_uploaded_file_managerr
   streamlit.runtime.scriptrunnerr   r   r   +streamlit.runtime.scriptrunner.script_cacher   1streamlit.runtime.scriptrunner.script_run_contextr   *streamlit.runtime.state.safe_session_stater   !streamlit.testing.v1.element_treer   r   r   rQ    r1   r/   <module>r      ss   # " " " " " 				                    5 5 5 5 5 5 9 9 9 9 9 9 ? ? ? ? ? ? T T T T T T U U U U U U U U U U C C C C C C N N N N N N G G G G G G S S S S S S S SgF gF gF gF gF gF gF gFT# # # # # # #r1   