import errno import os import shutil import tempfile import warnings from unittest.mock import patch from tempfile import TemporaryDirectory from testpath import assert_isdir, assert_isfile, modified_env from IPython import paths from IPython.testing.decorators import skip_win32 TMP_TEST_DIR = os.path.realpath(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_module(): """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_module(): """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 patch_get_home_dir(dirpath): return patch.object(paths, 'get_home_dir', return_value=dirpath) 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") with patch.object(paths, '_writable_dir', return_value=True), \ modified_env({'IPYTHONDIR': env_ipdir}): ipdir = paths.get_ipython_dir() assert ipdir == env_ipdir 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'), \ patch.object(paths, 'get_xdg_dir', return_value=None), \ patch.object(paths, '_writable_dir', return_value=True), \ patch('os.name', "posix"), \ modified_env({'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': None }): ipdir = paths.get_ipython_dir() assert ipdir == os.path.join("someplace", ".ipython") def test_get_ipython_dir_3(): """test_get_ipython_dir_3, use XDG if defined and exists, and .ipython doesn't exist.""" tmphome = TemporaryDirectory() try: with patch_get_home_dir(tmphome.name), \ patch('os.name', 'posix'), \ modified_env({ 'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': XDG_TEST_DIR, }), warnings.catch_warnings(record=True) as w: ipdir = paths.get_ipython_dir() assert ipdir == os.path.join(tmphome.name, XDG_TEST_DIR, "ipython") assert len(w) == 0 finally: tmphome.cleanup() 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), \ patch('os.name', 'posix'): try: os.mkdir(os.path.join(XDG_TEST_DIR, 'ipython')) except OSError as e: if e.errno != errno.EEXIST: raise with modified_env({ 'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': XDG_TEST_DIR, }), warnings.catch_warnings(record=True) as w: ipdir = paths.get_ipython_dir() assert len(w) == 1 assert "Ignoring" in str(w[0]) 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), \ patch('os.name', 'posix'): try: os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython')) except OSError as e: if e.errno != errno.ENOENT: raise with modified_env({ 'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': XDG_TEST_DIR, }): ipdir = paths.get_ipython_dir() assert ipdir == IP_TEST_DIR 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')) print(paths._writable_dir) with patch_get_home_dir(HOME_TEST_DIR), \ patch.object(paths, 'get_xdg_dir', return_value=xdg), \ patch('os.name', 'posix'), \ modified_env({ 'IPYTHON_DIR': None, 'IPYTHONDIR': None, 'XDG_CONFIG_HOME': None, }), warnings.catch_warnings(record=True) as w: ipdir = paths.get_ipython_dir() assert ipdir == os.path.join(HOME_TEST_DIR, ".ipython") assert len(w) == 0 def test_get_ipython_dir_7(): """test_get_ipython_dir_7, test home directory expansion on IPYTHONDIR""" home_dir = os.path.normpath(os.path.expanduser('~')) with modified_env({'IPYTHONDIR': os.path.join('~', 'somewhere')}), \ patch.object(paths, '_writable_dir', return_value=True): ipdir = paths.get_ipython_dir() assert ipdir == os.path.join(home_dir, "somewhere") @skip_win32 def test_get_ipython_dir_8(): """test_get_ipython_dir_8, test / home directory""" if not os.access("/", os.W_OK): # test only when HOME directory actually writable return with patch.object(paths, "_writable_dir", lambda path: bool(path)), patch.object( paths, "get_xdg_dir", return_value=None ), modified_env( { "IPYTHON_DIR": None, "IPYTHONDIR": None, "HOME": "/", } ): assert paths.get_ipython_dir() == "/.ipython" def test_get_ipython_cache_dir(): with modified_env({'HOME': HOME_TEST_DIR}): if os.name == "posix": # test default os.makedirs(os.path.join(HOME_TEST_DIR, ".cache")) with modified_env({'XDG_CACHE_HOME': None}): ipdir = paths.get_ipython_cache_dir() assert os.path.join(HOME_TEST_DIR, ".cache", "ipython") == ipdir assert_isdir(ipdir) # test env override with modified_env({"XDG_CACHE_HOME": XDG_CACHE_DIR}): ipdir = paths.get_ipython_cache_dir() assert_isdir(ipdir) assert ipdir == os.path.join(XDG_CACHE_DIR, "ipython") else: assert paths.get_ipython_cache_dir() == paths.get_ipython_dir() def test_get_ipython_package_dir(): ipdir = paths.get_ipython_package_dir() assert_isdir(ipdir) def test_get_ipython_module_path(): ipapp_path = paths.get_ipython_module_path('IPython.terminal.ipapp') assert_isfile(ipapp_path)