Squash some bugs and write unit tests

Fix the new tests
This commit is contained in:
Jonathan Frederic 2016-02-26 14:11:54 -08:00
parent a205169002
commit 54dd9c525a
4 changed files with 130 additions and 36 deletions

View File

@ -34,6 +34,10 @@ from traitlets.config.manager import BaseJSONConfigManager, recursive_update
from tornado.log import LogFormatter
# Constants for pretty print extension listing function.
# Window doesn't support unicode characters in the commandline, so use T/F.
GREEN_ENABLED = '\033[92m✔\033[0m' if os.name != 'nt' else 'T'
RED_DISABLED = '\033[91m❌\033[0m' if os.name != 'nt' else 'F'
#------------------------------------------------------------------------------
# Public API
@ -214,9 +218,8 @@ def install_nbextension_python(package, overwrite=False, symlink=False,
def uninstall_nbextension(dest, require, overwrite=False, symlink=False,
user=False, sys_prefix=False, prefix=None, nbextensions_dir=None,
verbose=1, log=None):
def uninstall_nbextension(dest, require, user=False, sys_prefix=False, prefix=None,
nbextensions_dir=None, verbose=1, log=None):
"""Uninstall a Javascript extension of the notebook
Removes staged files and/or directories in the nbextensions directory and
@ -257,8 +260,8 @@ def uninstall_nbextension(dest, require, overwrite=False, symlink=False,
# Look through all of the config sections making sure that the nbextension
# doesn't exist.
config_dir = os.path.join(_get_config_dir(user=self.user, sys_prefix=self.sys_prefix), 'nbconfig')
cm = BaseJSONConfigManager(parent=self, config_dir=config_dir)
config_dir = os.path.join(_get_config_dir(user=user, sys_prefix=sys_prefix), 'nbconfig')
cm = BaseJSONConfigManager(config_dir=config_dir)
for section in ['common', 'notebook', 'tree', 'edit', 'terminal']:
cm.update(section, {"load_extensions": {require: None}})
@ -273,24 +276,30 @@ def uninstall_nbextension_python(package,
dest = nbext['dest']
require = nbext['require']
log(dest, require)
uninstall_nbextension(dest, require, overwrite=overwrite, symlink=symlink,
user=user, sys_prefix=sys_prefix, prefix=prefix, nbextensions_dir=nbextensions_dir,
verbose=verbose, log=log
uninstall_nbextension(dest, require, user=user, sys_prefix=sys_prefix,
prefix=prefix, nbextensions_dir=nbextensions_dir, verbose=verbose,
log=log
)
def enable_nbextension_python(package, user=False, sys_prefix=False, log=None):
"""Enable an nbextension associated with a Python package."""
config_dir = os.path.join(_get_config_dir(user=self.user, sys_prefix=self.sys_prefix), 'nbconfig')
cm = BaseJSONConfigManager(parent=self, config_dir=config_dir)
cm.update(nbext['section'], {"load_extensions": {nbext['require']: True}})
m, nbexts = _get_nbextension_metadata(package)
base_path = os.path.split(m.__file__)[0]
for nbext in nbexts:
config_dir = os.path.join(_get_config_dir(user=user, sys_prefix=sys_prefix), 'nbconfig')
cm = BaseJSONConfigManager(config_dir=config_dir)
cm.update(nbext['section'], {"load_extensions": {nbext['require']: True}})
def disable_nbextension_python(package, user=False, sys_prefix=False):
"""Disable an nbextension associated with a Python package."""
config_dir = os.path.join(_get_config_dir(user=self.user, sys_prefix=self.sys_prefix), 'nbconfig')
cm = BaseJSONConfigManager(parent=self, config_dir=config_dir)
cm.update(nbext['section'], {"load_extensions": {nbext['require']: False}})
m, nbexts = _get_nbextension_metadata(package)
base_path = os.path.split(m.__file__)[0]
for nbext in nbexts:
config_dir = os.path.join(_get_config_dir(user=user, sys_prefix=sys_prefix), 'nbconfig')
cm = BaseJSONConfigManager(config_dir=config_dir)
cm.update(nbext['section'], {"load_extensions": {nbext['require']: False}})
#----------------------------------------------------------------------
@ -347,17 +356,13 @@ flags = {
}}, "Use sys.prefix as the prefix for installing nbextensions"
),
"py" : ({
"InstallNBExtensionApp" : {
"python" : True,
}}, "Install from a Python package (alias for --python)"
),
"python" : ({
"InstallNBExtensionApp" : {
"python" : True,
}}, "Install from a Python package"
),
}
flags['s'] = flags['symlink']
flags['python'] = flags['py']
aliases = {
"prefix" : "InstallNBExtensionApp.prefix",
@ -428,6 +433,35 @@ class InstallNBExtensionApp(BaseNBExtensionApp):
self.log.info(str(e), file=sys.stderr)
sys.exit(1)
_uninstall_flags = {
"debug" : ({
"UninstallNBExtensionApp" : {
"verbose" : 2,
}}, "Extra output"
),
"quiet" : ({
"UninstallNBExtensionApp" : {
"verbose" : 0,
}}, "Minimal output"
),
"user" : ({
"UninstallNBExtensionApp" : {
"user" : True,
}}, "Install to the user's Jupyter directory"
),
"sys-prefix" : ({
"UninstallNBExtensionApp" : {
"sys_prefix" : True,
}}, "Use sys.prefix as the prefix for installing nbextensions"
),
"py" : ({
"UninstallNBExtensionApp" : {
"python" : True,
}}, "Install from a Python package (alias for --python)"
),
}
_uninstall_flags['python'] = _uninstall_flags['py']
class UninstallNBExtensionApp(BaseNBExtensionApp):
"""Entry point for uninstalling notebook extensions"""
version = __version__
@ -445,8 +479,8 @@ class UninstallNBExtensionApp(BaseNBExtensionApp):
jupyter nbextension uninstall dest/dir dest/dir/extensionjs
jupyter nbextension uninstall --py extensionPyPackage
"""
aliases = aliases
flags = flags
aliases = {'section': 'ToggleNBExtensionApp.section'}
flags = _uninstall_flags
user = Bool(False, config=True, help="Whether to do a user install")
sys_prefix = Bool(False, config=True, help="Use the sys.prefix as the prefix")
@ -464,11 +498,11 @@ class UninstallNBExtensionApp(BaseNBExtensionApp):
def uninstall_extensions(self):
kwargs = {
verbose: self.verbose,
user: self.user,
sys_prefix: self.sys_prefix,
prefix: self.prefix,
nbextensions_dir: self.nbextensions_dir,
'verbose': self.verbose,
'user': self.user,
'sys_prefix': self.sys_prefix,
'prefix': self.prefix,
'nbextensions_dir': self.nbextensions_dir,
}
if self.python:
@ -517,6 +551,7 @@ _toggle_flags = {
}}, "Install from a Python package"
),
}
_toggle_flags['python'] = _toggle_flags['py']
class ToggleNBExtensionApp(BaseNBExtensionApp):
@ -591,9 +626,6 @@ class ListNBExtensionsApp(BaseNBExtensionApp):
description = "List all nbextensions known by the configuration system"
def list_nbextensions(self):
GREEN_CHECK = '\033[92m✔\033[0m'
RED_EX = '\033[91m❌\033[0m'
config_dirs = [os.path.join(p, 'nbconfig') for p in jupyter_config_path()]
for config_dir in config_dirs:
self.log.info('config dir: {}'.format(config_dir))
@ -605,7 +637,7 @@ class ListNBExtensionsApp(BaseNBExtensionApp):
load_extensions = data['load_extensions']
for x in load_extensions:
self.log.info(' {1} {0}'.format(x, GREEN_CHECK if load_extensions[x] else RED_EX))
self.log.info(' {1} {0}'.format(x, GREEN_ENABLED if load_extensions[x] else RED_DISABLED))
def start(self):
self.list_nbextensions()

View File

@ -13,7 +13,7 @@ from jupyter_core.paths import jupyter_config_path
from ._version import __version__
from .nbextensions import (
BaseNBExtensionApp, ToggleNBExtensionApp, _get_config_dir, _read_config_data,
_write_config_data
_write_config_data, GREEN_ENABLED, RED_DISABLED
)
from traitlets.config.manager import BaseJSONConfigManager, recursive_update
@ -131,9 +131,6 @@ 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))
@ -144,7 +141,7 @@ class ListServerExtensionsApp(BaseNBExtensionApp):
.setdefault("nbserver_extensions", {})
)
for x in server_extensions:
self.log.info(' {1} {0}'.format(x, GREEN_CHECK if server_extensions[x] else RED_EX))
self.log.info(' {1} {0}'.format(x, GREEN_ENABLED if server_extensions[x] else RED_DISABLED))
def start(self):
self.list_server_extensions()

View File

@ -0,0 +1 @@
console.log('z');

View File

@ -23,8 +23,12 @@ import ipython_genutils.testing.decorators as dec
from ipython_genutils import py3compat
from ipython_genutils.tempdir import TemporaryDirectory
from notebook import nbextensions
from notebook.nbextensions import install_nbextension, check_nbextension
from notebook.nbextensions import (install_nbextension, check_nbextension,
install_nbextension_python, uninstall_nbextension_python,
enable_nbextension_python, disable_nbextension_python, _get_config_dir
)
from traitlets.config.manager import BaseJSONConfigManager
def touch(file, mtime=None):
"""ensure a file exists, and set its modification time
@ -343,3 +347,63 @@ class TestInstallNBExtension(TestCase):
with self.assertRaises(ValueError):
install_nbextension(zsrc, destination='foo')
def _inject_mock_extension(self, section='notebook'):
outer_file = __file__
class mock():
__file__ = outer_file
@staticmethod
def _jupyter_nbextension_paths():
return [{
'section': section,
'src': 'mockextension',
'dest': '_mockdestination',
'require': '_mockdestination/index'
}]
import sys
sys.modules['mockextension'] = mock
def test_nbextensionpy_files(self):
self._inject_mock_extension()
install_nbextension_python('mockextension', verbose=2)
assert check_nbextension('_mockdestination/index.js')
assert check_nbextension(['_mockdestination/index.js'])
def test_nbextensionpy_user_files(self):
self._inject_mock_extension()
install_nbextension_python('mockextension', verbose=2, user=True)
assert check_nbextension('_mockdestination/index.js', user=True)
assert check_nbextension(['_mockdestination/index.js'], user=True)
def test_nbextensionpy_uninstall_files(self):
self._inject_mock_extension()
install_nbextension_python('mockextension', verbose=2, user=True)
uninstall_nbextension_python('mockextension', verbose=2, user=True)
assert not check_nbextension('_mockdestination/index.js')
assert not check_nbextension(['_mockdestination/index.js'])
def test_nbextensionpy_enable(self):
self._inject_mock_extension('notebook')
install_nbextension_python('mockextension')
enable_nbextension_python('mockextension', user=True)
config_dir = os.path.join(_get_config_dir(user=True), 'nbconfig')
cm = BaseJSONConfigManager(config_dir=config_dir)
enabled = cm.get('notebook').get('load_extensions', {}).get('_mockdestination/index', False)
assert enabled
def test_nbextensionpy_disable(self):
self._inject_mock_extension('notebook')
install_nbextension_python('mockextension')
enable_nbextension_python('mockextension', user=True)
disable_nbextension_python('mockextension', user=True)
config_dir = os.path.join(_get_config_dir(user=True), 'nbconfig')
cm = BaseJSONConfigManager(config_dir=config_dir)
enabled = cm.get('notebook').get('load_extensions', {}).get('_mockdestination/index', False)
assert not enabled