
    oi<2                        d dl Z d dlZd dlZd dl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mZmZmZ d dl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 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)  G d de)      Z* G d de*      Z.d Z/de-defdZ0d:dZ1de-dee-ef   d ed!e%dee-ef   f
d"Zd#ee   d$ee-   fd%Z2g g g g fd#ee   d&ee-   d'ee-   d(ee-   d)ee-   dee   fd*Z3d:d+e-de-fd,Z4d:d+e-de-fd-Z5d.e-de-d/e-de-fd0Z6d.e-de-d1e-de-fd2Z7	 d;d.e-de-d1e-d3e8de-f
d4Z9d.e-de-d1e-de-fd5Z:de-d1e-de-fd6Z;d.e-de-defd7Z<d8 Z=d9 Z>y# e+$ r d dl(m,Z,  G d de-e,      Z*Y w xY w)<    N)deepcopy)partial)Path)	AwaitableDictListAny)Logger)Version)jupyter_path)recursive_update)url_path_join)get_page_config)get_federated_extensions)Markup   )__version__)VoilaConfiguration)TemplateStaticFileHandler)StrEnumc                       e Zd Zy
StringEnumN__name__
__module____qualname__     S/home/ubuntu/docker-apps/notebooks/venv/lib/python3.12/site-packages/voila/utils.pyr   r   '       r   r   )Enumc                       e Zd Zyr   r   r   r   r    r   r   -   r!   r   c                   L    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZy)ENV_VARIABLEVOILA_PREHEATVOILA_KERNEL_IDVOILA_BASE_URLVOILA_SERVER_URLVOILA_REQUEST_URLVOILA_APP_IPVOILA_APP_PORTVOILA_WS_PROTOCOLVOILA_WS_BASE_URLSERVER_NAMESERVER_PORTSCRIPT_NAME	PATH_INFOQUERY_STRINGSERVER_SOFTWARESERVER_PROTOCOLN)r   r   r   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r   r   r    r%   r%   1   sV    #M'O%N)+!L%N++KKKI!L'O'Or   r%   c                     d| v r| d   S | d   }|j                   }t        j                  j                  d      }|j	                  |t        j                  j
                  z         rd|t        |      d  z   }|S )Nserver_root_dircontents_manager~)root_dirospath
expanduser
startswithseplen)settingsr8   r:   homes       r    get_server_root_dirrC   D   sx    H$)**   23((H77c"D4"''++-.#d)+..Or   ws_urlreturnc                 2  K   	 t        j                  | d      4 d {   }|j                          d {   }d d d       d {    |S 7 .7 7 
# 1 d {  7  sw Y   S xY w# t        t        f$ r t        j                  d|         Y y w xY ww)N   )open_timeoutzFailed to connect to )
websocketsconnectrecvTimeoutErrorConnectionRefusedErrorwarningswarn)rD   	websocketris      r    _get_request_inforR   T   s     %%f1= 	( 	( ~~''B	( 	( 		('	( 	( 	( 	( 		 01 -fX67s   BA* AA* AAAA* AA* BA* AA* A'AA'"A* %B'A* *'BBBBc                     t        d      }t        d      D cg c]  }t        t        |      dz         }}||z   }| r|| z   }|S c c}w )Nlabextensionsvoila)r   strr   )extra_pathslabextensions_pathr<   voila_labextensionss       r    get_voila_labextensions_pathrZ   _   sg    %o6 7C76K.2DJ()  ,.AA /+=s   Abase_urlrA   logvoila_configurationc           
      2   t         dd| dt        | d      t        | d      |j                  |j                  d	}|j	                  dd      }|j	                  d	d
      }|j                  d|       |j                  d|       t        |j                        }t        |t        ||             ddg}|j                  |j	                  dg              g }	t        |d         }
t        |
||	|j                  |j                        }t        ||      }||d<   |S )a=  Get the page configuration for Voila.

    Args:
        base_url (str): The base URL of the Voila application.
        settings (Dict[str, Any]): The settings of the Voila application.
        log (Logger): The logger instance.
        voila_configuration (VoilaConfiguration): The Voila configuration instance.
    zvoila/z/voila/api/themesFzvoila/staticzvoila/labextensions)	
appVersionappUrl	themesUrlbaseUrlterminalsAvailablefullStaticUrlfullLabextensionsUrlextensionConfigprogressiveRenderingmathjax_configzTeX-AMS_CHTML-full,Safemathjax_urlzFhttps://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/latest.min.jsmathjaxConfigfullMathjaxUrl)loggerz$@voila-dashboards/jupyterlab-previewz @jupyter/collaboration-extensiondisabledExtensionsfederated_extensions)rn   disabled_extensionsrequired_extensionsextension_allowlistextension_denylist)r   r   extension_configprogressive_renderingget
setdefaultrZ   extra_labextensions_pathr   gpcextendr   filter_extensionrq   rr   &maybe_inject_widgets_manager_extension)r[   rA   r\   r]   page_configrh   ri   rX   ro   rp   rn   filtered_extensions
extensionss                r    r   r   o   sI    "(#&x@ -h8M N.?? 3 I I
K \\"24MNN,,PK ?N;+[9544 	
 	/* {/CRHI#K0F$GH*1///CC.AA 8/J +5K&'r   rn   rX   c                     t        |      }d|vr| S |d   d   }t        |      t        d      k\  r| D cg c]  }|d   dk7  r| c}S | D cg c]  }|d   dk7  r| c}S c c}w c c}w )z^If the @jupyter-widgets/jupyterlab-manager is installed on the server. Inject our own manager.z#@jupyter-widgets/jupyterlab-managerversionz5.0.0namez"@voila-dashboards/widgets-manager7z"@voila-dashboards/widgets-manager8)r   r   )rn   rX   rT   widgets_versionxs        r    r{   r{      s     --?@M,MA###$IJ9UO77#33 *
y@@ 
 	
 *
y@@ 
 	


s   A!A&ro   rp   rq   rr   c                 d   | D cg c]  }|d   |vs| }}t        |      dk(  r.t        |      dk(  r|S |D cg c]  }|d   |v s|d   |v r| c}S t        |      dk(  r|D cg c]  }|d   |v s|d   |vr| c}S |D cg c]  }|d   |v s|d   |v r| c}S c c}w c c}w c c}w c c}w )a  Create a list of extension to be loaded from available extensions and the
    allow/deny list configuration.

    Args:
        - federated_extensions (List[Dict]): List of available extension
        - disabled_extensions (List[str], optional): List of extension disabled by default.
        Defaults to [].
        - required_extensions (List[str], optional): List of required extensions.
        Defaults to [].
        - extension_allowlist (List[str], optional): The allowlisted extensions.
        Defaults to [].
        - extension_denylist (List[str], optional): The denylisted extensions.
        Defaults to [].

    Returns:
        List[Dict]: The filtered extensions
    r   r   )r@   )rn   ro   rp   rq   rr   r   r}   s          r    rz   rz      s   2 (1V9<O+O  !#"#q(&&
 )
y//1V9@S3S 
 	
 1$ )
y//1V9DV3V 
 	
 %V9++qy<O/O 	
 1

s   BBB#&B(B-urlc                    t        j                  t        j                  d      }|dk(  ryd| t        j                  t        j                  d      }t        j                  t        j
                  d      }t        j                  t        j                  d      }t        j                  t        j                  d      }t        j                  t        j                  |      }| d| d| | d	} t        j                  t        j                        }|  d| fd
}t        j                  |      }		 |	j                          |	j                          ?t'        j(                        j+                         D ]  \  }
}|t         j,                  |
<    yy# t        t        f$ r% t!        j"                         j%                          Y uw xY w)aV  Helper function to pause the execution of notebook and wait for
    the pre-heated kernel to be used and all request info is added to
    the environment.

    Args:
        url (str, optional): Address to get request info, if it is not
        provided, `voila` will figure out from the environment variables.
        Defaults to None.

    FalseNwsz	127.0.0.18866/z://:zvoila/queryc                  b    t        j                         } | j                  t                    y N)asyncionew_event_looprun_until_completerR   )looprequest_inforD   s    r    innerzwait_for_request.<locals>.inner   s'    %%'../@/HIr   )target)r;   getenvr%   r&   r-   r+   r,   r)   r.   r'   	threadingThreadstartjoinKeyboardInterrupt
SystemExitr   get_event_loopstopjsonloadsitemsenviron)r   preheat_modeprotocol	server_ipserver_port
server_urlws_base_url	kernel_idr   threadkvr   rD   s               @@r    wait_for_requestr     sw    99\77ALwL
{99\;;TBIIl77E	ii ; ;VDYY|<<cB
ii > >
K
#i[+{m;O		,667IuAi[!FJ
 U+F( JJ|,224 	DAqBJJqM	   z* ( %%'(s   9 F 1GGc                 ^    t        |        t        j                  t        j                        S )aZ  Helper function to pause the execution of notebook and wait for
    the query string.
    Args:
        url (str, optional): Address to get user query string, if it is not
        provided, `voila` will figure out from the environment variables.
        Defaults to None.
    Returns: The query string provided by `QueryStringSocketHandler`.
    )r   r;   r   r%   r3   )r   s    r    get_query_stringr   1  s!     S99\..//r   template_namer<   c                 H    | dd d}t        j                  ||  d|       S )Nzvoila/templates/)static_url_prefixstatic_pathr   )r   make_static_url)r   r[   r<   rA   s       r    make_urlr   ?  s>     !)z)9:H %44]O1TF+ r   r   c                 :    dt        | ||       d}t        |      S )Nz-<link rel="stylesheet" type="text/css" href="z">r   r   )r   r[   r   codes       r    include_cssr   J  s'    :8MS[]a;b:ccefD$<r   modulec                 L    |rdnd}dt        | ||       d| d}t        |      S )Nztype="module" z<script src="z" z
></script>r   )r   r[   r   r   typer   s         r    
include_jsr   O  s5     %?"D8M8TBC2dV:VD$<r   c                 .    t        t        | ||            S r   )r   r   )r   r[   r   s      r    include_urlr   W  s    (=(D9::r   c                      y)z&Override the function from `nbconvert`r   r   )r[   r   s     r    include_lab_themer   [  s    r   c                     t        t        | |      t        t        | |      t        t        | |      t        t        |      dS )N)r   r   r   r   )r   r   r   r   r   )r   r[   s     r    create_include_assets_functionsr   `  s;    {M8Dj-B{M8D$%6A	 r   c                  t    t         j                  j                  t        j                  j                  |        S )z!Join paths to create a real path.)r;   r<   abspathr   )argss    r    pjoinr   i  s"    77??277<<.//r   c                  (   t        d      } | D ]E  }t        j                  j                  |      s#t	        t        |      j                               c S  t        t        j                  ddd      }t	        t        |      j                               S )zGet the Voila data directory.rU   sharejupyter)
r   r;   r<   existsrV   r   resolver   sysprefix)app_dirsr<   app_dirs      r    get_data_dirr   n  ss     G$H -77>>$tDz))+,,-
 CJJG<GtG}$$&''r   r   )F)?r   r   r;   r   r   rN   copyr   	functoolsr   pathlibr   typingr   r   r   r	   loggingr
   packaging.versionr   rI   jupyter_core.pathsr   jupyter_server.config_managerr   jupyter_server.utilsr   jupyterlab_server.configr   rx   r   
markupsafer   _versionr   configurationr   static_file_handlerr   enumr   r   ImportErrorr"   rV   r%   rC   rR   rZ   r{   rz   r   r   r   r   boolr   r   r   r   r   r   r   r   r    <module>r      ss     	 
      - -  %  + : . ; =  ! - :W (: (& C I  @@38n@ 
@ ,	@
 
#s(^@F
t*
:>s)
: &(%'%'$&4t*4c4 c4 c	4
 S	4 
$Z4n*# * *Z0# 0 0C 3 c c s c    BG"%-0:>;s ;c ; ; ; 3 3 
3 # $ 0

(I
  S$ s   >E E10E1