
    Xh?                        d Z 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
mZmZmZmZ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  G d de      Z G d de      Z G d de      Z y)zThe extension manager.    )annotationsN)starmap)multi)	AnyBoolDict	HasTraitsInstanceListUnicodedefaultobservevalidate)LoggingConfigurable   )ExtensionConfigManager)ExtensionMetadataErrorExtensionModuleNotFound
get_loaderget_metadatac                  (   e Zd ZdZ ed      Z edd      Z e       Z	 e
ej                        Z ed      d        Z ed      d	        Zed
        Zed        Zed        Zed        Zed        Zed        Zd Zd Zd Zd Zd Zd Zd Zy)ExtensionPointzA simple API for connecting to a Jupyter Server extension
    point defined by metadata and importable from a Python package.
    FNT
allow_nonelogc                ,    t        j                  d      S )Nr   )logging	getLoggerselfs    T/var/www/html/myenv/lib/python3.12/site-packages/jupyter_server/extension/manager.py_default_logzExtensionPoint._default_log   s      !122    metadatac                   |d   }	 |d   | _         	 t        j                  | j                         | _        d|v r |d          | _        |S # t        $ r d}t        |      dw xY w# t        $ r d| j                    d}t        |      dw xY w)zValidate metadata.valuemodulez<There is no 'module' key in the extension's metadata packet.NzThe submodule 'z>' could not be found. Are you sure the extension is installed?app)	_module_nameKeyErrorr   	importlibimport_module_moduleImportErrorr   _app)r!   proposedr%   msgs       r"   _valid_metadatazExtensionPoint._valid_metadata"   s     G$	8 ( 2D
	9$2243D3DEDL H')DI  	8PC(-47	8  	9!$"3"3!4 53 3  *#.D8	9s   
A $A& A#&&Bc                ^    | j                   r| j                   j                  S | j                  S )zHas this extension point been linked to the server.

        Will pull from ExtensionApp's trait, if this point
        is an instance of ExtensionApp.
        )r)   _linkedr    s    r"   linkedzExtensionPoint.linked:   s%     8888###||r$   c                    | j                   S )z'If the metadata includes an `app` field)r0   r    s    r"   r)   zExtensionPoint.appE   s     yyr$   c                R    | j                   r| j                   j                         S i S )z:Return any configuration provided by this extension point.)r)   _jupyter_server_configr    s    r"   configzExtensionPoint.configJ   s%     88882244 Ir$   c                    | j                   S )zuName of the Python package module where the extension's
        _load_jupyter_server_extension can be found.
        )r*   r    s    r"   module_namezExtensionPoint.module_nameT   s    
    r$   c                    | j                   r| j                   j                  S | j                  j                  d| j                        S )zName of the extension.

        If it's not provided in the metadata, `name` is set
        to the extensions' module name.
        name)r)   r>   r%   getr<   r    s    r"   r>   zExtensionPoint.name[   s6     8888== }}  )9)9::r$   c                    | j                   S )z3The imported module (using importlib.import_module))r.   r    s    r"   r(   zExtensionPoint.modulef   s     ||r$   c                ~    | j                   r| j                   j                  }|S t        | j                  dd       }|S )zGet a linker._link_jupyter_server_extensionc                     y N 	serverapps    r"   <lambda>z,ExtensionPoint._get_linker.<locals>.<lambda>u   s    r$   )r)   rB   getattrr(   )r!   linkers     r"   _get_linkerzExtensionPoint._get_linkerk   s?    88XX<<F  0&F r$   c                P    | j                   }|s| j                  }t        |      }|S )zGet a loader.)r)   r(   r   )r!   locloaders      r"   _get_loaderzExtensionPoint._get_loadery   s%    hh++CCr$   c                    | j                   r| j                   j                  }|S d }t        | j                  d|      }|S )zGet a starter function.c                   K   y wrD   rE   rF   s    r"   _noop_startz0ExtensionPoint._get_starter.<locals>._noop_start   s	     s   _start_jupyter_server_extension)r)   rS   rI   r(   )r!   rJ   rR   s      r"   _get_starterzExtensionPoint._get_starter   sD    88XX==F  1F r$   c                d    	 | j                          | j                          y# t        $ r Y yw xY w)z+Check that both a linker and loader exists.TF)rK   rO   	Exceptionr    s    r"   r   zExtensionPoint.validate   s8    	   		s    # 	//c                \    | j                   s | j                         } ||       d| _        yy)zLink the extension to a Jupyter ServerApp object.

        This looks for a `_link_jupyter_server_extension` function
        in the extension's module or ExtensionApp class.
        TN)r6   rK   r5   )r!   rG   rJ   s      r"   linkzExtensionPoint.link   s-     {{%%'F9DL	 r$   c                2    | j                         } ||      S )zLoad the extension in a Jupyter ServerApp object.

        This looks for a `_load_jupyter_server_extension` function
        in the extension's module or ExtensionApp class.
        )rO   )r!   rG   rN   s      r"   loadzExtensionPoint.load   s     !!#i  r$   c                N   K   | j                         } ||       d{   S 7 w)zCall's the extensions 'start' hook where it can
        start (possibly async) tasks _after_ the event loop is running.
        N)rT   )r!   rG   starters      r"   startzExtensionPoint.start   s'      ##%Y''''s   %#%) __name__
__module____qualname____doc__r   r5   r   r0   r   r%   r
   r   Loggerr   r   r#   validate_traitr3   propertyr6   r)   r:   r<   r>   r(   rK   rO   rT   r   rX   rZ   r]   rE   r$   r"   r   r      s     5kGt%DvH
7>>
"CU^3 3 J  .       ! ! ; ;  $
 !(r$   r   c                       e Zd ZdZ ed      Z edd      Z e       Z	 e       Z
 edd      Z e e       d	      Z ed
      Z ed      d        Z fdZd Zd Zd Zd Zd Zd Zd Zd Z xZS )ExtensionPackagezAn API for interfacing with a Jupyter Server extension package.

    Usage:

    ext_name = "my_extensions"
    extpkg = ExtensionPackage(name=ext_name)
    z)Name of the an importable Python package.helpFz)Whether the extension package is enabled.Tz:The module for this extension package. None if not enabled)r   rh   z5Extension metadata loaded from the extension package.z|
            The version of this extension package, if it can be found.
            Otherwise, an empty string.
            versionc                J    | j                   syt        | j                  dd      S )N __version__)enabledrI   r(   r    s    r"   _load_versionzExtensionPackage._load_version   s    ||t{{M266r$   c                ^    t        |   di | | j                  r| j                          yy)z Initialize an extension package.NrE   )super__init__rm   _load_metadata)r!   kwargs	__class__s     r"   rq   zExtensionPackage.__init__   s+    "6"<<! r$   c                6   | j                   }	 t        || j                        \  | _        | _        | j                  D ]2  }t        || j                        }|| j                  |j                   <   4 |S # t
        $ r}d| d| d}t        |      dd}~ww xY w)z\Import package and load metadata

        Only used if extension package is enabled
        )loggerzThe module 'z' could not be found (z+). Are you sure the extension is installed?N)r%   r   )	r>   r   r   r(   r%   r/   r   r   extension_points)r!   r>   er2   mpoints         r"   rr   zExtensionPackage._load_metadata   s    
 yy	9)5d488)L&DK  	6A"A488<E05D!!%**-	6   	9tf$:1# >3 3  *#.D8	9s   $A5 5	B>BBc                V    t        d | j                  j                         D              S )z.Validate all extension points in this package.c              3  <   K   | ]  }|j                           y wrD   r   ).0	extensions     r"   	<genexpr>z,ExtensionPackage.validate.<locals>.<genexpr>   s     XI9%%'Xs   )allrw   valuesr    s    r"   r   zExtensionPackage.validate   s"    X9N9N9U9U9WXXXr$   c                    | j                   j                  |d      }|s!| j                  |   }|j                  |       yy)zLink an extension point.FN)_linked_pointsr?   rw   rX   )r!   
point_namerG   r6   rz   s        r"   
link_pointzExtensionPackage.link_point   s>    $$((U;))*5EJJy! r$   c                B    | j                   |   }|j                  |      S )Load an extension point.)rw   rZ   r!   r   rG   rz   s       r"   
load_pointzExtensionPackage.load_point   s!    %%j1zz)$$r$   c                ^   K   | j                   |   }|j                  |       d{   S 7 w)r   N)rw   r]   r   s       r"   start_pointzExtensionPackage.start_point  s+     %%j1[[++++s   $-+-c                J    | j                   D ]  }| j                  ||        y)zLink all extension points.N)rw   r   r!   rG   r   s      r"   link_all_pointsz ExtensionPackage.link_all_points  s%    // 	3JOOJ	2	3r$   c                `    | j                   D cg c]  }| j                  ||       c}S c c}w )Load all extension points.)rw   r   r   s      r"   load_all_pointsz ExtensionPackage.load_all_points  s'    IMI^I^_:
I6___s   +c                f   K   | j                   D ]  }| j                  ||       d{     y7 w)r   N)rw   r   r   s      r"   start_all_pointsz!ExtensionPackage.start_all_points  s4     // 	:J"":y999	:9s   %1/1)r^   r_   r`   ra   r   r>   r   rm   r   r   rw   r   r(   r   r%   ri   r   rn   rq   rr   r   r   r   r   r   r   r   __classcell__)rt   s   @r"   rf   rf      s     CDD5JKGVNvD'cdFDF!XYHG Y7 7
"(Y"%
,
3
`:r$   rf   c                     e Zd ZdZ eed      Z e       Z e	d      d        Z
 ed      d        Z ed      Zed	        Z ed
      Zed        Zed        Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Z y)ExtensionManagerzHigh level interface for finding, validating,
    linking, loading, and managing Jupyter Server extensions.

    Usage:
    m = ExtensionManager(config_manager=...)
    Tr   config_managerc                <    t               }| j                  |       |S rD   )r   _load_config_managerr!   r   s     r"   _load_default_config_managerz-ExtensionManager._load_default_config_manager!  s    /1!!.1r$   c                T    |j                   r| j                  |j                          y y rD   )newr   )r!   changes     r"   _config_manager_changedz(ExtensionManager._config_manager_changed'  s     ::%%fjj1 r$   zq
        Dictionary with extension package names as keys
        and ExtensionPackage objects as values.
        rg   c                Z    t        t        | j                  j                                     S )z8Returns an extensions dictionary, sorted alphabetically.)dictsorted
extensionsitemsr    s    r"   sorted_extensionsz"ExtensionManager.sorted_extensions7  s!     F4??002344r$   z|
        Dictionary with extension names as keys

        values are True if the extension is linked, False if not.
        c           
         | j                   j                         D ci c]E  \  }}||j                  j                         D ch c]  }|j                  s|j                   c}G c}}}S c c}w c c}}}w )zCReturn mapping of extension names and sets of ExtensionApp objects.)r   r   rw   r   r)   )r!   r>   r~   rz   s       r"   extension_appszExtensionManager.extension_appsH  si    
 $(??#8#8#:
 
i )*D*D*K*K*M[QVQZQZ599[[
 	
[
s   %A3A.A.$A3.A3c                    | j                   j                         D ci c]'  }|j                  j                         D ]  \  }}||
 ) c}}}S c c}}}w )zCReturn mapping of extension point names and ExtensionPoint objects.)r   r   rw   r   )r!   r'   r>   rz   s       r"   rw   z!ExtensionManager.extension_pointsP  sb    
 //1
 
$55;;=
 e %K

 	
 
s   ,Ac                    || _         y)z1Add extensions found by an ExtensionConfigManagerN)r   r   s     r"   from_config_managerz$ExtensionManager.from_config_managerY  s     -r$   c                F    |j                         }| j                  |       y)z Actually load our config managerN)get_jpserver_extensionsfrom_jpserver_extensions)r!   r   jpserver_extensionss      r"   r   z%ExtensionManager._load_config_manager^  s     ,DDF%%&9:r$   c                Z    |j                         D ]  \  }}| j                  ||        y)z:Add extensions from 'jpserver_extensions'-like dictionary.)rm   N)r   add_extension)r!   r   r>   rm   s       r"   r   z)ExtensionManager.from_jpserver_extensionsc  s1    0668 	6MD'tW5	6r$   c                    	 t        ||      }|| j                  |<   y# t        $ rM}| j                  r| j                  j                  r | j
                  j                  d|||d       Y d}~yd}~ww xY w)zeTry to add extension to manager, return True if successful.
        Otherwise, return False.
        )r>   rm   Tz-%s | error adding extension (enabled: %s): %sexc_infoNF)rf   r   rV   rG   !reraise_server_extension_failuresr   warning)r!   extension_namerm   extpkgrx   s        r"   r   zExtensionManager.add_extensionh  sz    	%>7KF.4DOON+ 		~~$.."R"RHH?    		s    	A5AA00A5c                   | j                   j                  |d      }| j                  |   }|sU|j                  rH	 |j	                  | j
                         d| j                   |<   | j                  j                  d|       yyy# t        $ rL}| j
                  r| j
                  j                  r | j                  j                  d||d       Y d}~yd}~ww xY w)zLink an extension by name.FTz'%s | extension was successfully linked.z %s | error linking extension: %sr   N)linked_extensionsr?   r   rm   r   rG   r   inforV   r   r   )r!   r>   r6   r~   rx   s        r"   link_extensionzExtensionManager.link_extension}  s    ''++D%8OOD)	)++]))$..9/3&&t,GN ,v  ]>>dnn&V&V  !CT1W[ \\]s   AB 	CACCc                z   | j                   j                  |      }|rF|j                  r9	 |j                  | j                         | j
                  j                  d|       yyy# t        $ rL}| j                  r| j                  j                  r | j
                  j                  d||d       Y d}~yd}~ww xY w)zLoad an extension by name.z'%s | extension was successfully loaded.z.%s | extension failed loading with message: %rTr   N)
r   r?   rm   r   rG   r   r   rV   r   r   r!   r>   r~   rx   s       r"   load_extensionzExtensionManager.load_extension  s    OO''-	**	O))$..9 GN +9  >>dnn&V&V  DdAX\ !  s   A% %	B:.AB55B:c                  K   | j                   j                  |      }|rN|j                  rA	 |j                  | j                         d{    | j
                  j                  d|       yyy7 ## t        $ rL}| j                  r| j                  j                  r | j
                  j                  d||d       Y d}~yd}~ww xY ww)zStart an extension by name.Nz(%s | extension was successfully started.z/%s | extension failed starting with message: %rTr   )
r   r?   rm   r   rG   r   debugrV   r   r   r   s       r"   start_extensionz ExtensionManager.start_extension  s     OO''-	**	Q00@@@ I4P +9@ >>dnn&V&V  EtQY] !  sA   *C	A1 A/A1 C	/A1 1	C:AC<C	CC	c                   K   |D ]h  }| j                   j                  d||j                         |j                          d{    | j                   j                  d||j                         j y7 .w)z.Call the shutdown hooks in the specified apps.z%s | extension app %r stoppingNz%s | extension app %r stopped)r   r   r>   stop_extension)r!   r>   appsr)   s       r"   r   zExtensionManager.stop_extension  s^      	LCHHNN;T388L$$&&&HHNN:D#((K	L&s   A A3A1/A3c                H    | j                   D ]  }| j                  |        y)zHLink all enabled extensions
        to an instance of ServerApp
        N)r   r   r!   r>   s     r"   link_all_extensionsz$ExtensionManager.link_all_extensions  '     ** 	&D%	&r$   c                H    | j                   D ]  }| j                  |        y)zULoad all enabled extensions and append them to
        the parent ServerApp.
        N)r   r   r   s     r"   load_all_extensionsz$ExtensionManager.load_all_extensions  r   r$   c                   K   t        | j                  D cg c]  }| j                  |       c}       d{    yc c}w 7 
w)zStart all enabled extensions.N)r   r   r   r   s     r"   start_all_extensionsz%ExtensionManager.start_all_extensions  s8      D<R<RSDT))$/STTTSTs   A>
AAAc                   K   t        t        t        | j                  t	        t        | j                        j                                                  d{    y7 w)z*Call the shutdown hooks in all extensions.N)r   listr   r   r   r   r   r   r    s    r"   stop_all_extensionsz$ExtensionManager.stop_all_extensions  s?     D!4!4fT$BUBU=V=\=\=^6_`abbbs   AA AA c                    t        t        | j                        j                               D ]  \  }}|D ]  }|j	                         s  y ! y)zMCheck for any activity currently happening across all extension applications.TN)r   r   r   r   current_activity)r!   _r   r)   s       r"   any_activityzExtensionManager.any_activity  sL    d4#6#67==?@ 	 GAt  '') 	 r$   N)F)!r^   r_   r`   ra   r
   r   r   r   rG   r   r   r   r   r   r   rd   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   rE   r$   r"   r   r     s     4FNI 
 2 2 J 5 5  
 
 
 
-
;
6
*]O Q L&&Uc r$   r   )!ra   
__future__r   r,   r   	itertoolsr   tornado.genr   	traitletsr   r   r   r	   r
   r   r   r   r   r   rc   traitlets.configr   r:   r   utilsr   r   r   r   r   rf   r   rE   r$   r"   <module>r      s]     "     [ [ [ 0 0 * \ \e(Y e(PX:* X:v *  r$   