o
    Zh?4                     @  s4  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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d4ddZ d5ddZ!d6ddZ"d7ddZ#d4ddZ$d6ddZ%d5d d!Z&d8d$d%Z'd5d&d'Z(d9d*d+Z)d9d,d-Z*d.d/d:d2d3Z+dS );    )annotationsN)AnyFinal)cli_utilconfigenv_util	file_utilnet_utilsecrets)MIN_GIT_VERSIONGitRepo)
get_logger)report_watchdog_availability
watch_file)Serverserver_address_is_unix_socketserver_utilr   _LOGGERi   @serverr   returnNonec                   sb   t d 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 handlersignal_numberintstack_framer   r   r   c                   s       d S N)stop)r   r   r    X/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/streamlit/web/bootstrap.pysignal_handler)   s   z._set_up_signal_handler.<locals>.signal_handlerwin32)r   r   r   r   r   r   )	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_path5   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  sj   t | j t| j t| j t  zt  W n ty&   t	
d Y nw ddd}t | d S )Nz Failed to load secrets.toml filer   r   c                  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_browseru   s   


z,_on_server_start.<locals>.maybe_open_browserr   r   )_maybe_print_old_git_warningr*   "_maybe_print_static_folder_warning
_print_urlis_running_hellor   r
   load_if_toml_exists	Exceptionr   	exceptionr5   get_running_loop	call_soon)r   rI   r   r   r   _on_server_startg   s   



rT   c                   C  s"   dt jvrtdt jd< dS dS )ziSets MAPBOX_API_KEY environment variable needed for PyDeck otherwise it
    will throw an exception.
    MAPBOX_API_KEYzmapbox.tokenN)r.   environr   rD   r   r   r   r   _fix_pydeck_mapbox_api_warning   s   
rW   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   rD   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.rA   URLrB   zUnix Socketz	Local URLrC   zNetwork URLr@   zExternal URL z  blueTrZ   boldz: F)nlrZ   )rh   z5  Ready to create your own Python apps super quickly?z  Head over to )ri   zhttps://docs.streamlit.ioz  May you create awesome apps!)r   rE   r   rG   rD   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  rt   r   ru   rv   r   r   r   ry      rz   re   z  Git integration is disabled.rX   Trg   z  Streamlit requires Git z or later, but you have rY   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   _rs   )replace)rw   namerx   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                   s8   d fdd}t dD ]}tj|rt|| qd S )	N_pathr+   r   r   c                   s   t   d S r   )r   )r   r   r   r   on_config_changed"  s   z3_install_config_watchers.<locals>.on_config_changedzconfig.toml)r   r+   r   r   )r   get_config_filesr.   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 d fdd}d}zt  d}W n	 ty:   Y nw |rOt	
d	 tj| d
d}|_dS t	
d t|  dS )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)startrT   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   mainS  s   zrun.<locals>.mainFTz&Running server in existing event loop.zbootstrap.run_server)r   z"Starting new event loop for serverNrJ   )r0   r:   r?   rW   r   r   r5   rR   RuntimeErrorr   r!   create_task_bootstrap_taskrun)r*   r   r;   r   r   r   running_in_event_looptaskr   )r   r   r   r   r   *  s*   




r   )r   r   r   r   )r*   r+   r   r   rJ   )r*   r+   r;   r<   r   r   )rN   rc   r   r   )r   r   r   r   )r*   r+   r   rc   r;   r<   r   r   r   rc   r   r   ),
__future__r   r5   r.   r"   r%   typingr   r   	streamlitr   r   r   r   r	   r
   streamlit.git_utilr   r   streamlit.loggerr   streamlit.watcherr   r   streamlit.web.serverr   r   r   __name__r   __annotations__r_   r)   r0   r:   r?   rT   rW   rL   rM   rK   r   r   r   r   r   r   r   <module>   s4    


	
 
	
#
	

;

