Skip to content

Commit

Permalink
extension stop hooks extension_apps property
Browse files Browse the repository at this point in the history
  • Loading branch information
oliver-sanders committed Jul 7, 2021
1 parent 42e3f02 commit 0eeeff8
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 25 deletions.
5 changes: 3 additions & 2 deletions jupyter_server/extension/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -416,11 +416,12 @@ def start(self):
# Start the server.
self.serverapp.start()

async def stop_extension(self):
"""Cleanup any resources managed by this extension."""

def stop(self):
"""Stop the underlying Jupyter server.
"""
if hasattr(self, 'stop_extension'):
self.stop_extension()
self.serverapp.stop()
self.serverapp.clear_instance()

Expand Down
35 changes: 17 additions & 18 deletions jupyter_server/extension/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,19 +294,26 @@ def sorted_extensions(self):
"""
)

extension_apps = Dict(
help="""
Dictionary with extension names as keys
and sets of ExtensionApp objects as values.
@property
def extension_apps(self):
"""Return mapping of extension names and sets of ExtensionApp objects.
"""
)
return {
name: {
point.app
for point in extension.extension_points.values()
if point.app
}
for name, extension in self.extensions.items()
}

@property
def extension_points(self):
extensions = self.extensions
"""Return mapping of extension point names and ExtensionPoint objects.
"""
return {
name: point
for value in extensions.values()
for value in self.extensions.values()
for name, point in value.extension_points.items()
}

Expand Down Expand Up @@ -360,22 +367,14 @@ def load_extension(self, name, serverapp):
self.log.debug("".join(traceback.format_exception(*sys.exc_info())))
self.log.warning("{name} | extension failed loading with message: {error}".format(name=name,error=str(e)))
else:
self.extension_apps.setdefault(name, set()).update((
point
for point in points
if point is not None
))
self.log.info("{name} | extension was successfully loaded.".format(name=name))


async def stop_extension(self, name, apps):
"""Call the shutdown hooks in the specified apps."""
for app in apps:
if hasattr(app, 'stop_extension'):
await app.stop_extension()
if name in self.extension_apps:
# might not be the case in tests
del self.extension_apps[name]
self.log.debug('{} | extension app "{}" stopping'.format(name, app.name))
await app.stop_extension()
self.log.debug('{} | extension app "{}" stopped'.format(name, app.name))

def link_all_extensions(self, serverapp):
"""Link all enabled extensions
Expand Down
10 changes: 5 additions & 5 deletions jupyter_server/tests/extension/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,9 @@ def test_stop_extension(jp_serverapp, caplog):

# load extensions (make sure we only have the one extension loaded
jp_serverapp.extension_manager.load_all_extensions(jp_serverapp)
extension_name = 'jupyter_server.tests.extension.mockextensions'
assert list(jp_serverapp.extension_manager.extension_apps) == [
'jupyter_server.tests.extension.mockextensions'
extension_name
]

# add a stop_extension method for the extension app
Expand All @@ -133,11 +134,10 @@ async def _stop(*args):
msg
for *_, msg in caplog.record_tuples
] == [
'Shutting down 1 extension'
'Shutting down 1 extension',
'{} | extension app "mockextension" stopping'.format(extension_name),
'{} | extension app "mockextension" stopped'.format(extension_name),
]

# check the extension_apps dictionary is updated
assert list(jp_serverapp.extension_manager.extension_apps) == []

# check the shutdown method was called once
assert calls == 1

0 comments on commit 0eeeff8

Please sign in to comment.