o
    h2                     @  s@  U d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZmZmZmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZmZmZ eeZd
e d< dZ!d5ddZ"d6ddZ#d7ddZ$d8ddZ%d5ddZ&d7dd Z'd6d!d"Z(d9d%d&Z)d6d'd(Z*d:d+d,Z+d:d-d.Z,d/d0d;d3d4Z-dS )<    )annotationsN)AnyFinal)cli_utilconfigenv_util	file_utilnet_utilsecrets)CONFIG_FILENAMES)MIN_GIT_VERSIONGitRepo)
get_logger)report_watchdog_availability
watch_file)Serverserver_address_is_unix_socketserver_utilr   _LOGGERi   @serverr   returnNonec                   s`   t d  fdd}ttj| ttj| tjdkr'ttj| d S ttj| d S )NzSetting up signal handlerc                   s       d S N)stop)signal_numberstack_framer    K/var/www/vscode/kcb/lib/python3.10/site-packages/streamlit/web/bootstrap.pysignal_handler*   s   z._set_up_signal_handler.<locals>.signal_handlerwin32)	r   debugsignalSIGTERMSIGINTsysplatformSIGBREAKSIGQUIT)r   r   r   r   r   _set_up_signal_handler'   s   

r)   main_script_pathstrc                 C  s   t jdtj|  dS )zAdd the script's folder to the sys path.

    Python normally does this automatically, but since we exec the script
    ourselves we need to do it instead.
    r   N)r%   pathinsertosdirname)r*   r   r   r   _fix_sys_path6   s   r0   c                  C  sX   t jr(z
ddlm} m} W n
 ty   Y dS w tt | u r*t|  dS dS dS )a/  Set default asyncio policy to be compatible with Tornado 6.

    Tornado 6 (at least) is not compatible with the default
    asyncio implementation on Windows. So here we
    pick the older SelectorEventLoopPolicy when the OS is Windows
    if the known-incompatible default policy is in use.

    This has to happen as early as possible to make it a low priority and
    overridable

    See: https://github.com/tornadoweb/tornado/issues/2608

    FIXME: if/when tornado supports the defaults in asyncio,
    remove and bump tornado requirement for py38
    r   WindowsProactorEventLoopPolicyWindowsSelectorEventLoopPolicyN)	r   
IS_WINDOWSasyncior2   r3   ImportErrortypeget_event_loop_policyset_event_loop_policyr1   r   r   r   _fix_tornado_crash?   s   
r:   args	list[str]c                 C  s   ddl }| gt| |_dS )ztsys.argv needs to exclude streamlit arguments and parameters
    and be set to what a user's script may expect.
    r   N)r%   listargv)r*   r;   r%   r   r   r   _fix_sys_argv_   s   r?   c              
   C  s~   t | j t| j t| j t  zt  W n ty1 } zt	j
d|d W Y d }~nd }~ww dd }t | d S )Nz Failed to load secrets.toml file)exc_infoc                  S  s\   t drd S t drt d} nt dr"t rd S t d} nd} tt|  d S )Nserver.headlessbrowser.serverAddressserver.address	localhost)r   
get_optionis_manually_setr   r   open_browserr   get_url)addrr   r   r   maybe_open_browserv   s   


z,_on_server_start.<locals>.maybe_open_browser)_maybe_print_old_git_warningr*   "_maybe_print_static_folder_warning
_print_urlis_running_hellor   r
   load_if_toml_exists	Exceptionr   errorr5   get_running_loop	call_soon)r   exrJ   r   r   r   _on_server_starth   s   


rU   c                   C  s   t dtjd< dS )ziSets MAPBOX_API_KEY environment variable needed for PyDeck otherwise it
    will throw an exception.
    zmapbox.tokenMAPBOX_API_KEYN)r   rE   r.   environr   r   r   r   _fix_pydeck_mapbox_api_warning   s   rX   c                 C  sr   t dr5t| }tj|stjd| ddd dS t	|}|t
kr7t dd tjddd dS dS dS )	z7Prints a warning if the static folder is misconfigured.zserver.enableStaticServingzGWARNING: Static file serving is enabled, but no static folder found at zJ. To disable static file serving, set server.enableStaticServing to false.yellowfgFzVWARNING: Static folder size is larger than 1GB. Static file serving has been disabled.N)r   rE   r   get_app_static_dirr.   r,   isdirr   print_to_cliget_directory_sizeMAX_APP_STATIC_FOLDER_SIZE
set_option)r*   static_folder_pathstatic_folder_sizer   r   r   rL      s$   




rL   rN   boolc                 C  s  | rd}nd}g }t drdtt dfg}nMt dr.t s.dtt dfg}n9t r:dt dfg}n-dtdfg}t }|rR|d	t|f t d
rgt	 }|rg|dt|f t
d t
jd| ddd t
d |D ]\}}t
jd| dddd t
j|dd q}t
d | rt
d t
jddd t
jddd t
d t
d t
d t
d d S d S )Nz9Welcome to Streamlit. Check out our demo in your browser.z4You can now view your Streamlit app in your browser.rB   URLrC   zUnix Socketz	Local URLrD   zNetwork URLrA   zExternal URL z  %sblueTr[   boldz  z: F)nlr[   )ri   z5  Ready to create your own Python apps super quickly?z  Head over to )rj   zhttps://docs.streamlit.ioz  May you create awesome apps!)r   rF   r   rH   rE   r   r	   get_internal_ipappendget_external_ipr   r^   )rN   title_message
named_urlsinternal_ipexternal_ipurl_nameurlr   r   r   rM      sR   








rM   c                 C  s   t | }| sW|jdurY|jtk r[ddd |jD }ddd tD }td tjddd	d
 td tjd| d| ddd tjddd tjddd dS dS dS dS )zIf our script is running in a Git repo, and we're running a very old
    Git version, print a warning that Git integration will be unavailable.
    N.c                 s      | ]}t |V  qd S r   r+   .0valr   r   r   	<genexpr>       z/_maybe_print_old_git_warning.<locals>.<genexpr>c                 s  ru   r   rv   rw   r   r   r   rz      r{   rf   z  Git integration is disabled.rY   Trh   z  Streamlit requires Git z or later, but you have rZ   z>  Git is used by Streamlit Cloud (https://streamlit.io/cloud).z,  To enable this feature, please update Git.)r   is_validgit_versionr   joinr   r^   )r*   repogit_version_stringmin_version_stringr   r   r   rK      s4   




rK   flag_optionsdict[str, Any]c                 C  s$   dd |   D }tjd|d dS )a;  Load config options from config.toml files, then overlay the ones set by
    flag_options.

    The "streamlit run" command supports passing Streamlit's config options
    as flags. This function reads through the config options set via flag,
    massages them, and passes them to get_config_options() so that they
    overwrite config option defaults and those loaded from config.toml files.

    Parameters
    ----------
    flag_options : dict[str, Any]
        A dict of config options where the keys are the CLI flag version of the
        config option names.
    c                 S  s.   i | ]\}}|d ur|dkr| dd|qS )Nr   _rt   )replace)rx   namery   r   r   r   
<dictcomp>  s
    z'load_config_options.<locals>.<dictcomp>T)force_reparseoptions_from_flagsN)itemsr   get_config_options)r   r   r   r   r   load_config_options  s   r   c                   s0    fdd}t D ]}tj|rt|| qd S )Nc                   s   t   d S r   )r   )_pathr   r   r   on_config_changed"  s   z3_install_config_watchers.<locals>.on_config_changed)r   r.   r,   existsr   )r   r   filenamer   r   r   _install_config_watchers!  s   
r   F)stop_immediately_for_testingis_hellor   c                  s   t |  t  t| | t  t| t| |dfdd  fdd}zt  r6t	|  W dS t
|  W dS  tyN   t
|  Y dS w )	zuRun a script in a separate thread and start a server for the app.

    This starts a blocking asyncio eventloop.
    r   r   c                     sF      I d H  t  t  rtd     jI d H  d S )Nz'Stopping server immediately for testing)startrU   r)   r   r!   r   stoppedr   )r   r   r   r   
run_server?  s   
zrun.<locals>.run_serverc                     s     I d H  d S r   r   r   )r   r   r   mainV  s   zrun.<locals>.mainNr   r   )r0   r:   r?   rX   r   r   r5   rR   
is_runningcreate_taskrunRuntimeError)r*   r   r;   r   r   r   r   )r   r   r   r   r   *  s   

r   )r   r   r   r   )r*   r+   r   r   r   )r*   r+   r;   r<   r   r   )rN   rd   r   r   )r   r   r   r   )r*   r+   r   rd   r;   r<   r   r   r   rd   r   r   ).
__future__r   r5   r.   r"   r%   typingr   r   	streamlitr   r   r   r   r	   r
   streamlit.configr   streamlit.git_utilr   r   streamlit.loggerr   streamlit.watcherr   r   streamlit.web.serverr   r   r   __name__r   __annotations__r`   r)   r0   r:   r?   rU   rX   rL   rM   rK   r   r   r   r   r   r   r   <module>   s6    


	
 
	
#


;

