test_path.py
676 lines
| 22.8 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r1617 | # encoding: utf-8 | ||
Brian Granger
|
r2498 | """Tests for IPython.utils.path.py""" | ||
Brian Granger
|
r1617 | |||
#----------------------------------------------------------------------------- | ||||
Matthias BUSSONNIER
|
r5390 | # Copyright (C) 2008-2011 The IPython Development Team | ||
Brian Granger
|
r1617 | # | ||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
Robert Kern
|
r4688 | from __future__ import with_statement | ||
Thomas Kluyver
|
r13407 | import errno | ||
Fernando Perez
|
r1843 | import os | ||
import shutil | ||||
import sys | ||||
import tempfile | ||||
Thomas Kluyver
|
r13407 | import warnings | ||
David Wolever
|
r11653 | from contextlib import contextmanager | ||
Jorgen Stenarson
|
r1751 | |||
Jorgen Stenarson
|
r1801 | from os.path import join, abspath, split | ||
Fernando Perez
|
r1843 | |||
Jorgen Stenarson
|
r1802 | import nose.tools as nt | ||
Brian Granger
|
r1617 | |||
Fernando Perez
|
r1843 | from nose import with_setup | ||
Brian Granger
|
r1617 | |||
Fernando Perez
|
r1843 | import IPython | ||
Fernando Perez
|
r2436 | from IPython.testing import decorators as dec | ||
Thomas Kluyver
|
r12166 | from IPython.testing.decorators import (skip_if_not_win32, skip_win32, | ||
onlyif_unicode_paths,) | ||||
Thomas Kluyver
|
r4901 | from IPython.testing.tools import make_tempfile, AssertPrints | ||
Thomas Kluyver
|
r11127 | from IPython.utils import path | ||
Thomas Kluyver
|
r4764 | from IPython.utils import py3compat | ||
Takafumi Arakaki
|
r8014 | from IPython.utils.tempdir import TemporaryDirectory | ||
Fernando Perez
|
r1843 | |||
# Platform-dependent imports | ||||
Jorgen Stenarson
|
r1750 | try: | ||
Thomas Kluyver
|
r13354 | import winreg as wreg # Py 3 | ||
Jorgen Stenarson
|
r1750 | except ImportError: | ||
Thomas Kluyver
|
r13354 | try: | ||
import _winreg as wreg # Py 2 | ||||
except ImportError: | ||||
#Fake _winreg module on none windows platforms | ||||
import types | ||||
wr_name = "winreg" if py3compat.PY3 else "_winreg" | ||||
sys.modules[wr_name] = types.ModuleType(wr_name) | ||||
try: | ||||
import winreg as wreg | ||||
except ImportError: | ||||
import _winreg as wreg | ||||
#Add entries that needs to be stubbed by the testing code | ||||
(wreg.OpenKey, wreg.QueryValueEx,) = (None, None) | ||||
Bernardo B. Marques
|
r4872 | |||
Thomas Kluyver
|
r4764 | try: | ||
reload | ||||
except NameError: # Python 3 | ||||
from imp import reload | ||||
Jorgen Stenarson
|
r1750 | |||
Fernando Perez
|
r1843 | #----------------------------------------------------------------------------- | ||
# Globals | ||||
#----------------------------------------------------------------------------- | ||||
env = os.environ | ||||
TEST_FILE_PATH = split(abspath(__file__))[0] | ||||
TMP_TEST_DIR = tempfile.mkdtemp() | ||||
HOME_TEST_DIR = join(TMP_TEST_DIR, "home_test_dir") | ||||
MinRK
|
r3347 | XDG_TEST_DIR = join(HOME_TEST_DIR, "xdg_test_dir") | ||
Julian Taylor
|
r10230 | XDG_CACHE_DIR = join(HOME_TEST_DIR, "xdg_cache_dir") | ||
Fernando Perez
|
r2449 | IP_TEST_DIR = join(HOME_TEST_DIR,'.ipython') | ||
Jorgen Stenarson
|
r1804 | # | ||
# Setup/teardown functions/decorators | ||||
Jorgen Stenarson
|
r1803 | # | ||
def setup(): | ||||
Jorgen Stenarson
|
r1805 | """Setup testenvironment for the module: | ||
Bernardo B. Marques
|
r4872 | |||
Jorgen Stenarson
|
r1805 | - Adds dummy home dir tree | ||
""" | ||||
Fernando Perez
|
r1843 | # 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) | ||||
MinRK
|
r3347 | os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython')) | ||
Julian Taylor
|
r10230 | os.makedirs(os.path.join(XDG_CACHE_DIR, 'ipython')) | ||
Jorgen Stenarson
|
r1803 | |||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1803 | def teardown(): | ||
Jorgen Stenarson
|
r1805 | """Teardown testenvironment for the module: | ||
Bernardo B. Marques
|
r4872 | |||
Jorgen Stenarson
|
r1805 | - Remove dummy home dir tree | ||
""" | ||||
Fernando Perez
|
r1843 | # 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) | ||||
Jorgen Stenarson
|
r1803 | |||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1750 | def setup_environment(): | ||
Bernardo B. Marques
|
r4872 | """Setup testenvironment for some functions that are tested | ||
Jorgen Stenarson
|
r1805 | in this module. In particular this functions stores attributes | ||
and other things that we need to stub in some test functions. | ||||
Bernardo B. Marques
|
r4872 | This needs to be done on a function level and not module level because | ||
Jorgen Stenarson
|
r1805 | each testfunction needs a pristine environment. | ||
""" | ||||
Jorgen Stenarson
|
r1750 | global oldstuff, platformstuff | ||
MinRK
|
r7086 | oldstuff = (env.copy(), os.name, sys.platform, path.get_home_dir, IPython.__file__, os.getcwd()) | ||
Jorgen Stenarson
|
r1750 | |||
Jorgen Stenarson
|
r1796 | if os.name == 'nt': | ||
platformstuff = (wreg.OpenKey, wreg.QueryValueEx,) | ||||
Jorgen Stenarson
|
r1750 | |||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1750 | def teardown_environment(): | ||
MinRK
|
r11500 | """Restore things that were remembered by the setup_environment function | ||
Jorgen Stenarson
|
r1805 | """ | ||
MinRK
|
r7086 | (oldenv, os.name, sys.platform, path.get_home_dir, IPython.__file__, old_wd) = oldstuff | ||
Robert Kern
|
r4688 | os.chdir(old_wd) | ||
MinRK
|
r4475 | reload(path) | ||
Bernardo B. Marques
|
r4872 | |||
Thomas Kluyver
|
r13373 | for key in list(env): | ||
Jorgen Stenarson
|
r1750 | if key not in oldenv: | ||
del env[key] | ||||
env.update(oldenv) | ||||
if hasattr(sys, 'frozen'): | ||||
del sys.frozen | ||||
Jorgen Stenarson
|
r1796 | if os.name == 'nt': | ||
(wreg.OpenKey, wreg.QueryValueEx,) = platformstuff | ||||
Jorgen Stenarson
|
r1750 | |||
Jorgen Stenarson
|
r1805 | # Build decorator that uses the setup_environment/setup_environment | ||
Fernando Perez
|
r2436 | with_environment = with_setup(setup_environment, teardown_environment) | ||
Jorgen Stenarson
|
r1750 | |||
Thomas Kluyver
|
r13407 | @contextmanager | ||
def patch_get_home_dir(dirpath): | ||||
orig_get_home_dir = path.get_home_dir | ||||
path.get_home_dir = lambda : dirpath | ||||
try: | ||||
yield | ||||
finally: | ||||
path.get_home_dir = orig_get_home_dir | ||||
Jorgen Stenarson
|
r1820 | @skip_if_not_win32 | ||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1745 | def test_get_home_dir_1(): | ||
Jorgen Stenarson
|
r1746 | """Testcase for py2exe logic, un-compressed lib | ||
""" | ||||
MinRK
|
r11502 | unfrozen = path.get_home_dir() | ||
Jorgen Stenarson
|
r1796 | sys.frozen = True | ||
Bernardo B. Marques
|
r4872 | |||
Jorgen Stenarson
|
r1746 | #fake filename for IPython.__init__ | ||
Jorgen Stenarson
|
r1855 | IPython.__file__ = abspath(join(HOME_TEST_DIR, "Lib/IPython/__init__.py")) | ||
Bernardo B. Marques
|
r4872 | |||
bgranger
|
r2513 | home_dir = path.get_home_dir() | ||
MinRK
|
r11502 | nt.assert_equal(home_dir, unfrozen) | ||
Brian Granger
|
r2505 | |||
Jorgen Stenarson
|
r1812 | @skip_if_not_win32 | ||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_2(): | ||
Jorgen Stenarson
|
r1746 | """Testcase for py2exe logic, compressed lib | ||
""" | ||||
MinRK
|
r11502 | unfrozen = path.get_home_dir() | ||
Jorgen Stenarson
|
r1801 | sys.frozen = True | ||
Jorgen Stenarson
|
r1746 | #fake filename for IPython.__init__ | ||
Jorgen Stenarson
|
r1855 | IPython.__file__ = abspath(join(HOME_TEST_DIR, "Library.zip/IPython/__init__.py")).lower() | ||
Bernardo B. Marques
|
r4872 | |||
MinRK
|
r5384 | home_dir = path.get_home_dir(True) | ||
MinRK
|
r11502 | nt.assert_equal(home_dir, unfrozen) | ||
Jorgen Stenarson
|
r1746 | |||
Brian Granger
|
r2505 | |||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_3(): | ||
MinRK
|
r5383 | """get_home_dir() uses $HOME if set""" | ||
Fernando Perez
|
r1843 | env["HOME"] = HOME_TEST_DIR | ||
MinRK
|
r5384 | home_dir = path.get_home_dir(True) | ||
MinRK
|
r6123 | # get_home_dir expands symlinks | ||
nt.assert_equal(home_dir, os.path.realpath(env["HOME"])) | ||||
Jorgen Stenarson
|
r1745 | |||
Brian Granger
|
r2505 | |||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_4(): | ||
MinRK
|
r5383 | """get_home_dir() still works if $HOME is not set""" | ||
Bernardo B. Marques
|
r4872 | |||
Jorgen Stenarson
|
r1812 | if 'HOME' in env: del env['HOME'] | ||
MinRK
|
r7669 | # this should still succeed, but we don't care what the answer is | ||
home = path.get_home_dir(False) | ||||
Brian Granger
|
r2505 | |||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_home_dir_5(): | ||
MinRK
|
r5383 | """raise HomeDirError if $HOME is specified, but not a writable dir""" | ||
env['HOME'] = abspath(HOME_TEST_DIR+'garbage') | ||||
MinRK
|
r5385 | # set os.name = posix, to prevent My Documents fallback on Windows | ||
os.name = 'posix' | ||||
MinRK
|
r5384 | nt.assert_raises(path.HomeDirError, path.get_home_dir, True) | ||
Fernando Perez
|
r3373 | |||
Bernardo B. Marques
|
r4872 | |||
bgranger
|
r2513 | # Should we stub wreg fully so we can run the test on all platforms? | ||
@skip_if_not_win32 | ||||
@with_environment | ||||
def test_get_home_dir_8(): | ||||
"""Using registry hack for 'My Documents', os=='nt' | ||||
Bernardo B. Marques
|
r4872 | |||
bgranger
|
r2513 | HOMESHARE, HOMEDRIVE, HOMEPATH, USERPROFILE and others are missing. | ||
Jorgen Stenarson
|
r1746 | """ | ||
Jorgen Stenarson
|
r1796 | os.name = 'nt' | ||
Fernando Perez
|
r2447 | # Remove from stub environment all keys that may be set | ||
for key in ['HOME', 'HOMESHARE', 'HOMEDRIVE', 'HOMEPATH', 'USERPROFILE']: | ||||
env.pop(key, None) | ||||
Jorgen Stenarson
|
r1746 | |||
#Stub windows registry functions | ||||
Jorgen Stenarson
|
r1796 | def OpenKey(x, y): | ||
Jorgen Stenarson
|
r1746 | class key: | ||
def Close(self): | ||||
pass | ||||
return key() | ||||
Jorgen Stenarson
|
r1796 | def QueryValueEx(x, y): | ||
Fernando Perez
|
r1843 | return [abspath(HOME_TEST_DIR)] | ||
Jorgen Stenarson
|
r1746 | |||
Jorgen Stenarson
|
r1796 | wreg.OpenKey = OpenKey | ||
wreg.QueryValueEx = QueryValueEx | ||||
Jorgen Stenarson
|
r1746 | |||
Brian Granger
|
r2505 | home_dir = path.get_home_dir() | ||
Fernando Perez
|
r1843 | nt.assert_equal(home_dir, abspath(HOME_TEST_DIR)) | ||
Jorgen Stenarson
|
r1745 | |||
Jorgen Stenarson
|
r1750 | |||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1749 | def test_get_ipython_dir_1(): | ||
Jorgen Stenarson
|
r1805 | """test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions.""" | ||
Min RK
|
r4105 | env_ipdir = os.path.join("someplace", ".ipython") | ||
MinRK
|
r4475 | path._writable_dir = lambda path: True | ||
Bradley M. Froehle
|
r6700 | env['IPYTHONDIR'] = env_ipdir | ||
Brian Granger
|
r2505 | ipdir = path.get_ipython_dir() | ||
Min RK
|
r4105 | nt.assert_equal(ipdir, env_ipdir) | ||
Jorgen Stenarson
|
r1749 | |||
Fernando Perez
|
r2436 | @with_environment | ||
Jorgen Stenarson
|
r1800 | def test_get_ipython_dir_2(): | ||
Jorgen Stenarson
|
r1805 | """test_get_ipython_dir_2, Testcase to see if we can call get_ipython_dir without Exceptions.""" | ||
Thomas Kluyver
|
r13407 | with patch_get_home_dir('someplace'): | ||
path.get_xdg_dir = lambda : None | ||||
path._writable_dir = lambda path: True | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
ipdir = path.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join("someplace", ".ipython")) | ||||
Jorgen Stenarson
|
r1749 | |||
MinRK
|
r3347 | @with_environment | ||
def test_get_ipython_dir_3(): | ||||
Thomas Kluyver
|
r13407 | """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 = path.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() | ||||
MinRK
|
r3347 | |||
@with_environment | ||||
def test_get_ipython_dir_4(): | ||||
Thomas Kluyver
|
r13407 | """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 = path.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])) | ||||
MinRK
|
r3347 | |||
@with_environment | ||||
def test_get_ipython_dir_5(): | ||||
"""test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist.""" | ||||
Thomas Kluyver
|
r13407 | 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 = path.get_ipython_dir() | ||||
nt.assert_equal(ipdir, IP_TEST_DIR) | ||||
MinRK
|
r3347 | |||
@with_environment | ||||
def test_get_ipython_dir_6(): | ||||
Thomas Kluyver
|
r13407 | """test_get_ipython_dir_6, use home over XDG if defined and neither exist.""" | ||
MinRK
|
r4475 | xdg = os.path.join(HOME_TEST_DIR, 'somexdg') | ||
os.mkdir(xdg) | ||||
shutil.rmtree(os.path.join(HOME_TEST_DIR, '.ipython')) | ||||
Thomas Kluyver
|
r13407 | with patch_get_home_dir(HOME_TEST_DIR): | ||
orig_get_xdg_dir = path.get_xdg_dir | ||||
path.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 = path.get_ipython_dir() | ||||
nt.assert_equal(ipdir, os.path.join(HOME_TEST_DIR, '.ipython')) | ||||
nt.assert_equal(len(w), 0) | ||||
finally: | ||||
path.get_xdg_dir = orig_get_xdg_dir | ||||
MinRK
|
r3347 | |||
@with_environment | ||||
MinRK
|
r3896 | def test_get_ipython_dir_7(): | ||
Bradley M. Froehle
|
r6700 | """test_get_ipython_dir_7, test home directory expansion on IPYTHONDIR""" | ||
MinRK
|
r4475 | path._writable_dir = lambda path: True | ||
Jonathan March
|
r7673 | home_dir = os.path.normpath(os.path.expanduser('~')) | ||
Bradley M. Froehle
|
r6700 | env['IPYTHONDIR'] = os.path.join('~', 'somewhere') | ||
MinRK
|
r3896 | ipdir = path.get_ipython_dir() | ||
nt.assert_equal(ipdir, os.path.join(home_dir, 'somewhere')) | ||||
Thomas Kluyver
|
r10868 | @skip_win32 | ||
Frank Murphy
|
r10662 | @with_environment | ||
def test_get_ipython_dir_8(): | ||||
"""test_get_ipython_dir_8, test / home directory""" | ||||
old = path._writable_dir, path.get_xdg_dir | ||||
try: | ||||
path._writable_dir = lambda path: bool(path) | ||||
path.get_xdg_dir = lambda: None | ||||
Frank Murphy
|
r10664 | env.pop('IPYTHON_DIR', None) | ||
env.pop('IPYTHONDIR', None) | ||||
Frank Murphy
|
r10662 | env['HOME'] = '/' | ||
nt.assert_equal(path.get_ipython_dir(), '/.ipython') | ||||
finally: | ||||
path._writable_dir, path.get_xdg_dir = old | ||||
MinRK
|
r3896 | |||
@with_environment | ||||
MinRK
|
r7086 | def test_get_xdg_dir_0(): | ||
"""test_get_xdg_dir_0, check xdg_dir""" | ||||
MinRK
|
r3347 | reload(path) | ||
MinRK
|
r4475 | path._writable_dir = lambda path: True | ||
MinRK
|
r3347 | path.get_home_dir = lambda : 'somewhere' | ||
os.name = "posix" | ||||
MinRK
|
r7086 | sys.platform = "linux2" | ||
MinRK
|
r3347 | env.pop('IPYTHON_DIR', None) | ||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
Bernardo B. Marques
|
r4872 | |||
MinRK
|
r3347 | nt.assert_equal(path.get_xdg_dir(), os.path.join('somewhere', '.config')) | ||
@with_environment | ||||
def test_get_xdg_dir_1(): | ||||
"""test_get_xdg_dir_1, check nonexistant xdg_dir""" | ||||
reload(path) | ||||
path.get_home_dir = lambda : HOME_TEST_DIR | ||||
os.name = "posix" | ||||
MinRK
|
r7086 | sys.platform = "linux2" | ||
MinRK
|
r3347 | env.pop('IPYTHON_DIR', None) | ||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
nt.assert_equal(path.get_xdg_dir(), None) | ||||
@with_environment | ||||
def test_get_xdg_dir_2(): | ||||
"""test_get_xdg_dir_2, check xdg_dir default to ~/.config""" | ||||
reload(path) | ||||
path.get_home_dir = lambda : HOME_TEST_DIR | ||||
os.name = "posix" | ||||
MinRK
|
r7086 | sys.platform = "linux2" | ||
MinRK
|
r3347 | env.pop('IPYTHON_DIR', None) | ||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
cfgdir=os.path.join(path.get_home_dir(), '.config') | ||||
MinRK
|
r7086 | if not os.path.exists(cfgdir): | ||
os.makedirs(cfgdir) | ||||
Bernardo B. Marques
|
r4872 | |||
MinRK
|
r3347 | nt.assert_equal(path.get_xdg_dir(), cfgdir) | ||
Fernando Perez
|
r1969 | |||
MinRK
|
r7086 | @with_environment | ||
def test_get_xdg_dir_3(): | ||||
"""test_get_xdg_dir_3, check xdg_dir not used on OS X""" | ||||
reload(path) | ||||
path.get_home_dir = lambda : HOME_TEST_DIR | ||||
os.name = "posix" | ||||
sys.platform = "darwin" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
cfgdir=os.path.join(path.get_home_dir(), '.config') | ||||
if not os.path.exists(cfgdir): | ||||
os.makedirs(cfgdir) | ||||
nt.assert_equal(path.get_xdg_dir(), None) | ||||
Fernando Perez
|
r1969 | def test_filefind(): | ||
"""Various tests for filefind""" | ||||
f = tempfile.NamedTemporaryFile() | ||||
Brian Granger
|
r2505 | # print 'fname:',f.name | ||
alt_dirs = path.get_ipython_dir() | ||||
t = path.filefind(f.name, alt_dirs) | ||||
# print 'found:',t | ||||
Fernando Perez
|
r2357 | |||
Julian Taylor
|
r10230 | @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 = path.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 = path.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(path.get_ipython_cache_dir(), | ||||
path.get_ipython_dir()) | ||||
Fernando Perez
|
r2357 | |||
def test_get_ipython_package_dir(): | ||||
Brian Granger
|
r2505 | ipdir = path.get_ipython_package_dir() | ||
Fernando Perez
|
r2357 | nt.assert_true(os.path.isdir(ipdir)) | ||
Fernando Perez
|
r2436 | |||
Brian Granger
|
r2505 | |||
Brian Granger
|
r2498 | def test_get_ipython_module_path(): | ||
Fernando Perez
|
r11024 | ipapp_path = path.get_ipython_module_path('IPython.terminal.ipapp') | ||
Brian Granger
|
r2498 | nt.assert_true(os.path.isfile(ipapp_path)) | ||
Fernando Perez
|
r2436 | |||
Brian Granger
|
r2505 | |||
Brian Granger
|
r2498 | @dec.skip_if_not_win32 | ||
def test_get_long_path_name_win32(): | ||||
Jonathan Frederic
|
r12083 | with TemporaryDirectory() as tmpdir: | ||
Jonathan Frederic
|
r12085 | |||
# Make a long path. | ||||
Jonathan Frederic
|
r12083 | long_path = os.path.join(tmpdir, u'this is my long path name') | ||
Jonathan Frederic
|
r12085 | os.makedirs(long_path) | ||
Jonathan Frederic
|
r12083 | |||
Jonathan Frederic
|
r12085 | # Test to see if the short path evaluates correctly. | ||
short_path = os.path.join(tmpdir, u'THISIS~1') | ||||
evaluated_path = path.get_long_path_name(short_path) | ||||
nt.assert_equal(evaluated_path.lower(), long_path.lower()) | ||||
Fernando Perez
|
r2436 | |||
Brian Granger
|
r2505 | |||
Brian Granger
|
r2498 | @dec.skip_win32 | ||
def test_get_long_path_name(): | ||||
Brian Granger
|
r2505 | p = path.get_long_path_name('/usr/local') | ||
Bradley M. Froehle
|
r7875 | nt.assert_equal(p,'/usr/local') | ||
Fernando Perez
|
r2436 | |||
MinRK
|
r4483 | @dec.skip_win32 # can't create not-user-writable dir on win | ||
MinRK
|
r4475 | @with_environment | ||
def test_not_writable_ipdir(): | ||||
tmpdir = tempfile.mkdtemp() | ||||
os.name = "posix" | ||||
env.pop('IPYTHON_DIR', None) | ||||
env.pop('IPYTHONDIR', None) | ||||
env.pop('XDG_CONFIG_HOME', None) | ||||
env['HOME'] = tmpdir | ||||
ipdir = os.path.join(tmpdir, '.ipython') | ||||
os.mkdir(ipdir) | ||||
os.chmod(ipdir, 600) | ||||
Thomas Kluyver
|
r4902 | with AssertPrints('is not a writable location', channel='stderr'): | ||
Thomas Kluyver
|
r4901 | ipdir = path.get_ipython_dir() | ||
MinRK
|
r4475 | env.pop('IPYTHON_DIR', None) | ||
Robert Kern
|
r4688 | |||
Robert Kern
|
r4696 | def test_unquote_filename(): | ||
for win32 in (True, False): | ||||
Bradley M. Froehle
|
r7875 | nt.assert_equal(path.unquote_filename('foo.py', win32=win32), 'foo.py') | ||
nt.assert_equal(path.unquote_filename('foo bar.py', win32=win32), 'foo bar.py') | ||||
nt.assert_equal(path.unquote_filename('"foo.py"', win32=True), 'foo.py') | ||||
nt.assert_equal(path.unquote_filename('"foo bar.py"', win32=True), 'foo bar.py') | ||||
nt.assert_equal(path.unquote_filename("'foo.py'", win32=True), 'foo.py') | ||||
nt.assert_equal(path.unquote_filename("'foo bar.py'", win32=True), 'foo bar.py') | ||||
nt.assert_equal(path.unquote_filename('"foo.py"', win32=False), '"foo.py"') | ||||
nt.assert_equal(path.unquote_filename('"foo bar.py"', win32=False), '"foo bar.py"') | ||||
nt.assert_equal(path.unquote_filename("'foo.py'", win32=False), "'foo.py'") | ||||
nt.assert_equal(path.unquote_filename("'foo bar.py'", win32=False), "'foo bar.py'") | ||||
Robert Kern
|
r4696 | |||
Robert Kern
|
r4688 | @with_environment | ||
def test_get_py_filename(): | ||||
os.chdir(TMP_TEST_DIR) | ||||
for win32 in (True, False): | ||||
with make_tempfile('foo.py'): | ||||
Bradley M. Froehle
|
r7875 | nt.assert_equal(path.get_py_filename('foo.py', force_win32=win32), 'foo.py') | ||
nt.assert_equal(path.get_py_filename('foo', force_win32=win32), 'foo.py') | ||||
Robert Kern
|
r4688 | with make_tempfile('foo'): | ||
Bradley M. Froehle
|
r7875 | nt.assert_equal(path.get_py_filename('foo', force_win32=win32), 'foo') | ||
Robert Kern
|
r4696 | nt.assert_raises(IOError, path.get_py_filename, 'foo.py', force_win32=win32) | ||
nt.assert_raises(IOError, path.get_py_filename, 'foo', force_win32=win32) | ||||
nt.assert_raises(IOError, path.get_py_filename, 'foo.py', force_win32=win32) | ||||
Robert Kern
|
r4688 | true_fn = 'foo with spaces.py' | ||
with make_tempfile(true_fn): | ||||
Bradley M. Froehle
|
r7875 | nt.assert_equal(path.get_py_filename('foo with spaces', force_win32=win32), true_fn) | ||
nt.assert_equal(path.get_py_filename('foo with spaces.py', force_win32=win32), true_fn) | ||||
Robert Kern
|
r4688 | if win32: | ||
Bradley M. Froehle
|
r7875 | nt.assert_equal(path.get_py_filename('"foo with spaces.py"', force_win32=True), true_fn) | ||
nt.assert_equal(path.get_py_filename("'foo with spaces.py'", force_win32=True), true_fn) | ||||
Robert Kern
|
r4688 | else: | ||
Robert Kern
|
r4696 | nt.assert_raises(IOError, path.get_py_filename, '"foo with spaces.py"', force_win32=False) | ||
nt.assert_raises(IOError, path.get_py_filename, "'foo with spaces.py'", force_win32=False) | ||||
Thomas Kluyver
|
r12166 | |||
@onlyif_unicode_paths | ||||
r6152 | def test_unicode_in_filename(): | |||
Thomas Kluyver
|
r6164 | """When a file doesn't exist, the exception raised should be safe to call | ||
str() on - i.e. in Python 2 it must only have ASCII characters. | ||||
https://github.com/ipython/ipython/issues/875 | ||||
""" | ||||
r6152 | try: | |||
# these calls should not throw unicode encode exceptions | ||||
path.get_py_filename(u'fooéè.py', force_win32=False) | ||||
except IOError as ex: | ||||
str(ex) | ||||
Takafumi Arakaki
|
r8014 | |||
Takafumi Arakaki
|
r8638 | class TestShellGlob(object): | ||
Takafumi Arakaki
|
r8014 | |||
Takafumi Arakaki
|
r8638 | @classmethod | ||
def setUpClass(cls): | ||||
Thomas Kluyver
|
r13373 | cls.filenames_start_with_a = ['a0', 'a1', 'a2'] | ||
cls.filenames_end_with_b = ['0b', '1b', '2b'] | ||||
Takafumi Arakaki
|
r8638 | cls.filenames = cls.filenames_start_with_a + cls.filenames_end_with_b | ||
cls.tempdir = TemporaryDirectory() | ||||
td = cls.tempdir.name | ||||
Takafumi Arakaki
|
r8014 | |||
Takafumi Arakaki
|
r8638 | with cls.in_tempdir(): | ||
Takafumi Arakaki
|
r8014 | # Create empty files | ||
Takafumi Arakaki
|
r8638 | for fname in cls.filenames: | ||
Takafumi Arakaki
|
r8014 | open(os.path.join(td, fname), 'w').close() | ||
Takafumi Arakaki
|
r8638 | @classmethod | ||
def tearDownClass(cls): | ||||
cls.tempdir.cleanup() | ||||
@classmethod | ||||
@contextmanager | ||||
def in_tempdir(cls): | ||||
Thomas Kluyver
|
r13447 | save = py3compat.getcwd() | ||
Takafumi Arakaki
|
r8640 | try: | ||
os.chdir(cls.tempdir.name) | ||||
yield | ||||
finally: | ||||
os.chdir(save) | ||||
Takafumi Arakaki
|
r8638 | |||
def check_match(self, patterns, matches): | ||||
with self.in_tempdir(): | ||||
# glob returns unordered list. that's why sorted is required. | ||||
nt.assert_equals(sorted(path.shellglob(patterns)), | ||||
sorted(matches)) | ||||
def common_cases(self): | ||||
return [ | ||||
(['*'], self.filenames), | ||||
(['a*'], self.filenames_start_with_a), | ||||
(['*c'], ['*c']), | ||||
(['*', 'a*', '*b', '*c'], self.filenames | ||||
+ self.filenames_start_with_a | ||||
+ self.filenames_end_with_b | ||||
+ ['*c']), | ||||
(['a[012]'], self.filenames_start_with_a), | ||||
] | ||||
@skip_win32 | ||||
def test_match_posix(self): | ||||
for (patterns, matches) in self.common_cases() + [ | ||||
([r'\*'], ['*']), | ||||
([r'a\*', 'a*'], ['a*'] + self.filenames_start_with_a), | ||||
([r'a\[012]'], ['a[012]']), | ||||
]: | ||||
yield (self.check_match, patterns, matches) | ||||
@skip_if_not_win32 | ||||
def test_match_windows(self): | ||||
for (patterns, matches) in self.common_cases() + [ | ||||
# In windows, backslash is interpreted as path | ||||
# separator. Therefore, you can't escape glob | ||||
# using it. | ||||
([r'a\*', 'a*'], [r'a\*'] + self.filenames_start_with_a), | ||||
([r'a\[012]'], [r'a\[012]']), | ||||
]: | ||||
yield (self.check_match, patterns, matches) | ||||
Takafumi Arakaki
|
r8119 | |||
def test_unescape_glob(): | ||||
nt.assert_equals(path.unescape_glob(r'\*\[\!\]\?'), '*[!]?') | ||||
Takafumi Arakaki
|
r8122 | nt.assert_equals(path.unescape_glob(r'\\*'), r'\*') | ||
nt.assert_equals(path.unescape_glob(r'\\\*'), r'\*') | ||||
nt.assert_equals(path.unescape_glob(r'\\a'), r'\a') | ||||
nt.assert_equals(path.unescape_glob(r'\a'), r'\a') | ||||
David Wolever
|
r11647 | |||
class TestLinkOrCopy(object): | ||||
def setUp(self): | ||||
self.tempdir = TemporaryDirectory() | ||||
self.src = self.dst("src") | ||||
with open(self.src, "w") as f: | ||||
f.write("Hello, world!") | ||||
def tearDown(self): | ||||
self.tempdir.cleanup() | ||||
def dst(self, *args): | ||||
return os.path.join(self.tempdir.name, *args) | ||||
def assert_inode_not_equal(self, a, b): | ||||
nt.assert_not_equals(os.stat(a).st_ino, os.stat(b).st_ino, | ||||
"%r and %r do reference the same indoes" %(a, b)) | ||||
def assert_inode_equal(self, a, b): | ||||
nt.assert_equals(os.stat(a).st_ino, os.stat(b).st_ino, | ||||
"%r and %r do not reference the same indoes" %(a, b)) | ||||
David Wolever
|
r11650 | def assert_content_equal(self, a, b): | ||
David Wolever
|
r11653 | with open(a) as a_f: | ||
with open(b) as b_f: | ||||
nt.assert_equals(a_f.read(), b_f.read()) | ||||
David Wolever
|
r11647 | |||
@skip_win32 | ||||
def test_link_successful(self): | ||||
dst = self.dst("target") | ||||
path.link_or_copy(self.src, dst) | ||||
self.assert_inode_equal(self.src, dst) | ||||
@skip_win32 | ||||
def test_link_into_dir(self): | ||||
dst = self.dst("some_dir") | ||||
os.mkdir(dst) | ||||
path.link_or_copy(self.src, dst) | ||||
expected_dst = self.dst("some_dir", os.path.basename(self.src)) | ||||
self.assert_inode_equal(self.src, expected_dst) | ||||
@skip_win32 | ||||
def test_target_exists(self): | ||||
dst = self.dst("target") | ||||
open(dst, "w").close() | ||||
path.link_or_copy(self.src, dst) | ||||
self.assert_inode_equal(self.src, dst) | ||||
@skip_win32 | ||||
def test_no_link(self): | ||||
real_link = os.link | ||||
try: | ||||
del os.link | ||||
dst = self.dst("target") | ||||
path.link_or_copy(self.src, dst) | ||||
David Wolever
|
r11650 | self.assert_content_equal(self.src, dst) | ||
David Wolever
|
r11647 | self.assert_inode_not_equal(self.src, dst) | ||
finally: | ||||
os.link = real_link | ||||
@skip_if_not_win32 | ||||
def test_windows(self): | ||||
dst = self.dst("target") | ||||
path.link_or_copy(self.src, dst) | ||||
David Wolever
|
r11650 | self.assert_content_equal(self.src, dst) | ||