1
1
import importlib
2
2
3
- from traitlets .config import LoggingConfigurable , Config
3
+ from traitlets .config import LoggingConfigurable
4
4
5
5
from traitlets import (
6
6
HasTraits ,
7
7
Dict ,
8
8
Unicode ,
9
9
Bool ,
10
10
Any ,
11
- validate
11
+ Instance ,
12
+ default ,
13
+ observe ,
14
+ validate ,
12
15
)
13
16
17
+ from .config import ExtensionConfigManager
14
18
from .utils import (
15
19
ExtensionMetadataError ,
16
20
ExtensionModuleNotFound ,
@@ -238,35 +242,44 @@ class ExtensionManager(LoggingConfigurable):
238
242
linking, loading, and managing Jupyter Server extensions.
239
243
240
244
Usage:
241
- m = ExtensionManager(jpserver_extensions=extensions )
245
+ m = ExtensionManager(config_manager=... )
242
246
"""
243
- def __init__ (self , config_manager = None , * args , ** kwargs ):
244
- super ().__init__ (* args , ** kwargs )
245
- # The `enabled_extensions` attribute provides a dictionary
246
- # with extension (package) names mapped to their ExtensionPackage interface
247
- # (see above). This manager simplifies the interaction between the
248
- # ServerApp and the extensions being appended.
249
- self ._extensions = {}
250
- # The `_linked_extensions` attribute tracks when each extension
251
- # has been successfully linked to a ServerApp. This helps prevent
252
- # extensions from being re-linked recursively unintentionally if another
253
- # extension attempts to link extensions again.
254
- self ._linked_extensions = {}
255
- self ._config_manager = config_manager
256
- if self ._config_manager :
257
- self .from_config_manager (self ._config_manager )
258
247
259
- @property
260
- def config_manager (self ):
261
- return self ._config_manager
248
+ config_manager = Instance (ExtensionConfigManager , allow_none = True )
249
+
250
+ @default ("config_manager" )
251
+ def _load_default_config_manager (self ):
252
+ config_manager = ExtensionConfigManager ()
253
+ self .from_config_manager (config_manager )
254
+ return config_manager
255
+
256
+ @observe ("config_manager" )
257
+ def _config_manager_changed (self , change ):
258
+ if change .new :
259
+ self .from_config_manager (config_manager )
260
+
261
+ # The `extensions` attribute provides a dictionary
262
+ # with extension (package) names mapped to their ExtensionPackage interface
263
+ # (see above). This manager simplifies the interaction between the
264
+ # ServerApp and the extensions being appended.
265
+ extensions = Dict (
266
+ help = """
267
+ Dictionary with extension package names as keys
268
+ and ExtensionPackage objects as values.
269
+ """
270
+ )
262
271
263
- @property
264
- def extensions (self ):
265
- """Dictionary with extension package names as keys
266
- and an ExtensionPackage objects as values.
272
+ # The `_linked_extensions` attribute tracks when each extension
273
+ # has been successfully linked to a ServerApp. This helps prevent
274
+ # extensions from being re-linked recursively unintentionally if another
275
+ # extension attempts to link extensions again.
276
+ linked_extensions = Dict (
277
+ help = """
278
+ Dictionary with extension names as keys
279
+
280
+ values are True if the extension is linked, False if not.
267
281
"""
268
- # Sort enabled extensions before
269
- return self ._extensions
282
+ )
270
283
271
284
@property
272
285
def extension_points (self ):
@@ -277,15 +290,8 @@ def extension_points(self):
277
290
for name , point in value .extension_points .items ()
278
291
}
279
292
280
- @property
281
- def linked_extensions (self ):
282
- """Dictionary with extension names as keys; values are
283
- True if the extension is linked, False if not."""
284
- return self ._linked_extensions
285
-
286
293
def from_config_manager (self , config_manager ):
287
294
"""Add extensions found by an ExtensionConfigManager"""
288
- self ._config_manager = config_manager
289
295
jpserver_extensions = self ._config_manager .get_jpserver_extensions ()
290
296
self .from_jpserver_extensions (jpserver_extensions )
291
297
@@ -300,21 +306,21 @@ def add_extension(self, extension_name, enabled=False):
300
306
"""
301
307
try :
302
308
extpkg = ExtensionPackage (name = extension_name , enabled = enabled )
303
- self ._extensions [extension_name ] = extpkg
309
+ self .extensions [extension_name ] = extpkg
304
310
return True
305
311
# Raise a warning if the extension cannot be loaded.
306
312
except Exception as e :
307
313
self .log .warning (e )
308
314
return False
309
315
310
316
def link_extension (self , name , serverapp ):
311
- linked = self ._linked_extensions .get (name , False )
317
+ linked = self .linked_extensions .get (name , False )
312
318
extension = self .extensions [name ]
313
319
if not linked and extension .enabled :
314
320
try :
315
321
# Link extension and store links
316
322
extension .link_all_points (serverapp )
317
- self ._linked_extensions [name ] = True
323
+ self .linked_extensions [name ] = True
318
324
self .log .info ("{name} | extension was successfully linked." .format (name = name ))
319
325
except Exception as e :
320
326
self .log .warning (e )
0 commit comments