diff --git a/notebook/nbextensions.py b/notebook/nbextensions.py index 673be6dcc..d9ed95933 100644 --- a/notebook/nbextensions.py +++ b/notebook/nbextensions.py @@ -604,7 +604,8 @@ class ListNBExtensionsApp(BaseNBExtensionApp): self.log.info(' {} section'.format(section)) load_extensions = data['load_extensions'] - [self.log.info(' {1} {0}'.format(x, GREEN_CHECK if load_extensions[x] else RED_EX)) for x in load_extensions] + for x in load_extensions: + self.log.info(' {1} {0}'.format(x, GREEN_CHECK if load_extensions[x] else RED_EX)) def start(self): self.list_nbextensions() diff --git a/notebook/notebookapp.py b/notebook/notebookapp.py index f4441c31e..3a2d62caa 100644 --- a/notebook/notebookapp.py +++ b/notebook/notebookapp.py @@ -823,9 +823,18 @@ class NotebookApp(JupyterApp): self.config.FileContentsManager.root_dir = new self.config.MappingKernelManager.root_dir = new + # TODO: Remove me in notebook 5.0 server_extensions = List(Unicode(), config=True, - help=("Python modules to load as notebook server extensions. " - "This is an experimental API, and may change in future releases.") + help=("DEPRECATED use the nbserver_extensions dict instead") + ) + def _server_extensions_changed(self, name, old, new): + self.log.warning("server_extensions is deprecated, use nbserver_extensions") + self.server_extensions = new + + nbserver_extensions = Dict({}, config=True, + help=("Dict of Python modules to load as notebook server extensions." + "Entry values can be used to enable and disable the loading of" + "the extensions.") ) reraise_server_extension_failures = Bool( @@ -1064,17 +1073,26 @@ class NotebookApp(JupyterApp): The extension API is experimental, and may change in future releases. """ + + # TODO: Remove me in notebook 5.0 for modulename in self.server_extensions: - try: - mod = importlib.import_module(modulename) - func = getattr(mod, 'load_jupyter_server_extension', None) - if func is not None: - func(self) - except Exception: - if self.reraise_server_extension_failures: - raise - self.log.warning("Error loading server extension %s", modulename, - exc_info=True) + # Don't override disable state of the extension if it already exist + # in the new traitlet + if not modulename in self.nbserver_extensions: + self.nbserver_extensions[modulename] = True + + for modulename in self.nbserver_extensions: + if self.nbserver_extensions[modulename]: + try: + mod = importlib.import_module(modulename) + func = getattr(mod, 'load_jupyter_server_extension', None) + if func is not None: + func(self) + except Exception: + if self.reraise_server_extension_failures: + raise + self.log.warning("Error loading server extension %s", modulename, + exc_info=True) @catch_config_error def initialize(self, argv=None): diff --git a/notebook/serverextensions.py b/notebook/serverextensions.py index 482897264..11cfd3d76 100644 --- a/notebook/serverextensions.py +++ b/notebook/serverextensions.py @@ -76,18 +76,18 @@ class ToggleServerExtensionApp(ToggleNBExtensionApp): cfg = cm.get("jupyter_notebook_config") server_extensions = ( cfg.setdefault("NotebookApp", {}) - .setdefault("server_extensions", []) + .setdefault("nbserver_extensions", {}) ) if self._toggle_value: - if require not in server_extensions: - server_extensions.append(require) + server_extensions[require] = True + else: + if self._toggle_value is None: + if require not in server_extensions: + print("server extension not installed") + else: + server_extensions[require] = not server_extensions[require] else: - print("server extension already enabled") - elif self._toggle_value is None: - if require not in server_extensions: - print("server extension already disabled") - else: - server_extensions.remove(require) + server_extensions[require] = False cm.update("jupyter_notebook_config", cfg) def toggle_server_extension_python(self, package): @@ -121,7 +121,7 @@ class DisableServerExtensionApp(ToggleServerExtensionApp): name = "jupyter serverextension disable" description = "Disable an serverextension using frontend configuration files." - _toggle_value = None + _toggle_value = False class ListServerExtensionsApp(BaseNBExtensionApp): @@ -131,6 +131,9 @@ class ListServerExtensionsApp(BaseNBExtensionApp): description = "List all server extensions known by the configuration system" def list_server_extensions(self): + GREEN_CHECK = '\033[92m✔️\033[0m' + RED_EX = '\033[91m❌\033[0m' + config_dirs = jupyter_config_path() for config_dir in config_dirs: self.log.info('config dir: {}'.format(config_dir)) @@ -138,10 +141,10 @@ class ListServerExtensionsApp(BaseNBExtensionApp): data = cm.get("jupyter_notebook_config") server_extensions = ( data.setdefault("NotebookApp", {}) - .setdefault("server_extensions", []) + .setdefault("nbserver_extensions", {}) ) - if server_extensions: - self.log.info(' {}'.format(server_extensions)) + for x in server_extensions: + self.log.info(' {1} {0}'.format(x, GREEN_CHECK if server_extensions[x] else RED_EX)) def start(self): self.list_server_extensions()