diff --git a/src/jupyter_contrib_nbextensions/application.py b/src/jupyter_contrib_nbextensions/application.py index 1957fb943..b538b6099 100644 --- a/src/jupyter_contrib_nbextensions/application.py +++ b/src/jupyter_contrib_nbextensions/application.py @@ -36,27 +36,35 @@ def _log_format_default(self): '%(message)s') +USER_HELP = 'Do a user install' +SYS_PREFIX_HELP = 'Use the sys.prefix as the prefix' + + class BaseContribNbextensionsInstallApp(BaseContribNbextensionsApp): """Base jupyter_contrib_nbextensions (un)installer app.""" aliases = { 'prefix': 'BaseContribNbextensionsInstallApp.prefix', 'nbextensions': 'BaseContribNbextensionsInstallApp.nbextensions_dir', + 'config-dir': 'BaseContribNbextensionsInstallApp.config_dir' } + flags = { 'debug': JupyterApp.flags['debug'], 'user': ({ - 'BaseContribNbextensionsInstallApp': {'user': True}}, - 'Perform the operation for the current user' + 'BaseContribNbextensionsInstallApp': { + 'user': True, 'sys_prefix': False}}, + USER_HELP ), 'system': ({ 'BaseContribNbextensionsInstallApp': { 'user': False, 'sys_prefix': False}}, - 'Perform the operation system-wide' + 'Do a system-wide install' ), 'sys-prefix': ( - {'BaseContribNbextensionsInstallApp': {'sys_prefix': True}}, - 'Use sys.prefix as the prefix for installing' + {'BaseContribNbextensionsInstallApp': { + 'user': False, 'sys_prefix': True}}, + SYS_PREFIX_HELP ), # below flags apply only to nbextensions, not server extensions 'overwrite': ( @@ -70,9 +78,8 @@ class BaseContribNbextensionsInstallApp(BaseContribNbextensionsApp): ), } - user = Bool(True, config=True, help='Whether to do a user install') - sys_prefix = Bool(False, config=True, - help='Use the sys.prefix as the prefix') + user = Bool(True, config=True, help=USER_HELP) + sys_prefix = Bool(False, config=True, help=SYS_PREFIX_HELP) # settings pertaining to nbextensions installation only overwrite = Bool(False, config=True, @@ -85,7 +92,10 @@ class BaseContribNbextensionsInstallApp(BaseContribNbextensionsApp): nbextensions_dir = Unicode( '', config=True, help='Full path to nbextensions dir ' - '(consider instead using sys_prefix, prefix or user)') + '(consider instead using, system sys_prefix, prefix or user)') + config_dir = Unicode( + '', config=True, + help='Custom jupyter config directory') def parse_command_line(self, argv=None): """ @@ -93,13 +103,28 @@ def parse_command_line(self, argv=None): Since notebook version doesn't do it very well """ - conflicting_flags = set(['--user', '--system', '--sys-prefix']) - - if len(conflicting_flags.intersection(set(argv))) > 1: + + # parse first so the dirs are set + super(BaseContribNbextensionsInstallApp, self).parse_command_line(argv) + + conflicting = [ + ('user', '--user' in argv), + ('system', '--system' in argv), + ('sys-prefix', '--sys-prefix' in argv), + ('prefix', self.prefix), + ('nbextensions', self.nbextensions_dir), + ] + conflicting_set = ['{}={!r}'.format(n, v) for n, v in conflicting if v] + + if len(conflicting_set) > 1: raise ArgumentConflict( - 'cannot specify more than one of user, sys_prefix, or system') - return super(BaseContribNbextensionsInstallApp, - self).parse_command_line(argv) + 'cannot specify more than one of user, system, sys_prefix, prefix, or nbextensions, but found {}', + ', '.join(conflicting_set)) + + # it works with flags, but no idea how to do this for string CLI args with traitlets + if self.prefix or self.nbextensions_dir: + self.user = self.sys_prefix = False + BaseContribNbextensionsInstallApp.flags['s'] = ( BaseContribNbextensionsInstallApp.flags['symlink']) @@ -121,7 +146,7 @@ def start(self): return install( user=self.user, sys_prefix=self.sys_prefix, prefix=self.prefix, nbextensions_dir=self.nbextensions_dir, logger=self.log, - overwrite=self.overwrite, symlink=self.symlink) + overwrite=self.overwrite, symlink=self.symlink, config_dir=self.config_dir) class UninstallContribNbextensionsApp(BaseContribNbextensionsInstallApp): diff --git a/src/jupyter_contrib_nbextensions/install.py b/src/jupyter_contrib_nbextensions/install.py index e21c7b2af..0c12f942c 100644 --- a/src/jupyter_contrib_nbextensions/install.py +++ b/src/jupyter_contrib_nbextensions/install.py @@ -10,6 +10,7 @@ import psutil from jupyter_contrib_core.notebook_compat import nbextensions, serverextensions +from jupyter_core.paths import SYSTEM_CONFIG_PATH from traitlets.config import Config from traitlets.config.manager import BaseJSONConfigManager @@ -47,14 +48,15 @@ def notebook_is_running(): def toggle_install(install, user=False, sys_prefix=False, overwrite=False, symlink=False, prefix=None, nbextensions_dir=None, - logger=None): + logger=None, config_dir=None): """Install or remove all jupyter_contrib_nbextensions.""" if notebook_is_running(): raise NotebookRunningError( 'Cannot configure while the Jupyter notebook server is running') user = False if sys_prefix else user - config_dir = nbextensions._get_config_dir(user=user, sys_prefix=sys_prefix) + if not config_dir: # no “is None”: might be '' due to config + config_dir = nbextensions._get_config_dir(user=user, sys_prefix=sys_prefix) verb = 'Installing' if install else 'Uninstalling' if logger: @@ -66,11 +68,13 @@ def toggle_install(install, user=False, sys_prefix=False, overwrite=False, if install: serverextensions.toggle_serverextension_python( 'jupyter_nbextensions_configurator', - enabled=True, user=user, sys_prefix=sys_prefix, logger=logger) + enabled=True, user=user, sys_prefix=sys_prefix, logger=logger, + config_dir=config_dir) # nbextensions: kwargs = dict(user=user, sys_prefix=sys_prefix, prefix=prefix, - nbextensions_dir=nbextensions_dir, logger=logger) + nbextensions_dir=nbextensions_dir, logger=logger, + config_dir=config_dir) if install: nbextensions.install_nbextension_python( jupyter_contrib_nbextensions.__name__, @@ -126,20 +130,20 @@ def toggle_install(install, user=False, sys_prefix=False, overwrite=False, def install(user=False, sys_prefix=False, prefix=None, nbextensions_dir=None, - logger=None, overwrite=False, symlink=False): + logger=None, overwrite=False, symlink=False, config_dir=None): """Edit jupyter config files to use jupyter_contrib_nbextensions things.""" return toggle_install( True, user=user, sys_prefix=sys_prefix, prefix=prefix, nbextensions_dir=nbextensions_dir, logger=logger, - overwrite=overwrite, symlink=symlink) + overwrite=overwrite, symlink=symlink, config_dir=config_dir) def uninstall(user=False, sys_prefix=False, prefix=None, nbextensions_dir=None, - logger=None): + logger=None, config_dir=None): """Edit jupyter config files to not use jupyter_contrib_nbextensions.""" return toggle_install( False, user=user, sys_prefix=sys_prefix, prefix=prefix, - nbextensions_dir=nbextensions_dir, logger=logger) + nbextensions_dir=nbextensions_dir, logger=logger, config_dir=config_dir) # ----------------------------------------------------------------------------- # Private API