test_nbextensions.py
201 lines
| 6.8 KiB
| text/x-python
|
PythonLexer
MinRK
|
r15220 | # coding: utf-8 | ||
"""Test installation of notebook extensions""" | ||||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2014 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import glob | ||||
import os | ||||
import re | ||||
import time | ||||
from contextlib import contextmanager | ||||
from os.path import basename, join as pjoin | ||||
from unittest import TestCase | ||||
import nose.tools as nt | ||||
from IPython.external.decorator import decorator | ||||
import IPython.testing.tools as tt | ||||
import IPython.utils.path | ||||
from IPython.utils import py3compat | ||||
from IPython.utils.tempdir import TemporaryDirectory | ||||
from IPython.html import nbextensions | ||||
from IPython.html.nbextensions import install_nbextension | ||||
#----------------------------------------------------------------------------- | ||||
# Test functions | ||||
#----------------------------------------------------------------------------- | ||||
def touch(file, mtime=None): | ||||
"""ensure a file exists, and set its modification time | ||||
returns the modification time of the file | ||||
""" | ||||
open(file, 'a').close() | ||||
# set explicit mtime | ||||
if mtime: | ||||
atime = os.stat(file).st_atime | ||||
os.utime(file, (atime, mtime)) | ||||
return os.stat(file).st_mtime | ||||
class TestInstallNBExtension(TestCase): | ||||
def tempdir(self): | ||||
td = TemporaryDirectory() | ||||
self.tempdirs.append(td) | ||||
return py3compat.cast_unicode(td.name) | ||||
def setUp(self): | ||||
self.tempdirs = [] | ||||
src = self.src = self.tempdir() | ||||
self.files = files = [ | ||||
pjoin(u'ƒile'), | ||||
pjoin(u'∂ir', u'ƒile1'), | ||||
pjoin(u'∂ir', u'∂ir2', u'ƒile2'), | ||||
] | ||||
for file in files: | ||||
fullpath = os.path.join(self.src, file) | ||||
parent = os.path.dirname(fullpath) | ||||
if not os.path.exists(parent): | ||||
os.makedirs(parent) | ||||
touch(fullpath) | ||||
self.ipdir = self.tempdir() | ||||
self.save_get_ipython_dir = nbextensions.get_ipython_dir | ||||
nbextensions.get_ipython_dir = lambda : self.ipdir | ||||
def tearDown(self): | ||||
for td in self.tempdirs: | ||||
td.cleanup() | ||||
nbextensions.get_ipython_dir = self.save_get_ipython_dir | ||||
def assert_path_exists(self, path): | ||||
if not os.path.exists(path): | ||||
self.fail(u"%s should exist" % path) | ||||
def assert_not_path_exists(self, path): | ||||
if os.path.exists(path): | ||||
self.fail(u"%s should not exist" % path) | ||||
def assert_installed(self, relative_path, ipdir=None): | ||||
self.assert_path_exists( | ||||
pjoin(ipdir or self.ipdir, u'nbextensions', relative_path) | ||||
) | ||||
def assert_not_installed(self, relative_path, ipdir=None): | ||||
self.assert_not_path_exists( | ||||
pjoin(ipdir or self.ipdir, u'nbextensions', relative_path) | ||||
) | ||||
def test_create_ipython_dir(self): | ||||
"""install_nbextension when ipython_dir doesn't exist""" | ||||
with TemporaryDirectory() as td: | ||||
ipdir = pjoin(td, u'ipython') | ||||
install_nbextension(self.src, ipython_dir=ipdir) | ||||
self.assert_path_exists(ipdir) | ||||
for file in self.files: | ||||
self.assert_installed( | ||||
pjoin(basename(self.src), file), | ||||
ipdir | ||||
) | ||||
def test_create_nbextensions(self): | ||||
with TemporaryDirectory() as ipdir: | ||||
install_nbextension(self.src, ipython_dir=ipdir) | ||||
self.assert_installed( | ||||
pjoin(basename(self.src), u'ƒile'), | ||||
ipdir | ||||
) | ||||
def test_single_file(self): | ||||
file = self.files[0] | ||||
install_nbextension(pjoin(self.src, file)) | ||||
self.assert_installed(file) | ||||
def test_single_dir(self): | ||||
d = u'∂ir' | ||||
install_nbextension(pjoin(self.src, d)) | ||||
self.assert_installed(self.files[-1]) | ||||
def test_install_nbextension(self): | ||||
install_nbextension(glob.glob(pjoin(self.src, '*'))) | ||||
for file in self.files: | ||||
self.assert_installed(file) | ||||
def test_overwrite_file(self): | ||||
with TemporaryDirectory() as d: | ||||
fname = u'ƒ.js' | ||||
src = pjoin(d, fname) | ||||
with open(src, 'w') as f: | ||||
f.write('first') | ||||
mtime = touch(src) | ||||
dest = pjoin(self.ipdir, u'nbextensions', fname) | ||||
install_nbextension(src) | ||||
with open(src, 'w') as f: | ||||
f.write('overwrite') | ||||
mtime = touch(src, mtime - 100) | ||||
install_nbextension(src, overwrite=True) | ||||
with open(dest) as f: | ||||
self.assertEqual(f.read(), 'overwrite') | ||||
def test_overwrite_dir(self): | ||||
with TemporaryDirectory() as src: | ||||
# src = py3compat.cast_unicode_py2(src) | ||||
base = basename(src) | ||||
fname = u'ƒ.js' | ||||
touch(pjoin(src, fname)) | ||||
install_nbextension(src) | ||||
self.assert_installed(pjoin(base, fname)) | ||||
os.remove(pjoin(src, fname)) | ||||
fname2 = u'∂.js' | ||||
touch(pjoin(src, fname2)) | ||||
install_nbextension(src, overwrite=True) | ||||
self.assert_installed(pjoin(base, fname2)) | ||||
self.assert_not_installed(pjoin(base, fname)) | ||||
def test_update_file(self): | ||||
with TemporaryDirectory() as d: | ||||
fname = u'ƒ.js' | ||||
src = pjoin(d, fname) | ||||
with open(src, 'w') as f: | ||||
f.write('first') | ||||
mtime = touch(src) | ||||
install_nbextension(src) | ||||
self.assert_installed(fname) | ||||
dest = pjoin(self.ipdir, u'nbextensions', fname) | ||||
old_mtime = os.stat(dest).st_mtime | ||||
with open(src, 'w') as f: | ||||
f.write('overwrite') | ||||
touch(src, mtime + 10) | ||||
install_nbextension(src) | ||||
with open(dest) as f: | ||||
self.assertEqual(f.read(), 'overwrite') | ||||
def test_skip_old_file(self): | ||||
with TemporaryDirectory() as d: | ||||
fname = u'ƒ.js' | ||||
src = pjoin(d, fname) | ||||
mtime = touch(src) | ||||
install_nbextension(src) | ||||
self.assert_installed(fname) | ||||
dest = pjoin(self.ipdir, u'nbextensions', fname) | ||||
old_mtime = os.stat(dest).st_mtime | ||||
mtime = touch(src, mtime - 100) | ||||
install_nbextension(src) | ||||
new_mtime = os.stat(dest).st_mtime | ||||
self.assertEqual(new_mtime, old_mtime) | ||||
def test_quiet(self): | ||||
with tt.AssertNotPrints(re.compile(r'.+')): | ||||
install_nbextension(self.src, verbose=0) | ||||