This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/python/yap_kernel/yap_ipython/paths.py

120 lines
4.4 KiB
Python
Raw Normal View History

2018-01-05 16:57:38 +00:00
"""Find files and directories which yap_ipython uses.
"""
import os.path
import shutil
import tempfile
from warnings import warn
import yap_ipython
from yap_ipython.utils.importstring import import_item
from yap_ipython.utils.path import (
get_home_dir, get_xdg_dir, get_xdg_cache_dir, compress_user, _writable_dir,
ensure_dir_exists, fs_encoding)
from yap_ipython.utils import py3compat
def get_ipython_dir():
"""Get the yap_ipython directory for this platform and user.
This uses the logic in `get_home_dir` to find the home directory
and then adds .ipython to the end of the path.
"""
env = os.environ
pjoin = os.path.join
ipdir_def = '.ipython'
home_dir = get_home_dir()
xdg_dir = get_xdg_dir()
# import pdb; pdb.set_trace() # dbg
if 'IPYTHON_DIR' in env:
warn('The environment variable IPYTHON_DIR is deprecated. '
'Please use IPYTHONDIR instead.')
ipdir = env.get('IPYTHONDIR', env.get('IPYTHON_DIR', None))
if ipdir is None:
# not set explicitly, use ~/.ipython
ipdir = pjoin(home_dir, ipdir_def)
if xdg_dir:
# Several yap_ipython versions (up to 1.x) defaulted to .config/ipython
# on Linux. We have decided to go back to using .ipython everywhere
xdg_ipdir = pjoin(xdg_dir, 'ipython')
if _writable_dir(xdg_ipdir):
cu = compress_user
if os.path.exists(ipdir):
warn(('Ignoring {0} in favour of {1}. Remove {0} to '
'get rid of this message').format(cu(xdg_ipdir), cu(ipdir)))
elif os.path.islink(xdg_ipdir):
warn(('{0} is deprecated. Move link to {1} to '
'get rid of this message').format(cu(xdg_ipdir), cu(ipdir)))
else:
warn('Moving {0} to {1}'.format(cu(xdg_ipdir), cu(ipdir)))
shutil.move(xdg_ipdir, ipdir)
ipdir = os.path.normpath(os.path.expanduser(ipdir))
if os.path.exists(ipdir) and not _writable_dir(ipdir):
# ipdir exists, but is not writable
warn("yap_ipython dir '{0}' is not a writable location,"
" using a temp directory.".format(ipdir))
ipdir = tempfile.mkdtemp()
elif not os.path.exists(ipdir):
parent = os.path.dirname(ipdir)
if not _writable_dir(parent):
# ipdir does not exist and parent isn't writable
warn("yap_ipython parent '{0}' is not a writable location,"
" using a temp directory.".format(parent))
ipdir = tempfile.mkdtemp()
return py3compat.cast_unicode(ipdir, fs_encoding)
def get_ipython_cache_dir():
"""Get the cache directory it is created if it does not exist."""
xdgdir = get_xdg_cache_dir()
if xdgdir is None:
return get_ipython_dir()
ipdir = os.path.join(xdgdir, "ipython")
if not os.path.exists(ipdir) and _writable_dir(xdgdir):
ensure_dir_exists(ipdir)
elif not _writable_dir(xdgdir):
return get_ipython_dir()
return py3compat.cast_unicode(ipdir, fs_encoding)
def get_ipython_package_dir():
"""Get the base directory where yap_ipython itself is installed."""
ipdir = os.path.dirname(yap_ipython.__file__)
return py3compat.cast_unicode(ipdir, fs_encoding)
def get_ipython_module_path(module_str):
"""Find the path to an yap_ipython module in this version of yap_ipython.
This will always find the version of the module that is in this importable
yap_ipython package. This will always return the path to the ``.py``
version of the module.
"""
if module_str == 'yap_ipython':
return os.path.join(get_ipython_package_dir(), '__init__.py')
mod = import_item(module_str)
the_path = mod.__file__.replace('.pyc', '.py')
the_path = the_path.replace('.pyo', '.py')
return py3compat.cast_unicode(the_path, fs_encoding)
def locate_profile(profile='default'):
"""Find the path to the folder associated with a given profile.
I.e. find $IPYTHONDIR/profile_whatever.
"""
from yap_ipython.core.profiledir import ProfileDir, ProfileDirError
try:
pd = ProfileDir.find_profile_dir_by_name(get_ipython_dir(), profile)
except ProfileDirError:
# IOError makes more sense when people are expecting a path
raise IOError("Couldn't find profile %r" % profile)
return pd.location