
    oiJ                        d dl Z d dlZd dl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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mZmZ ddlmZ ddlmZmZ  ed      Zde dedefdZ!	 ddee   de"de#dee   def
dZ$y)    N)Path)	AwaitableCallableOptional)Dict)List)TupleTypeTypeVarUnion)warn)ensure_async)validate)r   Floatr   default   )NotebookRenderer)ENV_VARIABLEget_page_configTdelayawreturnc                 `   K   t        j                  |        d {    | d {   S 7 7 wN)asynciosleep)r   r   s     b/home/ubuntu/docker-apps/notebooks/venv/lib/python3.12/site-packages/voila/voila_kernel_manager.pywait_beforer      s(     
--
8O s   .*	.,..
base_classpreheat_kerneldefault_pool_sizepage_config_hookc                 D    |s G d d|       }|S  G fdd|       }|S )a5  
    Decorator used to make a normal kernel manager compatible with pre-heated
    kernel system.
    - If `preheat_kernel` is `False`, only the property
    `notebook_data` and the method `get_pool_size` are added to keep `VoilaHandler`
    working, the kernel manager will work as it is.
    - If `preheat_kernel` is `True`, the input class is transformed to
     `VoilaKernelManager` with all the functionalities.

    Args:
        - base_class (Type[T]): The kernel manager class
        - preheat_kernel (Bool): Flag to decorate the input class
        - default_pool_size (int): Size of pre-heated kernel pool for each notebook.
            Zero or negative number means disabled
        - page_config_hook (Callable, optional): Hook to modify the default page config.

    Returns:
        T: Decorated class
    c                   2    e Zd Zedefd       ZdedefdZy)9voila_kernel_manager_factory.<locals>.NormalKernelManagerr   c                     i S r    )selfs    r   notebook_datazGvoila_kernel_manager_factory.<locals>.NormalKernelManager.notebook_dataA   s    	    nbc                      y)Nr   r(   )r)   r,   s     r   get_pool_sizezGvoila_kernel_manager_factory.<locals>.NormalKernelManager.get_pool_sizeE   s    r+   N)	__name__
__module____qualname__propertyTypeDictr*   strintr.   r(   r+   r   NormalKernelManagerr&   @   s.    x    r+   r6   c            
           e Zd ZdZ edd      Z ei dd      Z eg dd      Z eg dd      Z	 e
d      d	        Z ed
dd      Z ed      fd       Z fdZi fdededeej*                  ee   f   fdZdedefdZddi fdeedf   deedf   deddfdZdeddf fdZdef fdZ fdZ	 d"dededef fdZ def fdZ!	 d"deedf   de"ffdZ#de$de%fd Z&dededef   fd!Z' xZ(S )#8voila_kernel_manager_factory.<locals>.VoilaKernelManagera  This class adds pooling heated kernels and pre-rendered notebook
            feature to a normal kernel manager. The 'pooling heated kernels'
            part is heavily inspired from `hotpot_km`(https://github.com/voila-dashboards/hotpot_km) library.
            TzMapping from notebook name to the kernel configuration
                like: number of started kernels to keep on standby, environment
                variables used to start kernel)confighelpz<Default environmental variables for kernels
                z5List of notebooks which do not use pre-heated kernel.z#Deprecated, use `preheat_denylist`.preheat_blacklistc                 0    t        dt        d       |d   S )Nz)Deprecated, use preheat_denylist instead.   )
stacklevelvalue)r   DeprecationWarning)r)   proposals     r   _valid_preheat_blacklistzQvoila_kernel_manager_factory.<locals>.VoilaKernelManager._valid_preheat_blacklistl   s     ?& 
  ((r+   r   z;Wait time before re-filling the pool after a kernel is usedkernel_pools_configc                 :    dt        d      | j                  diS )Nr   r   )	pool_sizekernel_env_variables)maxdefault_env_variables)r)   r"   s    r   _kernel_pools_configzMvoila_kernel_manager_factory.<locals>.VoilaKernelManager._kernel_pools_config{   s+     %():A%>040J0J  r+   c                    t        |   di | d| _        i | _        i | _        | j
                  j                  | _        | j
                  j                  at        j                  j                  | j
                  j                  | j                        | _        | j                  d| j                         y d | _        t        t        | j                        j                  d            D cg c].  }| j                  |      r|j!                  | j                        0 }}|D ]  }| j                  dt#        |               y c c}w )NTr   )r   notebook_namez*.ipynbr(   )super__init___wait_at_startupr*   _poolsparentroot_dirnotebook_pathospathrelpathfill_if_neededlistr   rglob_notebook_filterrelative_tor4   )r)   kwargsxall_notebooksr,   	__class__s        r   rM   zAvoila_kernel_manager_factory.<locals>.VoilaKernelManager.__init__   s    *6*(,%/1"=? $ 4 4;;,,8)+114==*D& ''at?Q?Q'R)-D& "&d4==&9&?&?	&J!K%003 dmm4%M %
 , L++!3r7+KL%s   .3ErK   extra_kernel_env_variablesr   c                   K   |t        d      t        | j                  j                  |d            dk(  rt	        d| d      | j                  |   j                  d      }| d{   }|d   }|d   }|d	   }d
|_        | j                  j                  d||        | j                  dd||d| ||j                  |fS 7 \w)a  Get the notebook rendering task and the rendered cell.
                By setting the `stop_generator` to True, the running task
                `render_task` used for rendering notebook will be stopped
                after finishing the running cell. The results of this task
                will contain the rendered cells and a generator for continuing
                render the remaining cells. We need to return also
                `renderer.rendered_cache` since it contains the rendered cells
                before the moment we set `stop_generator` to `True`, so that
                we can flush data immediately without waiting for running cell
                to be finished.

                Args:
                    notebook_name (str): Path to notebook

                Raises:
                    NameError: Raised if no notebook is provided.
                    Exception: Raised if the kernel pool is empty.

                Returns:
                    Tuple[asyncio.Task, List[str]]:

                NzNotebook name must be provided!r(   r   zKernel pool for z
 is empty!renderertask	kernel_idTz"Using pre-heated kernel: %s for %s)r   rK   r_   )	NameErrorlenrO   get	Exceptionpopstop_generatorloginforV   rendered_cache)	r)   rK   r_   r[   	pool_itemcontentra   render_taskrc   s	            r   get_rendered_notebookzNvoila_kernel_manager_factory.<locals>.VoilaKernelManager.get_rendered_notebook   s     8 !(#$EFFt{{}b9:a?#&6}oZ$PQQ KK6::1=	 )/-4Z-@,3FO!(!5	*.'8)] $## "//I 	 #H$;$;YFF *s   A(C	*C+AC	c                 L    t        | j                  j                  |g             S r   )re   rO   rf   )r)   rK   s     r   r.   zFvoila_kernel_manager_factory.<locals>.VoilaKernelManager.get_pool_size   s    4;;??="=>>r+   Nr   c                 r    ||n j                   }	 t        j                         } j                  j                  di       } j                  j                  |      }|j                  d|j                  di             }|j                  d|j                  dd             j                  j                  g       }	|	 j                  <   d|vr0t        j                  j                        n j                  |d<   t        j                  j                         }
|j                  di       }|
j                  |       |D ]  }||
vs||   |
|<    |
j                  |        j                   j"                  |
t$        j&                  <    j                   j(                  |
t$        j*                  <   t-         j                   j.                        |
t$        j0                  <   d|
t$        j2                  <   |
|d<   t5        |	       fd	}t7        t5        |	      z
        D ]Q  }|j9                  t;        |  j<                  dfi |            }|	j?                  |       |jA                  |       S y# t        $ r- t        j                         }t        j
                  |       Y w xY w)
a|  Start kernels until the pool is full

                Args:
                    - delay (Union[float, None], optional): Delay time before
                    starting refill kernel. Defaults to None.
                    - notebook_name (Union[str, None], optional): Name of notebook to
                    create kernel pool.
                    Defaults to None.
                Nr   rF   rE   r   rT   envTruec                 V    dz  k(  rj                   j                  d       y y )Nr   z-Kernel pool of %s is filled with %s kernel(s))rj   rk   )tkheatedkernel_sizerK   r)   s    r   task_counterz]voila_kernel_manager_factory.<locals>.VoilaKernelManager.fill_if_needed.<locals>.task_counter
  s2    aKF,K)' -r+   )!
fill_delayr   get_event_loopRuntimeErrornew_event_loopset_event_looprC   rf   rO   rS   rT   dirnamerQ   environcopyupdaterP   base_urlr   VOILA_BASE_URL
server_urlVOILA_SERVER_URLr4   portVOILA_APP_PORTVOILA_PREHEATre   rangecreate_taskr   _initializeappendadd_done_callback)r)   r   rK   r_   r[   loopdefault_confignotebook_configrF   pool
kernel_envkernel_env_argkeyry   _rb   rw   rx   s   ` `             @@r   rV   zGvoila_kernel_manager_factory.<locals>.VoilaKernelManager.fill_if_needed   s{     "'!21"113D (,'?'?'C'CIr'R(,(@(@(D(D!>) .=-@-@*"&&'=rB.$ $3#6#6!3!3K!C$ {{}b9-1M*' )4 6!]] 6N
  ZZ__.
!'E2!6!!.1/ DC*,*>s*C
3D !!"<=:>++:N:N
<667<@KK<R<R
<889:=dkk>N>N:O
<6679?
<556 *uT {SY67 	9A++#!,D,,]DKFKD KK%**<8	9c $ 1"113D**401s   J   2J65J6rc   c                    K   t        t        |   |fi |       d {    | j                  |      }| | j                  ||fi | d {    y y 7 57 wr   )r   rL   restart_kernel_get_notebook_from_kernelr   )r)   rc   r[   rK   r^   s       r   r   zGvoila_kernel_manager_factory.<locals>.VoilaKernelManager.restart_kernel  si     "57#9)#Nv#NOOO $ > >y I ,*$**=)NvNNN - P Os!   AA.AAAAc                   K   | j                   j                         D ]]  }t        |      D ]K  \  }}|j                         s|j	                         j                  d      |k(  s:|j                  |        n ] n | j                  j                         D ]  }||d   v s|d   j                  |         t        t        | ,  |g|i |       d {   S 7 w)Nrc   
kernel_ids)rO   values	enumeratedoneresultrf   rh   r*   remover   rL   shutdown_kernel)	r)   rc   argsr[   r   ifr?   r^   s	           r   r   zHvoila_kernel_manager_factory.<locals>.VoilaKernelManager.shutdown_kernel%  s      KK..0 D )$ !1668
{(Cy(P HHQK!!
 ! "//668 >E E,$77l+229=> *G+IGGG   s#   ?C"C&<C#5CCCc           	        K   t        t        	|   |i |       d {    | j                  }i | _        | j                  j                         D ]  }t               |d<    |j                         D ]O  }t        |      D ]?  }	 | d {   }|d   }|| v s	 t         | j                  |g|i |       d {    A Q y 7 7 =7 # t        $ r Y Vw xY w# t        $ r Y ew xY ww)Nr   rc   )r   rL   shutdown_allrO   r*   r   settupler   r|   rg   )
r)   r   r[   poolsr?   r   rb   r   kidr^   s
            r   r   zEvoila_kernel_manager_factory.<locals>.VoilaKernelManager.shutdown_all6  s    "57#7#H#HIII !//668 0E*-%E,'0 "LLN )D %d ))+/ZF #)"5C"d{!)*6(<(<(<S(R4(R6(R+& %& %&)) J &0%& (4 !)$(!)  ) ! !s|   C*CA$C*C
CC	C*"C<C
=CC*C
C	CC*CC*	C'$C*&C''C*rR   c                   K   | j                  |      }|j                          d{    |j                  j                  j                  j
                  }|t        |   dd|i| d{   }|j                  | j                  vr?|j                  |j                  |j                  ||hd| j                  |j                  <   n+| j                  |j                     d   j                  |       | j                  |      }t        j                         j!                  |j#                  ||            }|||dS 7 7 ӭw)z4Run any configured initialization code in the kernelNkernel_name)notebooktemplatethemer   r   r   )rb   ra   rc   r(   )_notebook_renderer_factory
initializer   metadata
kernelspecnamerL   start_kernelrR   r*   template_namer   add
get_kernelr   r{   r   generate_content_hybrid)	r)   rR   rc   r[   ra   r   kernel_futurerb   r^   s	           r   r   zDvoila_kernel_manager_factory.<locals>.VoilaKernelManager._initializeP  s>    
  ::=I))+++&//88CCHH$&+g&: '$/'39' !I ))1C1CC$,$5$5$,$:$:!)'2'0kBD&&x'='=> &&x'='=>|LPP! !%	 :--/;;44YN !%(SS3 ,!s#   %ED>AE-E.CEEc                 `  K   | j                   j                         D ]K  }t        |      D ];  \  }}	 |j                         r%|j	                         j                  d      |k(  r  y= M t        t        | )  |             d{   S # t        $ r |j                  |       Y |w xY w7 $w)zEnsure we don't cull pooled kernels:
                (this logic assumes the init time is shorter than the cull time)
                rc   N)rO   r   r   r   r   rf   rg   rh   r   rL   cull_kernel_if_idle)r)   rc   r   r   r   r^   s        r   r   zLvoila_kernel_manager_factory.<locals>.VoilaKernelManager.cull_kernel_if_idleq  s     
 !KK..0 (D )$ (1( vvxAHHJNN;,G9,T &(( *%'*Ei*PQQQ  ) ( HHQK(Qs4   /B.2B%"B.B,B.B)&B.(B))B.c                    | j                   j                  }| j                   j                  j                  }|j	                  d      }|j	                  d      }| j                   j
                  | j                   j                  j                  | j                   j                  |d}t        di |}r |fi |d|i}t        || j                   j                  || j                   j                  | j                   j                  | j                   j                  | j                   j
                  | j                   j                  |||      S )zHelper function to create `NotebookRenderer` instance.

                Args:
                    - notebook_path (Union[str, None], optional): Path to the
                    notebook. Defaults to None.
                mathjax_configmathjax_url)r   settingsrj   voila_configurationrR   )r   traitlet_configrR   template_pathsconfig_managercontents_managerr   kernel_spec_managerpage_configr   r   r(   )rP   r   appr   rf   r   rj   r   r   r9   r   r   r   r   )	r)   rR   r   r   r   r   page_config_kwargsr   r#   s	           r   r   zSvoila_kernel_manager_factory.<locals>.VoilaKernelManager._notebook_renderer_factory  s    '+kk&E&E#;;??33!).>!?&ll=9 !% 4 4 $ 8 8;;??+>	&" .C0BC#"2##,# '4#K ((;$(KK$6$6"/#';;#=#=#';;#=#=%)[[%A%A![[11(,(G(G +#1 + r+   nb_pathc                     t        |      }d|v ry| j                  D ]7  }t        j                  |      }||v st	        |j                  |            s7 y y)a+  Helper to filter denylisted notebooks.

                Args:
                    nb_path (Path): Path to notebook

                Returns:
                    bool: return `False` if notebook is in `ipynb_checkpoints` folder or
                    is denylisted, `True` otherwise.
                z.ipynb_checkpointsFT)r4   preheat_denylistrecompileboolmatch)r)   r   nb_name
nb_patternpatterns        r   rY   zIvoila_kernel_manager_factory.<locals>.VoilaKernelManager._notebook_filter  s[     g,'72 "&"7"7 %J jj4G"g-$w}}W7M2N$% r+   c                 ^    | j                   j                         D ]  \  }}||d   v s|c S  y)zHelper to get notebook name from heated kernel id.

                Args:
                    kernel_id (str): Kernel id

                Returns:
                    Union[None, str]: return associated notebook with kernel id.

                r   N)r*   items)r)   rc   r   datas       r   r   zRvoila_kernel_manager_factory.<locals>.VoilaKernelManager._get_notebook_from_kernel  s=     &*%7%7%=%=%? 'MGT D$66&' r+   r   ))r/   r0   r1   __doc__r   rC   rH   r   r   r;   r   rB   r   rz   r   rI   rM   r4   dictr	   r   TaskTypeListrp   r5   r.   r   floatrV   r   r   r   r   r   r   r   r   r   rY   r   __classcell__)r^   r"   r#   s   @r   VoilaKernelManagerr8   L   s   
 #'2# %)%!  $L  !%:! )*) +) RJ *+ ,L0 462G"2G -12G
 w||Xc]232Gh?3 ?3 ?
 -12635	M9UD[)M9  %S$Y/M9 -1	M9 M9^Oc O Os ")6 <@T%(T58TTBR3 R 9=*%*39%5*!*X  &3 5sCS r+   r   r(   )r    r!   r"   r#   r6   r   s     ``  r   voila_kernel_manager_factoryr   $   s3    4 	* 	 #"	 	B r+   r   )%r   rS   r   pathlibr   typingr   r   r   r   r3   r   r   r	   r
   r   r   warningsr   jupyter_core.utilsr   	traitletsr   traitlets.traitletsr   r   notebook_rendererr   utilsr   r   r   r   r   r   r5   r   r(   r+   r   <module>r      s     	 	  0 0 # # . .  +  : : / 0CLU 	 i  ,0	iQii i x(	i
 ir+   