Skip to content

Commit eca9e43

Browse files
committed
leverage the extension manager for enabling/disabling
1 parent cbe843b commit eca9e43

File tree

9 files changed

+120
-146
lines changed

9 files changed

+120
-146
lines changed

jupyter_server/config_manager.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ def set(self, section_name, data):
118118
# Generate the JSON up front, since it could raise an exception,
119119
# in order to avoid writing half-finished corrupted data to disk.
120120
json_content = json.dumps(data, indent=2)
121-
122121
if PY3:
123122
f = io.open(filename, 'w', encoding='utf-8')
124123
else:

jupyter_server/extension/config.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,22 @@ def enabled(
3636
except KeyError:
3737
return False
3838

39-
def enable(
40-
self,
41-
name,
42-
section_name=DEFAULT_SECTION_NAME,
43-
):
39+
def enable(self, name):
4440
data = {
4541
"ServerApp": {
4642
"jpserver_extensions": {
4743
name: True
4844
}
4945
}
5046
}
51-
self.update(section_name, data)
47+
self.update(name, data)
5248

53-
def disable(
54-
self,
55-
name,
56-
section_name=DEFAULT_SECTION_NAME
57-
):
49+
def disable(self, name):
5850
data = {
5951
"ServerApp": {
6052
"jpserver_extensions": {
6153
name: False
6254
}
6355
}
6456
}
65-
self.update(section_name, data)
57+
self.update(name, data)

jupyter_server/extension/manager.py

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
HasTraits,
66
Dict,
77
Unicode,
8+
Bool,
89
validate
910
)
1011

@@ -107,8 +108,8 @@ def _get_loader(self):
107108
def validate(self):
108109
"""Check that both a linker and loader exists."""
109110
try:
110-
self.get_linker()
111-
self.get_loader()
111+
self._get_linker()
112+
self._get_loader()
112113
except Exception:
113114
return False
114115

@@ -118,7 +119,7 @@ def link(self, serverapp):
118119
This looks for a `_link_jupyter_server_extension` function
119120
in the extension's module or ExtensionApp class.
120121
"""
121-
linker = self.get_linker()
122+
linker = self._get_linker()
122123
return linker(serverapp)
123124

124125
def load(self, serverapp):
@@ -127,7 +128,7 @@ def load(self, serverapp):
127128
This looks for a `_load_jupyter_server_extension` function
128129
in the extension's module or ExtensionApp class.
129130
"""
130-
loader = self.get_loader()
131+
loader = self._get_loader()
131132
return loader(serverapp)
132133

133134

@@ -140,6 +141,7 @@ class ExtensionPackage(HasTraits):
140141
extpkg = ExtensionPackage(name=ext_name)
141142
"""
142143
name = Unicode(help="Name of the an importable Python package.")
144+
enabled = Bool(False).tag(config=True)
143145

144146
def __init__(self, *args, **kwargs):
145147
# Store extension points that have been linked.
@@ -187,7 +189,7 @@ def extension_points(self):
187189

188190
def validate(self):
189191
"""Validate all extension points in this package."""
190-
for extension in self.extensions_points:
192+
for extension in self.extension_points.values():
191193
if not extension.validate():
192194
return False
193195
return True
@@ -224,27 +226,27 @@ def __init__(self, config_manager=None, *args, **kwargs):
224226
# with extension (package) names mapped to their ExtensionPackage interface
225227
# (see above). This manager simplifies the interaction between the
226228
# ServerApp and the extensions being appended.
227-
self._enabled_extensions = {}
229+
self._extensions = {}
228230
# The `_linked_extensions` attribute tracks when each extension
229231
# has been successfully linked to a ServerApp. This helps prevent
230232
# extensions from being re-linked recursively unintentionally if another
231233
# extension attempts to link extensions again.
232234
self._linked_extensions = {}
233235
self._config_manager = config_manager
234236
if self._config_manager:
235-
self.from_config_manager
237+
self.from_config_manager(self._config_manager)
236238

237239
@property
238-
def enabled_extensions(self):
240+
def extensions(self):
239241
"""Dictionary with extension package names as keys
240242
and an ExtensionPackage objects as values.
241243
"""
242244
# Sort enabled extensions before
243-
return self._enabled_extensions
245+
return self._extensions
244246

245247
@property
246248
def extension_points(self):
247-
extensions = self.enabled_extensions
249+
extensions = self.extensions
248250
return {
249251
name: point
250252
for value in extensions.values()
@@ -260,42 +262,42 @@ def from_config_manager(self, config_manager):
260262
def from_jpserver_extensions(self, jpserver_extensions):
261263
"""Add extensions from 'jpserver_extensions'-like dictionary."""
262264
for name, enabled in jpserver_extensions.items():
263-
if enabled:
264-
self.add_extension(name)
265+
self.add_extension(name, enabled=enabled)
265266

266-
def add_extension(self, extension_name):
267+
def add_extension(self, extension_name, enabled=False):
267268
try:
268-
extpkg = ExtensionPackage(name=extension_name)
269-
self._enabled_extensions[extension_name] = extpkg
270-
# Raise a warning if the extension cannot be loaded.
269+
extpkg = ExtensionPackage(name=extension_name, enabled=enabled)
270+
self._extensions[extension_name] = extpkg
271+
# Raise a warning if the extension cannot be loaded.
271272
except Exception as e:
272273
self.log.warning(e)
273274

274275
def link_extension(self, name, serverapp):
275276
linked = self._linked_extensions.get(name, False)
276-
extension = self.enabled_extensions[name]
277-
if not linked:
277+
extension = self.extensions[name]
278+
if not linked and extension.enabled:
278279
try:
279280
extension.link_all_points(serverapp)
280281
self.log.info("{name} | extension was successfully linked.".format(name=name))
281282
except Exception as e:
282283
self.log.warning(e)
283284

284285
def load_extension(self, name, serverapp):
285-
extension = self.enabled_extensions.get(name)
286-
try:
287-
extension.load_all_points(serverapp)
288-
self.log.info("{name} | extension was successfully loaded.".format(name=name))
289-
except Exception as e:
290-
self.log.warning(e)
286+
extension = self.extensions.get(name)
287+
if extension.enabled:
288+
try:
289+
extension.load_all_points(serverapp)
290+
self.log.info("{name} | extension was successfully loaded.".format(name=name))
291+
except Exception as e:
292+
self.log.warning(e)
291293

292294
def link_all_extensions(self, serverapp):
293295
"""Link all enabled extensions
294296
to an instance of ServerApp
295297
"""
296298
# Sort the extension names to enforce deterministic linking
297299
# order.
298-
for name in sorted(self.enabled_extensions.keys()):
300+
for name in sorted(self.extensions.keys()):
299301
self.link_extension(name, serverapp)
300302

301303
def load_all_extensions(self, serverapp):
@@ -304,6 +306,6 @@ def load_all_extensions(self, serverapp):
304306
"""
305307
# Sort the extension names to enforce deterministic loading
306308
# order.
307-
for name in sorted(self.enabled_extensions.keys()):
309+
for name in sorted(self.extensions.keys()):
308310
self.load_extension(name, serverapp)
309311

0 commit comments

Comments
 (0)