
    ^h?                        S r SSKJr  SSKrSSKrSSKJr  SSKJr  SSK	J
r
JrJrJrJrJrJrJrJr  SSK	Jr  SSKJr  S	S
KJr  S	SKJrJrJrJr   " S S\5      r " S S\5      r " S S\5      r g)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                  *   \ rS rSrSr\" S5      r\" SSS9r\	" 5       r
\" \R                  5      r\" S5      S 5       r\" S	5      S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS rS rS rS rS rS rS r Sr!g)ExtensionPoint   zzA simple API for connecting to a Jupyter Server extension
point defined by metadata and importable from a Python package.
FNT
allow_nonelogc                .    [         R                  " S5      $ )Nr   )logging	getLoggerselfs    Z/home/james-whalen/.local/lib/python3.13/site-packages/jupyter_server/extension/manager.py_default_logExtensionPoint._default_log   s      !122    metadatac                (   US   n US   U l          [        R                  " U R                   5      U l        SU;   a  US   " 5       U l        U$ ! [         a    Sn[        U5      Sef = f! [         a    SU R                    S3n[        U5      Sef = f)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_metadata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                h    U R                   (       a  U R                   R                  $ U R                  $ )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#   linkedExtensionPoint.linked:   s%     8888###||r&   c                    U R                   $ )z'If the metadata includes an `app` field)r2   r!   s    r#   r+   ExtensionPoint.appE   s     yyr&   c                \    U R                   (       a  U R                   R                  5       $ 0 $ )z:Return any configuration provided by this extension point.)r+   _jupyter_server_configr!   s    r#   configExtensionPoint.configJ   s%     88882244 Ir&   c                    U R                   $ )zeName of the Python package module where the extension's
_load_jupyter_server_extension can be found.
)r,   r!   s    r#   module_nameExtensionPoint.module_nameT   s    
    r&   c                    U R                   (       a  U R                   R                  $ U R                  R                  SU R                  5      $ )zlName of the extension.

If it's not provided in the metadata, `name` is set
to the extensions' module name.
name)r+   rE   r'   getrB   r!   s    r#   rE   ExtensionPoint.name[   s6     8888== }}  )9)9::r&   c                    U R                   $ )z3The imported module (using importlib.import_module))r0   r!   s    r#   r*   ExtensionPoint.modulef   s     ||r&   c                    U R                   (       a  U R                   R                  nU$ [        U R                  SS 5      nU$ )zGet a linker._link_jupyter_server_extensionc                    g N 	serverapps    r#   <lambda>,ExtensionPoint._get_linker.<locals>.<lambda>u   s    $r&   )r+   rK   getattrr*   )r"   linkers     r#   _get_linkerExtensionPoint._get_linkerk   s?    88XX<<F  0&F r&   c                Z    U R                   nU(       d  U R                  n[        U5      nU$ )zGet a loader.)r+   r*   r   )r"   locloaders      r#   _get_loaderExtensionPoint._get_loadery   s%    hh++CCr&   c                    U R                   (       a  U R                   R                  nU$ S n[        U R                  SU5      nU$ )zGet a starter function.c                   #    g 7frM   rN   rO   s    r#   _noop_start0ExtensionPoint._get_starter.<locals>._noop_start   s     s   _start_jupyter_server_extension)r+   r`   rS   r*   )r"   rT   r^   s      r#   _get_starterExtensionPoint._get_starter   sD    88XX==F  1F r&   c                f     U R                  5         U R                  5         g! [         a     gf = f)z+Check that both a linker and loader exists.TF)rU   rZ   	Exceptionr!   s    r#   r   ExtensionPoint.validate   s8    	   		s    # 
00c                f    U R                   (       d   U R                  5       nU" U5        SU l        gg)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)r9   rU   r8   )r"   rP   rT   s      r#   linkExtensionPoint.link   s-     {{%%'F9DL	 r&   c                2    U R                  5       nU" U5      $ )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.
)rZ   )r"   rP   rY   s      r#   loadExtensionPoint.load   s     !!#i  r&   c                N   #    U R                  5       nU" U5      I Sh  vN $  N7f)zpCall's the extensions 'start' hook where it can
start (possibly async) tasks _after_ the event loop is running.
N)ra   )r"   rP   starters      r#   startExtensionPoint.start   s&      ##%Y''''s   %#%)r2   r8   r0   r,   )"__name__
__module____qualname____firstlineno____doc__r   r8   r   r2   r   r'   r
   r   Loggerr   r   r$   validate_traitr5   propertyr9   r+   r?   rB   rE   r*   rU   rZ   ra   r   rg   rj   rn   __static_attributes__rN   r&   r#   r   r      s     5kGt%DvH
7>>
"CU^3 3 J  .       ! ! ; ;  $
 !(r&   r   c                     ^  \ rS rSrSr\" SS9r\" SSS9r\	" 5       r
\	" 5       r\" SSS	9r\" \	" 5       S
S9r\" SS9r\" S5      S 5       rU 4S jrS rS rS rS rS rS rS rS rSrU =r$ )ExtensionPackage   zAn 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   r}   z5Extension metadata loaded from the extension package.z|
            The version of this extension package, if it can be found.
            Otherwise, an empty string.
            versionc                T    U R                   (       d  g[        U R                  SS5      $ )N __version__)enabledrS   r*   r!   s    r#   _load_versionExtensionPackage._load_version   s    ||t{{M266r&   c                j   > [         TU ]  " S0 UD6  U R                  (       a  U R                  5         gg)z Initialize an extension package.NrN   )super__init__r   _load_metadata)r"   kwargs	__class__s     r#   r   ExtensionPackage.__init__   s+    "6"<<! r&   c                *   U R                   n [        XR                  S9u  U l        U l        U R                   H.  n[        X@R                  S9nXPR                  UR                   '   M0     U$ ! [
         a  nSU SU S3n[        U5      SeSnAff = f)zLImport 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   )	rE   r   r   r*   r'   r1   r   r   extension_points)r"   rE   er4   mpoints         r#   r   ExtensionPackage._load_metadata   s    
 yy	9)5d88)L&DK A"A88<E05!!%**-    	9tf$:1# >3 3  *#.D8	9s    A. .
B8BBc                V    [        S U R                  R                  5        5       5      $ )z.Validate all extension points in this package.c              3  @   #    U  H  oR                  5       v   M     g 7frM   r   ).0	extensions     r#   	<genexpr>,ExtensionPackage.validate.<locals>.<genexpr>   s     X9WI%%''9Ws   )allr   valuesr!   s    r#   r   ExtensionPackage.validate   s"    X9N9N9U9U9WXXXr&   c                    U R                   R                  US5      nU(       d!  U R                  U   nUR                  U5        gg)zLink an extension point.FN)_linked_pointsrF   r   rg   )r"   
point_namerP   r9   r   s        r#   
link_pointExtensionPackage.link_point   s>    $$((U;))*5EJJy! r&   c                B    U R                   U   nUR                  U5      $ )Load an extension point.)r   rj   r"   r   rP   r   s       r#   
load_pointExtensionPackage.load_point   s!    %%j1zz)$$r&   c                ^   #    U R                   U   nUR                  U5      I Sh  vN $  N7f)r   N)r   rn   r   s       r#   start_pointExtensionPackage.start_point  s*     %%j1[[++++s   $-+-c                L    U R                    H  nU R                  X!5        M     g)zLink all extension points.N)r   r   r"   rP   r   s      r#   link_all_points ExtensionPackage.link_all_points  s    //JOOJ2 0r&   c                b    U R                    Vs/ s H  o R                  X!5      PM     sn$ s  snf )Load all extension points.)r   r   r   s      r#   load_all_points ExtensionPackage.load_all_points  s)    IMI^I^_I^:
6I^___s   ,c                h   #    U R                    H  nU R                  X!5      I Sh  vN   M     g N	7f)r   N)r   r   r   s      r#   start_all_points!ExtensionPackage.start_all_points  s,     //J"":999 09s   $20
2)r'   r*   )rp   rq   rr   rs   rt   r   rE   r   r   r   r   r   r   r*   r   r'   r~   r   r   r   r   r   r   r   r   r   r   r   rx   __classcell__)r   s   @r#   rz   rz      s     CDD5JKGVNvD'cdFDF!XYHG Y7 7
"(Y"%
,
3
`: :r&   rz   c                     \ rS rSrSr\" \SS9r\" 5       r	\
" S5      S 5       r\" S5      S 5       r\" SS	9r\S
 5       r\" SS	9r\S 5       r\S 5       rS rS rS rSS jrS rS rS rS rS rS rS rS r S r!Sr"g)ExtensionManageri  zHigh level interface for finding, validating,
linking, loading, and managing Jupyter Server extensions.

Usage:
m = ExtensionManager(config_manager=...)
Tr   config_managerc                <    [        5       nU R                  U5        U$ rM   )r   _load_config_managerr"   r   s     r#   _load_default_config_manager-ExtensionManager._load_default_config_manager!  s    /1!!.1r&   c                ^    UR                   (       a  U R                  UR                   5        g g rM   )newr   )r"   changes     r#   _config_manager_changed(ExtensionManager._config_manager_changed'  s     ::%%fjj1 r&   zq
        Dictionary with extension package names as keys
        and ExtensionPackage objects as values.
        r|   c                Z    [        [        U R                  R                  5       5      5      $ )z8Returns an extensions dictionary, sorted alphabetically.)dictsorted
extensionsitemsr!   s    r#   sorted_extensions"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           
        U R                   R                  5        VVVs0 s HL  u  pXR                  R                  5        Vs1 s H!  o3R                  (       d  M  UR                  iM#     sn_MN     snnn$ s  snf s  snnnf )zCReturn mapping of extension names and sets of ExtensionApp objects.)r   r   r   r   r+   )r"   rE   r   r   s       r#   extension_appsExtensionManager.extension_appsH  sj    
 $(??#8#8#:
#: *D*D*K*K*M[*MQZQZ9599*M[[#:
 	
[
s   $A<A7A7+A<7A<c                    U R                   R                  5        VVVs0 s H)  nUR                  R                  5         H  u  p#X#_M	     M+     snnn$ s  snnnf )zCReturn mapping of extension point names and ExtensionPoint objects.)r   r   r   r   )r"   r)   rE   r   s       r#   r   !ExtensionManager.extension_pointsP  sV    
 //1
1$55;;= K= 1
 	
 
s   0Ac                    Xl         g)z1Add extensions found by an ExtensionConfigManagerNr   r   s     r#   from_config_manager$ExtensionManager.from_config_managerY  s
     -r&   c                F    UR                  5       nU R                  U5        g)z Actually load our config managerN)get_jpserver_extensionsfrom_jpserver_extensions)r"   r   jpserver_extensionss      r#   r   %ExtensionManager._load_config_manager^  s     ,DDF%%&9:r&   c                T    UR                  5        H  u  p#U R                  X#S9  M     g)z:Add extensions from 'jpserver_extensions'-like dictionary.)r   N)r   add_extension)r"   r   rE   r   s       r#   r   )ExtensionManager.from_jpserver_extensionsc  s(    0668MDt5 9r&   c           	          [        XS9nX0R                  U'   g! [         aT  nU R                  (       a  U R                  R                  (       a  e U R
                  R                  SUUUSS9   SnAgSnAff = f)zUTry to add extension to manager, return True if successful.
Otherwise, return False.
)rE   r   Tz-%s | error adding extension (enabled: %s): %sexc_infoNF)rz   r   rd   rP   !reraise_server_extension_failuresr   warning)r"   extension_namer   extpkgr   s        r#   r   ExtensionManager.add_extensionh  sq    	%>KF.4OON+ 		~~$.."R"RHH?   		s    
A8A
A33A8c                   U R                   R                  US5      nU R                  U   nU(       dZ  UR                  (       aH   UR	                  U R
                  5        SU R                   U'   U R                  R                  SU5        ggg! [         aR  nU R
                  (       a  U R
                  R                  (       a  e U R                  R                  SXSS9   SnAgSnAff = f)zLink an extension by name.FTz'%s | extension was successfully linked.z %s | error linking extension: %sr   N)linked_extensionsrF   r   r   r   rP   r   inford   r   r   )r"   rE   r9   r   r   s        r#   link_extensionExtensionManager.link_extension}  s    ''++D%8OOD)	)++]))$..9/3&&t,GN ,v  ]>>dnn&V&V  !CTW[ \]s   AB 
C*AC%%C*c                   U R                   R                  U5      nU(       aK  UR                  (       a9   UR                  U R                  5        U R
                  R                  SU5        ggg! [         aR  nU R                  (       a  U R                  R                  (       a  e U R
                  R                  SXSS9   SnAgSnAff = f)zLoad an extension by name.z'%s | extension was successfully loaded.z.%s | extension failed loading with message: %rTr   N)
r   rF   r   r   rP   r   r   rd   r   r   r"   rE   r   r   s       r#   load_extensionExtensionManager.load_extension  s    OO''-	**	O))$..9 GN +9  >>dnn&V&V  DdX\ ! s   A/ /
C9ACCc                  #    U R                   R                  U5      nU(       aS  UR                  (       aA   UR                  U R                  5      I Sh  vN   U R
                  R                  SU5        ggg N#! [         aR  nU R                  (       a  U R                  R                  (       a  e U R
                  R                  SXSS9   SnAgSnAff = f7f)zStart an extension by name.Nz(%s | extension was successfully started.z/%s | extension failed starting with message: %rTr   )
r   rF   r   r   rP   r   debugrd   r   r   r   s       r#   start_extension ExtensionManager.start_extension  s     OO''-	**	Q00@@@ I4P +9@ >>dnn&V&V  EtY] ! sA   4CA; A9A; C9A; ;
CACCCCc                   #    U Hg  nU R                   R                  SXR                  5        UR                  5       I Sh  vN   U R                   R                  SXR                  5        Mi     g N/7f)z.Call the shutdown hooks in the specified apps.z%s | extension app %r stoppingNz%s | extension app %r stopped)r   r   rE   stop_extension)r"   rE   appsr+   s       r#   r   ExtensionManager.stop_extension  sR     CHHNN;T88L$$&&&HHNN:D((K &s   ?A3A10A3c                L    U R                    H  nU R                  U5        M     g)z8Link all enabled extensions
to an instance of ServerApp
N)r   r   r"   rE   s     r#   link_all_extensions$ExtensionManager.link_all_extensions  "     **D% +r&   c                L    U R                    H  nU R                  U5        M     g)zELoad all enabled extensions and append them to
the parent ServerApp.
N)r   r   r   s     r#   load_all_extensions$ExtensionManager.load_all_extensions  r   r&   c                   #    [        U R                   Vs/ s H  oR                  U5      PM     sn5      I Sh  vN   gs  snf  N
7f)zStart all enabled extensions.N)r   r   r   r   s     r#   start_all_extensions%ExtensionManager.start_all_extensions  s;      D<R<RS<RD))$/<RSTTTSTs   AA 
AAAc                   #    [        [        [        U R                  [	        [        U R                  5      R                  5       5      5      5      5      I Sh  vN   g N7f)z*Call the shutdown hooks in all extensions.N)r   listr   r   r   r   r   r   r!   s    r#   stop_all_extensions$ExtensionManager.stop_all_extensions  s>     D!4!4fT$BUBU=V=\=\=^6_`abbbs   AA AA c                    [        [        U R                  5      R                  5       5       H&  u  pU H  nUR	                  5       (       d  M      g   M(     g)zMCheck for any activity currently happening across all extension applications.TN)r   r   r   r   current_activity)r"   _r   r+   s       r#   any_activityExtensionManager.any_activity  sD    d4#6#67==?@GA''))  Ar&   r   N)F)#rp   rq   rr   rs   rt   r
   r   r   r   rP   r   r   r   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rx   rN   r&   r#   r   r     s     4FNI 
 2 2 J 5 5  
 
 
 
-
;
6
*]O Q L&&Uc r&   r   )!rt   
__future__r   r.   r   	itertoolsr   tornado.genr   	traitletsr   r   r   r	   r
   r   r   r   r   r   rv   traitlets.configr   r?   r   utilsr   r   r   r   r   rz   r   rN   r&   r#   <module>r     s]     "     [ [ [ 0 0 * \ \e(Y e(PX:* X:v *  r&   