diff --git a/jupyter_server/base/handlers.py b/jupyter_server/base/handlers.py index 1dcc282bc..bd4426268 100644 --- a/jupyter_server/base/handlers.py +++ b/jupyter_server/base/handlers.py @@ -1194,11 +1194,7 @@ class ExtensionAppsHandler(JupyterHandler): @allow_unauthenticated def get(self) -> None: self.set_header("Content-Type", "application/json") - self.finish( - json.dumps( - self.serverapp.extension_manager.extension_web_apps() - ) - ) + self.finish(json.dumps(self.serverapp.extension_manager.extension_web_apps())) # ----------------------------------------------------------------------------- diff --git a/jupyter_server/extension/manager.py b/jupyter_server/extension/manager.py index 6eb0d0114..d4bcccfd5 100644 --- a/jupyter_server/extension/manager.py +++ b/jupyter_server/extension/manager.py @@ -3,8 +3,8 @@ from __future__ import annotations import importlib -from itertools import starmap import re +from itertools import starmap from tornado.gen import multi from traitlets import Any, Bool, Dict, HasTraits, Instance, List, Unicode, default, observe @@ -14,8 +14,7 @@ from .config import ExtensionConfigManager from .utils import ExtensionMetadataError, ExtensionModuleNotFound, get_loader, get_metadata - -RE_SLASH = x = re.compile('/+') # match any number of slashes +RE_SLASH = x = re.compile("/+") # match any number of slashes class ExtensionPoint(HasTraits): @@ -306,11 +305,12 @@ def extension_web_apps(self): extensions which provide a default_url (i.e. a web application). """ return { - app.name: RE_SLASH.sub('/', f'{self.serverapp.base_url}/{app.default_url}') + app.name: RE_SLASH.sub("/", f"{self.serverapp.base_url}/{app.default_url}") for extension_apps in self.serverapp.extension_manager.extension_apps.values() # filter out extensions that do not provide a default_url OR # set it to the root endpoint. - for app in extension_apps if getattr(app, 'default_url', '/') != '/' + for app in extension_apps + if getattr(app, "default_url", "/") != "/" } @property diff --git a/tests/extension/mockextensions/app.py b/tests/extension/mockextensions/app.py index a221eb2f5..390a93455 100644 --- a/tests/extension/mockextensions/app.py +++ b/tests/extension/mockextensions/app.py @@ -50,7 +50,7 @@ class MockExtensionApp(ExtensionAppJinjaMixin, ExtensionApp): static_paths = [STATIC_PATH] # type:ignore[assignment] mock_trait = Unicode("mock trait", config=True) loaded = False - default_url = '/mockextension' + default_url = "/mockextension" serverapp_config = {"jpserver_extensions": {"tests.extension.mockextensions.mock1": True}} diff --git a/tests/extension/test_app.py b/tests/extension/test_app.py index e99b30d18..62f03af2c 100644 --- a/tests/extension/test_app.py +++ b/tests/extension/test_app.py @@ -198,10 +198,11 @@ async def test_extension_web_apps(jp_serverapp): # there should be (at least) two extension applications assert set(jp_serverapp.extension_manager.extension_apps) == { - 'tests.extension.mockextensions', 'jupyter_server_terminals' + "tests.extension.mockextensions", + "jupyter_server_terminals", } # but only one extension web application assert jp_serverapp.extension_manager.extension_web_apps == { - 'mockextension': '/a%40b/mockextension' + "mockextension": "/a%40b/mockextension" }