Skip to content

Commit 52e1095

Browse files
vidartfSteven Silvester
authored andcommitted
Ensure extension manager always has a handle to serverapp
So that it can always check the reraise errors flag
1 parent 37a1ecb commit 52e1095

File tree

4 files changed

+26
-22
lines changed

4 files changed

+26
-22
lines changed

jupyter_server/extension/manager.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,8 @@ class ExtensionManager(LoggingConfigurable):
246246

247247
config_manager = Instance(ExtensionConfigManager, allow_none=True)
248248

249+
serverapp = Any() # Use Any to avoid circular import of Instance(ServerApp)
250+
249251
@default("config_manager")
250252
def _load_default_config_manager(self):
251253
config_manager = ExtensionConfigManager()
@@ -327,31 +329,33 @@ def add_extension(self, extension_name, enabled=False):
327329
return True
328330
# Raise a warning if the extension cannot be loaded.
329331
except Exception as e:
332+
if self.serverapp.reraise_server_extension_failures:
333+
raise
330334
self.log.warning(e)
331335
return False
332336

333-
def link_extension(self, name, serverapp):
337+
def link_extension(self, name):
334338
linked = self.linked_extensions.get(name, False)
335339
extension = self.extensions[name]
336340
if not linked and extension.enabled:
337341
try:
338342
# Link extension and store links
339-
extension.link_all_points(serverapp)
343+
extension.link_all_points(self.serverapp)
340344
self.linked_extensions[name] = True
341345
self.log.info("{name} | extension was successfully linked.".format(name=name))
342346
except Exception as e:
343-
if serverapp.reraise_server_extension_failures:
347+
if self.serverapp.reraise_server_extension_failures:
344348
raise
345349
self.log.warning(e)
346350

347-
def load_extension(self, name, serverapp):
351+
def load_extension(self, name):
348352
extension = self.extensions.get(name)
349353

350354
if extension.enabled:
351355
try:
352-
extension.load_all_points(serverapp)
356+
extension.load_all_points(self.serverapp)
353357
except Exception as e:
354-
if serverapp.reraise_server_extension_failures:
358+
if self.serverapp.reraise_server_extension_failures:
355359
raise
356360
self.log.debug("".join(traceback.format_exception(*sys.exc_info())))
357361
self.log.warning(
@@ -369,25 +373,25 @@ async def stop_extension(self, name, apps):
369373
await app.stop_extension()
370374
self.log.debug('{} | extension app "{}" stopped'.format(name, app.name))
371375

372-
def link_all_extensions(self, serverapp):
376+
def link_all_extensions(self):
373377
"""Link all enabled extensions
374378
to an instance of ServerApp
375379
"""
376380
# Sort the extension names to enforce deterministic linking
377381
# order.
378382
for name in self.sorted_extensions.keys():
379-
self.link_extension(name, serverapp)
383+
self.link_extension(name)
380384

381-
def load_all_extensions(self, serverapp):
385+
def load_all_extensions(self):
382386
"""Load all enabled extensions and append them to
383387
the parent ServerApp.
384388
"""
385389
# Sort the extension names to enforce deterministic loading
386390
# order.
387391
for name in self.sorted_extensions.keys():
388-
self.load_extension(name, serverapp)
392+
self.load_extension(name)
389393

390-
async def stop_all_extensions(self, serverapp):
394+
async def stop_all_extensions(self):
391395
"""Call the shutdown hooks in all extensions."""
392396
await multi(
393397
[

jupyter_server/serverapp.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,9 +2076,9 @@ def init_server_extensions(self):
20762076
and load its own config.
20772077
"""
20782078
# Create an instance of the ExtensionManager.
2079-
self.extension_manager = ExtensionManager(log=self.log)
2079+
self.extension_manager = ExtensionManager(log=self.log, serverapp=self)
20802080
self.extension_manager.from_jpserver_extensions(self.jpserver_extensions)
2081-
self.extension_manager.link_all_extensions(self)
2081+
self.extension_manager.link_all_extensions()
20822082

20832083
def load_server_extensions(self):
20842084
"""Load any extensions specified by config.
@@ -2088,7 +2088,7 @@ def load_server_extensions(self):
20882088
20892089
The extension API is experimental, and may change in future releases.
20902090
"""
2091-
self.extension_manager.load_all_extensions(self)
2091+
self.extension_manager.load_all_extensions()
20922092

20932093
def init_mime_overrides(self):
20942094
# On some Windows machines, an application has registered incorrect
@@ -2365,7 +2365,7 @@ async def cleanup_extensions(self):
23652365
"Shutting down %d extension", "Shutting down %d extensions", n_extensions
23662366
)
23672367
self.log.info(extension_msg % n_extensions)
2368-
await run_sync_in_loop(self.extension_manager.stop_all_extensions(self))
2368+
await run_sync_in_loop(self.extension_manager.stop_all_extensions())
23692369

23702370
def running_server_info(self, kernel_count=True):
23712371
"Return the current working directory and the server url information"

jupyter_server/tests/extension/test_app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ def test_stop_extension(jp_serverapp, caplog):
9898
calls = 0
9999

100100
# load extensions (make sure we only have the one extension loaded
101-
jp_serverapp.extension_manager.load_all_extensions(jp_serverapp)
102-
extension_name = "jupyter_server.tests.extension.mockextensions"
101+
jp_serverapp.extension_manager.load_all_extensions()
102+
extension_name = 'jupyter_server.tests.extension.mockextensions'
103103
assert list(jp_serverapp.extension_manager.extension_apps) == [extension_name]
104104

105105
# add a stop_extension method for the extension app

jupyter_server/tests/extension/test_manager.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ def _normalize_path(path_list):
7474
return [p.rstrip(os.path.sep) for p in path_list]
7575

7676

77-
def test_extension_manager_api():
77+
def test_extension_manager_api(jp_serverapp):
7878
jpserver_extensions = {"jupyter_server.tests.extension.mockextensions": True}
79-
manager = ExtensionManager()
79+
manager = ExtensionManager(serverapp=jp_serverapp)
8080
assert manager.config_manager
81-
expected = _normalize_path(os.path.join(jupyter_config_path()[0], "serverconfig"))
81+
expected = _normalize_path(os.path.join(jupyter_config_path()[0], 'serverconfig'))
8282
assert _normalize_path(manager.config_manager.read_config_path[0]) == expected
8383
manager.from_jpserver_extensions(jpserver_extensions)
8484
assert len(manager.extensions) == 1
@@ -87,7 +87,7 @@ def test_extension_manager_api():
8787

8888
def test_extension_manager_linked_extensions(jp_serverapp):
8989
name = "jupyter_server.tests.extension.mockextensions"
90-
manager = ExtensionManager()
90+
manager = ExtensionManager(serverapp=jp_serverapp)
9191
manager.add_extension(name, enabled=True)
92-
manager.link_extension(name, jp_serverapp)
92+
manager.link_extension(name)
9393
assert name in manager.linked_extensions

0 commit comments

Comments
 (0)