
    }tf6                        d 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	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
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y)ExtensionPointzA simple API for connecting to a Jupyter Server extension
    point defined by metadata and importable from a Python package.
    FNT
allow_none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)selfproposedr   msgs       j/var/www/html/software/conda/envs/higlass/lib/python3.12/site-packages/jupyter_server/extension/manager.py_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    _linkedr(   s    r+   linkedzExtensionPoint.linked3   s%     8888###||    c                    | j                   S )z'If the metadata includes an `app` field)r'   r/   s    r+   r    zExtensionPoint.app>   s     yyr1   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.configC   s%     88882244 Ir1   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_nameM   s    
    r1   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    r9   r   getr7   r/   s    r+   r9   zExtensionPoint.nameT   s6     8888== }}  )9)9::r1   c                    | j                   S )z3The imported module (using importlib.import_module))r%   r/   s    r+   r   zExtensionPoint.module_   s     ||r1   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>n   s    r1   )r    r=   getattrr   )r(   linkers     r+   _get_linkerzExtensionPoint._get_linkerd   s?    88XX<<F  0&F r1   c                P    | j                   }|s| j                  }t        |      }|S )zGet a loader.)r    r   r   )r(   locloaders      r+   _get_loaderzExtensionPoint._get_loaderr   s%    hh++CCr1   c                d    	 | j                          | j                          y# t        $ r Y yw xY w)z+Check that both a linker and loader exists.TF)rE   rI   	Exceptionr/   s    r+   r   zExtensionPoint.validatez   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)r0   rE   r.   )r(   rA   rD   s      r+   linkzExtensionPoint.link   s-     {{%%'F9DL	 r1   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.
        )rI   )r(   rA   rH   s      r+   loadzExtensionPoint.load   s     !!#i  r1   )__name__
__module____qualname____doc__r   r.   r   r'   r   r   validate_traitr,   propertyr0   r    r5   r7   r9   r   rE   rI   r   rM   rO   r@   r1   r+   r   r      s     5kGt%DvHJ  .       ! ! ; ;  
 !r1   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   rY   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__)enabledrC   r   r/   s    r+   _load_versionzExtensionPackage._load_version   s    ||t{{M266r1   c                ^    t        |   di | | j                  r| j                          yy)z Initialize an extension package.Nr@   )super__init__r^   _load_metadata)r(   kwargs	__class__s     r+   rb   zExtensionPackage.__init__   s+    "6"<<! r1   c                    | j                   }	 t        || j                        \  | _        | _        | j                  D ]'  }t        |      }|| j                  |j                   <   ) |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   )	r9   r   logr   r   r&   r   r   extension_points)r(   r9   er*   mpoints         r+   rc   zExtensionPackage._load_metadata   s    
 yy	9)5d488)L&DK  	6A"A.E05D!!%**-	6   	9tf$:1# >3 3  *#.D8	9s   $A* *	B3BBc                V    t        d | j                  j                         D              S )z.Validate all extension points in this package.c              3  <   K   | ]  }|j                           y wr?   r   ).0	extensions     r+   	<genexpr>z,ExtensionPackage.validate.<locals>.<genexpr>   s     XI9%%'Xs   )allri   valuesr/   s    r+   r   zExtensionPackage.validate   s"    X9N9N9U9U9WXXXr1   c                    | j                   j                  |d      }|s!| j                  |   }|j                  |       yy)zLink an extension point.FN)_linked_pointsr:   ri   rM   )r(   
point_namerA   r0   rl   s        r+   
link_pointzExtensionPackage.link_point   s>    $$((U;))*5EJJy! r1   c                B    | j                   |   }|j                  |      S )zLoad an extension point.)ri   rO   )r(   rv   rA   rl   s       r+   
load_pointzExtensionPackage.load_point   s!    %%j1zz)$$r1   c                J    | j                   D ]  }| j                  ||        y)zLink all extension points.N)ri   rw   r(   rA   rv   s      r+   link_all_pointsz ExtensionPackage.link_all_points   s%    // 	3JOOJ	2	3r1   c                `    | j                   D cg c]  }| j                  ||       c}S c c}w )zLoad all extension points.)ri   ry   r{   s      r+   load_all_pointsz ExtensionPackage.load_all_points   s'    IMI^I^_:
I6___s   +)rP   rQ   rR   rS   r   r9   r   r^   r   ru   ri   r   r   r   r   rZ   r   r_   rb   rc   r   rw   ry   r|   r~   __classcell__)re   s   @r+   rW   rW      s     CDD5JKGVNvD'cdFDF!XYHG Y7 7
"(Y"%
3
`r1   rW   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y)ExtensionManagerzHigh level interface for findind, validating,
    linking, loading, and managing Jupyter Server extensions.

    Usage:
    m = ExtensionManager(config_manager=...)
    Tr   config_managerc                <    t               }| j                  |       |S r?   )r   _load_config_managerr(   r   s     r+   _load_default_config_managerz-ExtensionManager._load_default_config_manager   s    /1!!.1r1   c                T    |j                   r| j                  |j                          y y r?   )newr   )r(   changes     r+   _config_manager_changedz(ExtensionManager._config_manager_changed   s     ::%%fjj1 r1   zq
        Dictionary with extension package names as keys
        and ExtensionPackage objects as values.
        rX   c                Z    t        t        | j                  j                                     S )z8Returns an extensions dictionary, sorted alphabetically.)dictsorted
extensionsitemsr/   s    r+   sorted_extensionsz"ExtensionManager.sorted_extensions  s!     F4??002344r1   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   ri   rs   r    )r(   r9   rp   rl   s       r+   extension_appszExtensionManager.extension_apps  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   rs   ri   r   )r(   r   r9   rl   s       r+   ri   z!ExtensionManager.extension_points&  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_manager/  s     -r1   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_manager4  s     ,DDF%%&9:r1   c                Z    |j                         D ]  \  }}| j                  ||        y)z:Add extensions from 'jpserver_extensions'-like dictionary.)r^   N)r   add_extension)r(   r   r9   r^   s       r+   r   z)ExtensionManager.from_jpserver_extensions9  s1    0668 	6MD'tW5	6r1   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.
        )r9   r^   Tz-%s | error adding extension (enabled: %s): %sexc_infoNF)rW   r   rK   rA   !reraise_server_extension_failuresrh   warning)r(   extension_namer^   extpkgrj   s        r+   r   zExtensionManager.add_extension>  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   r^   r|   rA   rh   inforK   r   r   )r(   r9   r0   rp   rj   s        r+   link_extensionzExtensionManager.link_extensionS  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:   r^   r~   rA   rh   r   rK   r   r   )r(   r9   rp   rj   s       r+   load_extensionzExtensionManager.load_extensionb  s    OO''-	**	O))$..9 GN +9  >>dnn&V&V  DdAX\ !  s   A% %	B:.AB55B: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)rh   debugr9   stop_extension)r(   r9   appsr    s       r+   r   zExtensionManager.stop_extensionr  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(   r9   s     r+   link_all_extensionsz$ExtensionManager.link_all_extensionsy  '     ** 	&D%	&r1   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   r1   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  '') 	 r1   N)F)rP   rQ   rR   rS   r
   r   r   r   rA   r   r   r   r   r   r   rU   r   r   r   ri   r   r   r   r   r   r   r   r   r   r   r   r@   r1   r+   r   r      s     4FNI 
 2 2 J 5 5  
 
 
 
-
;
6
*]O L&&c r1   r   ) rS   
__future__r   r#   	itertoolsr   tornado.genr   	traitletsr   r   r   r	   r
   r   r   r   r   r   rT   traitlets.configr   r5   r   utilsr   r   r   r   r   rW   r   r@   r1   r+   <module>r      s\     "    [ [ [ 0 0 * \ \F!Y F!RN`* N`bi * i r1   