o
    ^i?                     @  s   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 deZG dd deZG dd deZ dS )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                   @  s   e Zd ZdZedZedddZe Z	e
ejZeddd Zed	d
d Zedd Zedd Zedd Zedd Zedd Zedd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$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logc                 C  s
   t dS )Nr   )logging	getLoggerself r   [/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyter_server/extension/manager.py_default_log   s   
zExtensionPoint._default_logmetadatac                 C  s   |d }z|d | _ W n ty   d}t|dw z	t| j | _W n ty6   d| j  d}t|dw d|v rA|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)r   proposedr"   msgr   r   r    _valid_metadata"   s"   

zExtensionPoint._valid_metadatac                 C  s   | 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   r   r   r    linked:   s   zExtensionPoint.linkedc                 C     | j S )z'If the metadata includes an `app` field)r,   r   r   r   r    r%   E      zExtensionPoint.appc                 C  s   | j r| j  S i S )z:Return any configuration provided by this extension point.)r%   _jupyter_server_configr   r   r   r    configJ   s   
zExtensionPoint.configc                 C  r2   )zuName of the Python package module where the extension's
        _load_jupyter_server_extension can be found.
        )r&   r   r   r   r    module_nameT   s   zExtensionPoint.module_namec                 C  s   | 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%   r7   r"   getr6   r   r   r   r    r7   [   s   zExtensionPoint.namec                 C  r2   )z3The imported module (using importlib.import_module))r*   r   r   r   r    r$   f   r3   zExtensionPoint.modulec                 C  s(   | j r	| j j}|S t| jddd }|S )zGet a linker._link_jupyter_server_extensionc                 S  s   d S Nr   	serverappr   r   r    <lambda>u   s    z,ExtensionPoint._get_linker.<locals>.<lambda>)r%   r9   getattrr$   )r   linkerr   r   r    _get_linkerk   s   	zExtensionPoint._get_linkerc                 C  s   | j }|s| j}t|}|S )zGet a loader.)r%   r$   r   )r   locloaderr   r   r    _get_loadery   s
   zExtensionPoint._get_loaderc                 C  s,   | j r	| j j}|S dd }t| jd|}|S )zGet a starter function.c                   s   d S r:   r   r;   r   r   r    _noop_start   s   z0ExtensionPoint._get_starter.<locals>._noop_start_start_jupyter_server_extension)r%   rE   r>   r$   )r   r?   rD   r   r   r    _get_starter   s   zExtensionPoint._get_starterc                 C  s,   z|    |   W dS  ty   Y dS w )z+Check that both a linker and loader exists.FT)r@   rC   	Exceptionr   r   r   r    r      s   
zExtensionPoint.validatec                 C  s$   | 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)r1   r@   r0   )r   r<   r?   r   r   r    link   s
   
zExtensionPoint.linkc                 C  s   |   }||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.
        )rC   )r   r<   rB   r   r   r    load   s   zExtensionPoint.loadc                   s   |   }||I dH S )zCall's the extensions 'start' hook where it can
        start (possibly async) tasks _after_ the event loop is running.
        N)rF   )r   r<   starterr   r   r    start   s   zExtensionPoint.start) __name__
__module____qualname____doc__r   r0   r   r,   r   r"   r	   r   Loggerr   r   r!   validate_traitr/   propertyr1   r%   r5   r6   r7   r$   r@   rC   rF   r   rH   rI   rK   r   r   r   r    r      s:    






	




	r   c                      s   e Zd ZdZeddZedddZe Z	e Z
edddZee d	dZed
dZeddd Z fddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z  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   rU   z5Extension metadata loaded from the extension package.z|
            The version of this extension package, if it can be found.
            Otherwise, an empty string.
            versionc                 C  s   | j sdS t| jddS )N __version__)enabledr>   r$   r   r   r   r    _load_version   s   zExtensionPackage._load_versionc                   s(   t  jdi | | jr|   dS dS )z Initialize an extension package.Nr   )super__init__rY   _load_metadata)r   kwargs	__class__r   r    r\      s   zExtensionPackage.__init__c              
   C  s   | j }zt|| jd\| _| _W n ty* } zd| d| d}t|dd}~ww | jD ]}t|| jd}|| j|j < q.|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"   r   )	r7   r   r   r$   r"   r+   r   r   extension_points)r   r7   er.   mpointr   r   r    r]      s   

zExtensionPackage._load_metadatac                 C  s   t dd | j D S )z.Validate all extension points in this package.c                 s  s    | ]}|  V  qd S r:   r   ).0	extensionr   r   r    	<genexpr>   s    z,ExtensionPackage.validate.<locals>.<genexpr>)allrb   valuesr   r   r   r    r      s   zExtensionPackage.validatec                 C  s.   | j |d}|s| j| }|| dS dS )zLink an extension point.FN)_linked_pointsr8   rb   rH   )r   
point_namer<   r1   re   r   r   r    
link_point   s
   
zExtensionPackage.link_pointc                 C  s   | j | }||S )Load an extension point.)rb   rI   r   rl   r<   re   r   r   r    
load_point   s   

zExtensionPackage.load_pointc                   s   | j | }||I dH S )rn   N)rb   rK   ro   r   r   r    start_point  s   
zExtensionPackage.start_pointc                 C  s   | j D ]}| || qdS )zLink all extension points.N)rb   rm   r   r<   rl   r   r   r    link_all_points  s   
z ExtensionPackage.link_all_pointsc                   s    fdd j D S )Load all extension points.c                   s   g | ]}  |qS r   )rp   )rf   rl   r   r<   r   r    
<listcomp>      z4ExtensionPackage.load_all_points.<locals>.<listcomp>)rb   ru   r   ru   r    load_all_points  s   z ExtensionPackage.load_all_pointsc                   s$   | j D ]}| ||I dH  qdS )rt   N)rb   rq   rr   r   r   r    start_all_points  s   
z!ExtensionPackage.start_all_points)rL   rM   rN   rO   r   r7   r   rY   r   rk   rb   r   r$   r
   r"   rV   r   rZ   r\   r]   r   rm   rp   rq   rs   rx   ry   __classcell__r   r   r_   r    rS      s,    

rS   c                   @  s   e Zd ZdZeeddZe Ze	ddd Z
eddd Zed	d
Zedd Zedd
Zedd Zedd Zdd Zdd Zdd Zd.ddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Z d-S )/ExtensionManagerzHigh level interface for finding, validating,
    linking, loading, and managing Jupyter Server extensions.

    Usage:
    m = ExtensionManager(config_manager=...)
    Tr   config_managerc                 C  s   t  }| | |S r:   )r   _load_config_managerr   r|   r   r   r    _load_default_config_manager!  s   
z-ExtensionManager._load_default_config_managerc                 C  s   |j r| |j  d S d S r:   )newr}   )r   changer   r   r    _config_manager_changed'  s   z(ExtensionManager._config_manager_changedzq
        Dictionary with extension package names as keys
        and ExtensionPackage objects as values.
        rT   c                 C  s   t t| j S )z8Returns an extensions dictionary, sorted alphabetically.)dictsorted
extensionsitemsr   r   r   r    sorted_extensions7  s   z"ExtensionManager.sorted_extensionsz|
        Dictionary with extension names as keys

        values are True if the extension is linked, False if not.
        c                 C     dd | j  D S )zCReturn mapping of extension names and sets of ExtensionApp objects.c                 S  s&   i | ]\}}|d d |j  D qS )c                 S  s   h | ]}|j r|j qS r   )r%   )rf   re   r   r   r    	<setcomp>L  rw   z=ExtensionManager.extension_apps.<locals>.<dictcomp>.<setcomp>)rb   rj   )rf   r7   rg   r   r   r    
<dictcomp>K  s    z3ExtensionManager.extension_apps.<locals>.<dictcomp>)r   r   r   r   r   r    extension_appsH     zExtensionManager.extension_appsc                 C  r   )zCReturn mapping of extension point names and ExtensionPoint objects.c                 S  s&   i | ]}|j  D ]\}}||q	qS r   )rb   r   )rf   r#   r7   re   r   r   r    r   S  s    z5ExtensionManager.extension_points.<locals>.<dictcomp>)r   rj   r   r   r   r    rb   P  r   z!ExtensionManager.extension_pointsc                 C  s
   || _ dS )z1Add extensions found by an ExtensionConfigManagerN)r|   r~   r   r   r    from_config_managerY  s   
z$ExtensionManager.from_config_managerc                 C  s   |  }| | dS )z Actually load our config managerN)get_jpserver_extensionsfrom_jpserver_extensions)r   r|   jpserver_extensionsr   r   r    r}   ^  s   z%ExtensionManager._load_config_managerc                 C  s$   |  D ]\}}| j||d qdS )z:Add extensions from 'jpserver_extensions'-like dictionary.)rY   N)r   add_extension)r   r   r7   rY   r   r   r    r   c  s   z)ExtensionManager.from_jpserver_extensionsFc              
   C  sj   zt ||d}|| j|< W dS  ty4 } z| jr| jjr | jjd|||dd W Y d}~dS d}~ww )zeTry to add extension to manager, return True if successful.
        Otherwise, return False.
        )r7   rY   Tz-%s | error adding extension (enabled: %s): %sexc_infoNF)rS   r   rG   r<   !reraise_server_extension_failuresr   warning)r   extension_namerY   extpkgrc   r   r   r    r   h  s"   
zExtensionManager.add_extensionc              
   C  s   | j |d}| j| }|sL|jrNz|| j d| j |< | jd| W dS  tyK } z| jr6| jj	r6 | jj
d||dd W Y d}~dS d}~w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_extensionsr8   r   rY   rs   r<   r   inforG   r   r   )r   r7   r1   rg   rc   r   r   r    link_extension}  s   


"zExtensionManager.link_extensionc              
   C  s   | j |}|rB|jrDz|| j W n% ty8 } z| jr#| jjr# | jjd||dd W Y d}~dS d}~ww | j	d| dS dS dS )zLoad an extension by name.z.%s | extension failed loading with message: %rTr   Nz'%s | extension was successfully loaded.)
r   r8   rY   rx   r<   rG   r   r   r   r   r   r7   rg   rc   r   r   r    load_extension  s   
zExtensionManager.load_extensionc              
     s   | j |}|rF|jrHz|| jI dH  W n% ty< } z| jr'| jjr' | jjd||dd W Y d}~dS d}~ww | j	d| dS dS dS )zStart an extension by name.Nz/%s | extension failed starting with message: %rTr   z(%s | extension was successfully started.)
r   r8   rY   ry   r<   rG   r   r   r   debugr   r   r   r    start_extension  s   
z ExtensionManager.start_extensionc                   sB   |D ]}| j d||j | I dH  | j d||j qdS )z.Call the shutdown hooks in the specified apps.z%s | extension app %r stoppingNz%s | extension app %r stopped)r   r   r7   stop_extension)r   r7   appsr%   r   r   r    r     s   zExtensionManager.stop_extensionc                 C     | j D ]}| | qdS )zHLink all enabled extensions
        to an instance of ServerApp
        N)r   r   r   r7   r   r   r    link_all_extensions     
z$ExtensionManager.link_all_extensionsc                 C  r   )zULoad all enabled extensions and append them to
        the parent ServerApp.
        N)r   r   r   r   r   r    load_all_extensions  r   z$ExtensionManager.load_all_extensionsc                   s$   t  fdd jD I dH  dS )zStart all enabled extensions.c                   s   g | ]}  |qS r   )r   )rf   r7   r   r   r    rv     s    z9ExtensionManager.start_all_extensions.<locals>.<listcomp>N)r   r   r   r   r   r    start_all_extensions  s   "z%ExtensionManager.start_all_extensionsc                   s.   t tt| jtt| j I dH  dS )z*Call the shutdown hooks in all extensions.N)r   listr   r   r   r   r   r   r   r   r   r    stop_all_extensions  s   ,z$ExtensionManager.stop_all_extensionsc                 C  s:   t t| j D ]\}}|D ]
}| r  dS qq	dS )zMCheck for any activity currently happening across all extension applications.TN)r   r   r   r   current_activity)r   _r   r%   r   r   r    any_activity  s   zExtensionManager.any_activityN)F)!rL   rM   rN   rO   r	   r   r|   r   r<   r   r   r   r   r   r   rR   r   r   r   rb   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r{     sB    





		r{   )!rO   
__future__r   r(   r   	itertoolsr   tornado.genr   	traitletsr   r   r   r   r	   r
   r   r   r   r   rQ   traitlets.configr   r5   r   utilsr   r   r   r   r   rS   r{   r   r   r   r    <module>   s    , )[