
    Ke17                        d Z ddlmZ ddl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dS )zThe extension manager.    )annotationsN)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
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S )ExtensionPointzA simple API for connecting to a Jupyter Server extension
    point defined by metadata and importable from a Python package.
    FNT
allow_nonemetadatac                8   |d         }	 |d         | _         n # t          $ r d}t          |          dw xY w	 t          j        | j                   | _        n)# t          $ r d| j          d}t          |          dw xY wd|v r |d                     | _        |S )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)selfproposedr   msgs       @lib/python3.11/site-packages/jupyter_server/extension/manager.py_valid_metadatazExtensionPoint._valid_metadata   s     G$	8 ( 2D 	8 	8 	8PC(--47	8	9$243DEEDLL 	9 	9 	93$"3 3 3 3  *#..D8	9 H'))DIs    5A &A>c                6    | 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   _linkedr'   s    r*   linkedzExtensionPoint.linked1   s!     8 	$8##|    c                    | j         S )z'If the metadata includes an `app` field)r&   r.   s    r*   r   zExtensionPoint.app<   s     yr0   c                F    | j         r| j                                         S i S )z:Return any configuration provided by this extension point.)r   _jupyter_server_configr.   s    r*   configzExtensionPoint.configA   s)     8 	822444 Ir0   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_nameK   s    
   r0   c                h    | j         r| j         j        S | 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   r8   r   getr6   r.   s    r*   r8   zExtensionPoint.nameR   s3     8 	!8= }  )9:::r0   c                    | j         S )z3The imported module (using importlib.import_module))r$   r.   s    r*   r   zExtensionPoint.module]   s     |r0   c                \    | j         r| j         j        }nt          | j        dd           }|S )zGet a linker._link_jupyter_server_extensionc                    d S N )	serverapps    r*   <lambda>z,ExtensionPoint._get_linker.<locals>.<lambda>l   s    $ r0   )r   r<   getattrr   )r'   linkers     r*   _get_linkerzExtensionPoint._get_linkerb   s<    8 		X<FF0&& F r0   c                D    | j         }|s| j        }t          |          }|S )zGet a loader.)r   r   r   )r'   locloaders      r*   _get_loaderzExtensionPoint._get_loaderp   s(    h 	+CCr0   c                z    	 |                                   |                                  dS # t          $ r Y dS w xY w)z+Check that both a linker and loader exists.TF)rD   rH   	Exceptionr.   s    r*   r   zExtensionPoint.validatex   sV    	 4  	 	 	55	s   (, 
::c                d    | j         s(|                                 } ||           d| _        dS dS )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)r/   rD   r-   )r'   r@   rC   s      r*   linkzExtensionPoint.link   sD     { 	 %%''FF9DLLL		  	 r0   c                @    |                                  } ||          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.
        )rH   )r'   r@   rG   s      r*   loadzExtensionPoint.load   s%     !!##vi   r0   )__name__
__module____qualname____doc__r   r-   r   r&   r   r   validate_traitr+   propertyr/   r   r4   r6   r8   r   rD   rH   r   rL   rN   r?   r0   r*   r   r      s]         d5kkG3t%%%DtvvH^J   .   X   X   X ! ! X! ; ; X;   X      
  
  
 ! ! ! ! !r0   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 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   rX   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         sdS t          | j        dd          S )N __version__)enabledrB   r   r.   s    r*   _load_versionzExtensionPackage._load_version   s%    | 	2t{M2666r0   c                t     t                      j        di | | j        r|                                  dS dS )z Initialize an extension package.Nr?   )super__init__r]   _load_metadata)r'   kwargs	__class__s     r*   ra   zExtensionPackage.__init__   sL    ""6"""< 	"!!!!!	" 	"r0   c                   | j         }	 t          || j                  \  | _        | _        n+# t
          $ r}d| d| d}t          |          dd}~ww xY w| j        D ]!}t          |          }|| j        |j         <   "|S )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   )	r8   r   logr   r   r%   r   r   extension_points)r'   r8   er)   mpoints         r*   rb   zExtensionPackage._load_metadata   s    
 y	9)5d48)L)L)L&DK 	9 	9 	93t 3 31 3 3 3  *#..D8	9  	6 	6A"A...E05D!%*--s   #- 
AAAc                b    t          d | j                                        D                       S )z.Validate all extension points in this package.c              3  >   K   | ]}|                                 V  d S r>   r   ).0	extensions     r*   	<genexpr>z,ExtensionPackage.validate.<locals>.<genexpr>   s.      XXI9%%''XXXXXXr0   )allrh   valuesr.   s    r*   r   zExtensionPackage.validate   s.    XX9N9U9U9W9WXXXXXXr0   c                    | j                             |d          }|s$| j        |         }|                    |           dS dS )zLink an extension point.FN)_linked_pointsr9   rh   rL   )r'   
point_namer@   r/   rk   s        r*   
link_pointzExtensionPackage.link_point   sQ    $((U;; 	")*5EJJy!!!!!	" 	"r0   c                F    | j         |         }|                    |          S )zLoad an extension point.)rh   rN   )r'   ru   r@   rk   s       r*   
load_pointzExtensionPackage.load_point   s!    %j1zz)$$$r0   c                F    | j         D ]}|                     ||           dS )zLink all extension points.N)rh   rv   )r'   r@   ru   s      r*   link_all_pointsz ExtensionPackage.link_all_points   s5    / 	3 	3JOOJ	2222	3 	3r0   c                .      fd j         D             S )zLoad all extension points.c                <    g | ]}                     |          S r?   )rx   )rn   ru   r'   r@   s     r*   
<listcomp>z4ExtensionPackage.load_all_points.<locals>.<listcomp>   s'    ___:
I66___r0   )rh   )r'   r@   s   ``r*   load_all_pointsz ExtensionPackage.load_all_points   s$    _____I^____r0   )rO   rP   rQ   rR   r   r8   r   r]   r   rt   rh   r   r   r
   r   rY   r   r^   ra   rb   r   rv   rx   rz   r~   __classcell__)rd   s   @r*   rV   rV      sX         7CDDDDd5JKKKGTVVNtvvSD'cdddFtDDFF!XYYYHg  G WY7 7 7
" " " " "  (Y Y Y" " "% % %
3 3 3
` ` ` ` ` ` `r0   rV   c                  F   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S )ExtensionManagerzHigh level interface for findind, validating,
    linking, loading, and managing Jupyter Server extensions.

    Usage:
    m = ExtensionManager(config_manager=...)
    Tr   config_managerc                L    t                      }|                     |           |S r>   )r   _load_config_managerr'   r   s     r*   _load_default_config_managerz-ExtensionManager._load_default_config_manager   s'    /11!!.111r0   c                L    |j         r|                     |j                    d S d S r>   )newr   )r'   changes     r*   _config_manager_changedz(ExtensionManager._config_manager_changed   s2    : 	2%%fj11111	2 	2r0   zq
        Dictionary with extension package names as keys
        and ExtensionPackage objects as values.
        rW   c                h    t          t          | j                                                            S )z8Returns an extensions dictionary, sorted alphabetically.)dictsorted
extensionsitemsr.   s    r*   sorted_extensionsz"ExtensionManager.sorted_extensions  s(     F4?002233444r0   z|
        Dictionary with extension names as keys

        values are True if the extension is linked, False if not.
        c                H    d | j                                         D             S )zCReturn mapping of extension names and sets of ExtensionApp objects.c                \    i | ])\  }}|d  |j                                         D             *S )c                *    h | ]}|j         	|j         S r?   )r   )rn   rk   s     r*   	<setcomp>z=ExtensionManager.extension_apps.<locals>.<dictcomp>.<setcomp>   s#    [[[QVQZ[59[[[r0   )rh   rr   )rn   r8   ro   s      r*   
<dictcomp>z3ExtensionManager.extension_apps.<locals>.<dictcomp>  sL     
 
 
i [[)*D*K*K*M*M[[[
 
 
r0   )r   r   r.   s    r*   extension_appszExtensionManager.extension_apps  s1    
 
#'?#8#8#:#:
 
 
 	
r0   c                H    d | j                                         D             S )zCReturn mapping of extension point names and ExtensionPoint objects.c                R    i | ]$}|j                                         D ]\  }}||	%S r?   )rh   r   )rn   r   r8   rk   s       r*   r   z5ExtensionManager.extension_points.<locals>.<dictcomp>'  sT     
 
 
$5;;==
 
 e %
 
 
 
r0   )r   rr   r.   s    r*   rh   z!ExtensionManager.extension_points$  s1    
 
//11
 
 
 	
r0   c                    || _         dS )z1Add extensions found by an ExtensionConfigManagerN)r   r   s     r*   from_config_managerz$ExtensionManager.from_config_manager-  s     -r0   c                X    |                                 }|                     |           dS )z Actually load our config managerN)get_jpserver_extensionsfrom_jpserver_extensions)r'   r   jpserver_extensionss      r*   r   z%ExtensionManager._load_config_manager2  s/    ,DDFF%%&9:::::r0   c                h    |                                 D ]\  }}|                     ||           dS )z:Add extensions from 'jpserver_extensions'-like dictionary.)r]   N)r   add_extension)r'   r   r8   r]   s       r*   r   z)ExtensionManager.from_jpserver_extensions7  sG    06688 	6 	6MD'tW5555	6 	6r0   Fc                    	 t          ||          }|| j        |<   dS # t          $ r=}| j        r| j        j        r | j                            d|||d           Y d}~nd}~ww xY wdS )zeTry to add extension to manager, return True if successful.
        Otherwise, return False.
        )r8   r]   Tz-%s | error adding extension (enabled: %s): %sexc_infoNF)rV   r   rJ   r@   !reraise_server_extension_failuresrg   warning)r'   extension_namer]   extpkgri   s        r*   r   zExtensionManager.add_extension<  s    	%>7KKKF.4DON+4 		 		 		~ $."R H?         		 us    
A&3A!!A&c                   | j                             |d          }| j        |         }|s|j        r	 |                    | j                   d| j         |<   | j                            d|           dS # t          $ r=}| j        r| j        j	        r | j        
                    d||d           Y d}~dS d}~ww xY wdS dS )zLink an extension by name.FTz'%s | extension was successfully linked.z %s | error linking extension: %sr   N)linked_extensionsr9   r   r]   rz   r@   rg   inforJ   r   r   )r'   r8   r/   ro   ri   s        r*   link_extensionzExtensionManager.link_extensionQ  s   '++D%88OD)	 		])+ 		]]))$.999/3&t,GNNNNN ] ] ]> dn&V   !CT1W[ \\\\\\\\\]		] 		] 		] 		]s   ?A4 4
B;>2B66B;c                T   | j                             |          }|r|j        r	 |                    | j                   | j                            d|           dS # t          $ r=}| j        r| j        j        r | j        	                    d||d           Y d}~dS d}~ww xY wdS dS )zLoad an extension by name.z'%s | extension was successfully loaded.z.%s | extension failed loading with message: %rTr   N)
r   r9   r]   r~   r@   rg   r   rJ   r   r   )r'   r8   ro   ri   s       r*   load_extensionzExtensionManager.load_extension`  s    O''--	 
	O* 
	O	O))$.999 GNNNNN    > dn&V   DdAX\ !         
	O 
	O 
	O 
	Os   A 
B#&2BB#c                   K   |D ]^}| j                             d||j                   |                                 d{V  | j                             d||j                   _dS )z.Call the shutdown hooks in the specified apps.z%s | extension app %r stoppingNz%s | extension app %r stopped)rg   debugr8   stop_extension)r'   r8   appsr   s       r*   r   zExtensionManager.stop_extensionp  s       	L 	LCHNN;T38LLL$$&&&&&&&&&HNN:D#(KKKK	L 	Lr0   c                D    | j         D ]}|                     |           dS )zHLink all enabled extensions
        to an instance of ServerApp
        N)r   r   r'   r8   s     r*   link_all_extensionsz$ExtensionManager.link_all_extensionsw  7     * 	& 	&D%%%%	& 	&r0   c                D    | j         D ]}|                     |           dS )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   r0   c                    K   t           fdt          t           j                                                            D                        d{V  dS )z*Call the shutdown hooks in all extensions.c                B    g | ]\  }}                     ||          S r?   )r   )rn   r8   r   r'   s      r*   r}   z8ExtensionManager.stop_all_extensions.<locals>.<listcomp>  s=       D$ ##D$//  r0   N)r   r   r   r   r   r.   s   `r*   stop_all_extensionsz$ExtensionManager.stop_all_extensions  s         "(d.A)B)B)H)H)J)J"K"K  
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r0   c                    t          t          | j                                                            D ]"\  }}|D ]}|                                r  dS #dS )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  st    d4#677==??@@ 	  	 GAt    ''))  444  	  	 r0   N)F)rO   rP   rQ   rR   r	   r   r   r   r@   r   r   r   r   r   r   rT   r   r   r   rh   r   r   r   r   r   r   r   r   r   r   r   r?   r0   r*   r   r      s         X4FFFNIW  
 W2 2 2   J 5 5 X5    
 
 X
 
 
 X
- - -
; ; ;
6 6 6
   *] ] ]O O O L L L& & && & &
 
 
         r0   r   )rR   
__future__r   r"   tornado.genr   	traitletsr   r   r   r   r	   r
   r   r   r   r   rS   traitlets.configr   r4   r   utilsr   r   r   r   r   rV   r   r?   r0   r*   <module>r      s     " " " " " "           [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ 0 0 0 0 0 0 0 0 0 0 0 0 * * * * * * \ \ \ \ \ \ \ \ \ \ \ \F! F! F! F! F!Y F! F! F!RN` N` N` N` N`* N` N` N`bn  n  n  n  n * n  n  n  n  n r0   