test_paths.py
246 lines
| 8.3 KiB
| text/x-python
|
PythonLexer
Thomas Kluyver
|
r21041 | from contextlib import contextmanager | ||
import errno | ||||
import os | ||||
import shutil | ||||
import sys | ||||
import tempfile | ||||
import warnings | ||||
try: | ||||
reload | ||||
except NameError: # Python 3 | ||||
from imp import reload | ||||
from nose import with_setup | ||||
import nose.tools as nt | ||||
import IPython | ||||
from IPython import paths | ||||
from IPython.testing.decorators import skip_win32 | ||||
from IPython.utils.tempdir import TemporaryDirectory | ||||
env = os.environ | ||||
TMP_TEST_DIR = tempfile.mkdtemp() | ||||
HOME_TEST_DIR = os.path.join(TMP_TEST_DIR, "home_test_dir") | ||||
XDG_TEST_DIR = os.path.join(HOME_TEST_DIR, "xdg_test_dir") | ||||
XDG_CACHE_DIR = os.path.join(HOME_TEST_DIR, "xdg_cache_dir") | ||||
IP_TEST_DIR = os.path.join(HOME_TEST_DIR,'.ipython') | ||||
def setup(): | ||||
"""Setup testenvironment for the module: | ||||
- Adds dummy home dir tree | ||||
""" | ||||
# Do not mask exceptions here. In particular, catching WindowsError is a | ||||
# problem because that exception is only defined on Windows... | ||||
os.makedirs(IP_TEST_DIR) | ||||
os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython')) | ||||
os.makedirs(os.path.join(XDG_CACHE_DIR, 'ipython')) | ||||
def teardown(): | ||||
"""Teardown testenvironment for the module: | ||||
- Remove dummy home dir tree | ||||
""" | ||||
# Note: we remove the parent test dir, which is the root of all test | ||||
# subdirs we may have created. Use shutil instead of os.removedirs, so | ||||
# that non-empty directories are all recursively removed. | ||||
shutil.rmtree(TMP_TEST_DIR) | ||||
def setup_environment(): | ||||
"""Setup testenvironment for some functions that are tested | ||||
in this module. In particular this functions stores attributes | ||||
and other things that we need to stub in some test functions. | ||||
This needs to be done on a function level and not module level because | ||||
each testfunction needs a pristine environment. | ||||
""" | ||||
global oldstuff, platformstuff | ||||
oldstuff = (env.copy(), os.name, sys.platform, paths.get_home_dir, IPython.__file__, os.getcwd()) | ||||
def teardown_environment(): | ||||
"""Restore things that were remembered by the setup_environment function | ||||
""" | ||||
(oldenv, os.name, sys.platform, paths.get_home_dir, IPython.__file__, old_wd) = oldstuff | ||||
os.chdir(old_wd) | ||||
reload(paths) | ||||
for key in list(env): | ||||
if key not in oldenv: | ||||
del env[key] | ||||
env.update(oldenv) | ||||
if hasattr(sys, 'frozen'): | ||||
del sys.frozen | ||||
# Build decorator that uses the setup_environment/setup_environment | ||||
with_environment = with_setup(setup_environment, teardown_environment) | ||||
@contextmanager | ||||
def patch_get_home_dir(dirpath): | ||||
orig_get_home_dir = paths.get_home_dir | ||||
paths.get_home_dir = lambda : dirpath | ||||
try: | ||||
yield | ||||
finally: | ||||
paths.get_home_dir = orig_get_home_dir | ||||
@with_environment | ||||
def test_get_ipython_dir_1(): | ||||
"""test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions.""" | ||||
env_ipdir = os.path.join("someplace", ".ipython") | ||||
paths._writable_dir = lambda path: True | ||||
env['IPYTHONDIR'] = env_ipdir | ||||
ipdir = paths.get_ipython_dir() | ||||
nt.assert_equal(ipdir, env_ipdir) | ||||
@with_environment | ||||
def test_get_ipython_dir_2(): | ||||
"""test_get_ipython_dir_2, Testcase to see if we can call get_ipython_dir without Exceptions.""" | ||||
with patch_get_home_dir('someplace'): | ||||
paths.get_xdg_dir = lambda : None | ||||
paths._writable_dir = lambda path: True | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
ipdir = paths.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join("someplace", ".ipython")) | ||||
@with_environment | ||||
def test_get_ipython_dir_3(): | ||||
"""test_get_ipython_dir_3, move XDG if defined, and .ipython doesn't exist.""" | ||||
tmphome = TemporaryDirectory() | ||||
try: | ||||
with patch_get_home_dir(tmphome.name): | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | ||||
with warnings.catch_warnings(record=True) as w: | ||||
ipdir = paths.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join(tmphome.name, ".ipython")) | ||||
if sys.platform != 'darwin': | ||||
nt.assert_equal(len(w), 1) | ||||
nt.assert_in('Moving', str(w[0])) | ||||
finally: | ||||
tmphome.cleanup() | ||||
@with_environment | ||||
def test_get_ipython_dir_4(): | ||||
"""test_get_ipython_dir_4, warn if XDG and home both exist.""" | ||||
with patch_get_home_dir(HOME_TEST_DIR): | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | ||||
try: | ||||
os.mkdir(os.path.join(XDG_TEST_DIR, 'ipython')) | ||||
except OSError as e: | ||||
if e.errno != errno.EEXIST: | ||||
raise | ||||
with warnings.catch_warnings(record=True) as w: | ||||
ipdir = paths.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join(HOME_TEST_DIR, ".ipython")) | ||||
if sys.platform != 'darwin': | ||||
nt.assert_equal(len(w), 1) | ||||
nt.assert_in('Ignoring', str(w[0])) | ||||
@with_environment | ||||
def test_get_ipython_dir_5(): | ||||
"""test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist.""" | ||||
with patch_get_home_dir(HOME_TEST_DIR): | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env['XDG_CONFIG_HOME'] = XDG_TEST_DIR | ||||
try: | ||||
os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython')) | ||||
except OSError as e: | ||||
if e.errno != errno.ENOENT: | ||||
raise | ||||
ipdir = paths.get_ipython_dir() | ||||
nt.assert_equal(ipdir, IP_TEST_DIR) | ||||
@with_environment | ||||
def test_get_ipython_dir_6(): | ||||
"""test_get_ipython_dir_6, use home over XDG if defined and neither exist.""" | ||||
xdg = os.path.join(HOME_TEST_DIR, 'somexdg') | ||||
os.mkdir(xdg) | ||||
shutil.rmtree(os.path.join(HOME_TEST_DIR, '.ipython')) | ||||
with patch_get_home_dir(HOME_TEST_DIR): | ||||
orig_get_xdg_dir = paths.get_xdg_dir | ||||
paths.get_xdg_dir = lambda : xdg | ||||
try: | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
with warnings.catch_warnings(record=True) as w: | ||||
ipdir = paths.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join(HOME_TEST_DIR, '.ipython')) | ||||
nt.assert_equal(len(w), 0) | ||||
finally: | ||||
paths.get_xdg_dir = orig_get_xdg_dir | ||||
@with_environment | ||||
def test_get_ipython_dir_7(): | ||||
"""test_get_ipython_dir_7, test home directory expansion on IPYTHONDIR""" | ||||
paths._writable_dir = lambda path: True | ||||
home_dir = os.path.normpath(os.path.expanduser('~')) | ||||
env['IPYTHONDIR'] = os.path.join('~', 'somewhere') | ||||
ipdir = paths.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join(home_dir, 'somewhere')) | ||||
@skip_win32 | ||||
@with_environment | ||||
def test_get_ipython_dir_8(): | ||||
"""test_get_ipython_dir_8, test / home directory""" | ||||
old = paths._writable_dir, paths.get_xdg_dir | ||||
try: | ||||
paths._writable_dir = lambda path: bool(path) | ||||
paths.get_xdg_dir = lambda: None | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env['HOME'] = '/' | ||||
nt.assert_equal(paths.get_ipython_dir(), '/.ipython') | ||||
finally: | ||||
paths._writable_dir, paths.get_xdg_dir = old | ||||
@with_environment | ||||
def test_get_ipython_cache_dir(): | ||||
os.environ["HOME"] = HOME_TEST_DIR | ||||
if os.name == 'posix' and sys.platform != 'darwin': | ||||
# test default | ||||
os.makedirs(os.path.join(HOME_TEST_DIR, ".cache")) | ||||
os.environ.pop("XDG_CACHE_HOME", None) | ||||
ipdir = paths.get_ipython_cache_dir() | ||||
nt.assert_equal(os.path.join(HOME_TEST_DIR, ".cache", "ipython"), | ||||
ipdir) | ||||
nt.assert_true(os.path.isdir(ipdir)) | ||||
# test env override | ||||
os.environ["XDG_CACHE_HOME"] = XDG_CACHE_DIR | ||||
ipdir = paths.get_ipython_cache_dir() | ||||
nt.assert_true(os.path.isdir(ipdir)) | ||||
nt.assert_equal(ipdir, os.path.join(XDG_CACHE_DIR, "ipython")) | ||||
else: | ||||
nt.assert_equal(paths.get_ipython_cache_dir(), | ||||
paths.get_ipython_dir()) | ||||
def test_get_ipython_package_dir(): | ||||
ipdir = paths.get_ipython_package_dir() | ||||
nt.assert_true(os.path.isdir(ipdir)) | ||||
def test_get_ipython_module_path(): | ||||
ipapp_path = paths.get_ipython_module_path('IPython.terminal.ipapp') | ||||
nt.assert_true(os.path.isfile(ipapp_path)) | ||||