##// END OF EJS Templates
use XDG_CONFIG_HOME if available...
MinRK -
Show More
@@ -246,6 +246,24 b' def get_home_dir():'
246 246 else:
247 247 raise HomeDirError('No valid home directory could be found for your OS')
248 248
249 def get_xdg_dir():
250 """Return the XDG_CONFIG_HOME, if it is defined and exists, else None.
251
252 This is only for posix (Linux,Unix,OS X, etc) systems.
253 """
254
255 isdir = os.path.isdir
256 env = os.environ
257
258 if os.name == 'posix':
259 # Linux, Unix, AIX, OS X
260 # use ~/.config if not set OR empty
261 xdg = env.get("XDG_CONFIG_HOME", None) or os.path.join(get_home_dir(), '.config')
262 if xdg and isdir(xdg):
263 return xdg.decode(sys.getfilesystemencoding())
264
265 return None
266
249 267
250 268 def get_ipython_dir():
251 269 """Get the IPython directory for this platform and user.
@@ -253,14 +271,34 b' def get_ipython_dir():'
253 271 This uses the logic in `get_home_dir` to find the home directory
254 272 and the adds .ipython to the end of the path.
255 273 """
274
275 env = os.environ
276 pjoin = os.path.join
277 exists = os.path.exists
278
256 279 ipdir_def = '.ipython'
280 xdg_def = 'ipython'
281
257 282 home_dir = get_home_dir()
283 xdg_dir = get_xdg_dir()
258 284 # import pdb; pdb.set_trace() # dbg
259 ipdir = os.environ.get(
260 'IPYTHON_DIR', os.environ.get(
261 'IPYTHONDIR', os.path.join(home_dir, ipdir_def)
262 )
263 )
285 ipdir = env.get('IPYTHON_DIR', env.get('IPYTHONDIR', None))
286 if ipdir is None:
287 # not set explicitly, use XDG_CONFIG_HOME or HOME
288 home_ipdir = pjoin(home_dir, ipdir_def)
289 if xdg_dir:
290 # use XDG, as long as the user isn't already
291 # using $HOME/.ipython and *not* XDG/ipython
292
293 xdg_ipdir = pjoin(xdg_dir, xdg_def)
294
295 if exists(xdg_ipdir) or not exists(home_ipdir):
296 ipdir = xdg_ipdir
297
298 if ipdir is None:
299 # not using XDG
300 ipdir = home_ipdir
301
264 302 return ipdir.decode(sys.getfilesystemencoding())
265 303
266 304
@@ -46,6 +46,7 b' env = os.environ'
46 46 TEST_FILE_PATH = split(abspath(__file__))[0]
47 47 TMP_TEST_DIR = tempfile.mkdtemp()
48 48 HOME_TEST_DIR = join(TMP_TEST_DIR, "home_test_dir")
49 XDG_TEST_DIR = join(HOME_TEST_DIR, "xdg_test_dir")
49 50 IP_TEST_DIR = join(HOME_TEST_DIR,'.ipython')
50 51 #
51 52 # Setup/teardown functions/decorators
@@ -59,6 +60,7 b' def setup():'
59 60 # Do not mask exceptions here. In particular, catching WindowsError is a
60 61 # problem because that exception is only defined on Windows...
61 62 os.makedirs(IP_TEST_DIR)
63 os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython'))
62 64
63 65
64 66 def teardown():
@@ -236,9 +238,93 b' def test_get_ipython_dir_2():'
236 238 os.name = "posix"
237 239 env.pop('IPYTHON_DIR', None)
238 240 env.pop('IPYTHONDIR', None)
241 env.pop('XDG_CONFIG_HOME', None)
239 242 ipdir = path.get_ipython_dir()
240 243 nt.assert_equal(ipdir, os.path.join("someplace", ".ipython"))
241 244
245 @with_environment
246 def test_get_ipython_dir_3():
247 """test_get_ipython_dir_3, use XDG if defined, and .ipython doesn't exist."""
248 path.get_home_dir = lambda : "someplace"
249 os.name = "posix"
250 env.pop('IPYTHON_DIR', None)
251 env.pop('IPYTHONDIR', None)
252 env['XDG_CONFIG_HOME'] = XDG_TEST_DIR
253 ipdir = path.get_ipython_dir()
254 nt.assert_equal(ipdir, os.path.join(XDG_TEST_DIR, "ipython"))
255
256 @with_environment
257 def test_get_ipython_dir_4():
258 """test_get_ipython_dir_4, use XDG if both exist."""
259 path.get_home_dir = lambda : HOME_TEST_DIR
260 os.name = "posix"
261 env.pop('IPYTHON_DIR', None)
262 env.pop('IPYTHONDIR', None)
263 env['XDG_CONFIG_HOME'] = XDG_TEST_DIR
264 xdg_ipdir = os.path.join(XDG_TEST_DIR, "ipython")
265 ipdir = path.get_ipython_dir()
266 nt.assert_equal(ipdir, xdg_ipdir)
267
268 @with_environment
269 def test_get_ipython_dir_5():
270 """test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist."""
271 os.name = "posix"
272 env.pop('IPYTHON_DIR', None)
273 env.pop('IPYTHONDIR', None)
274 env['XDG_CONFIG_HOME'] = XDG_TEST_DIR
275 os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython'))
276 ipdir = path.get_ipython_dir()
277 nt.assert_equal(ipdir, IP_TEST_DIR)
278
279 @with_environment
280 def test_get_ipython_dir_6():
281 """test_get_ipython_dir_6, use XDG if defined and neither exist."""
282 path.get_home_dir = lambda : 'somehome'
283 path.get_xdg_dir = lambda : 'somexdg'
284 os.name = "posix"
285 env.pop('IPYTHON_DIR', None)
286 env.pop('IPYTHONDIR', None)
287 xdg_ipdir = os.path.join("somexdg", "ipython")
288 ipdir = path.get_ipython_dir()
289 nt.assert_equal(ipdir, xdg_ipdir)
290
291 @with_environment
292 def test_get_xdg_dir_1():
293 """test_get_xdg_dir_1, check xdg_dir"""
294 reload(path)
295 path.get_home_dir = lambda : 'somewhere'
296 os.name = "posix"
297 env.pop('IPYTHON_DIR', None)
298 env.pop('IPYTHONDIR', None)
299 env.pop('XDG_CONFIG_HOME', None)
300
301 nt.assert_equal(path.get_xdg_dir(), os.path.join('somewhere', '.config'))
302
303
304 @with_environment
305 def test_get_xdg_dir_1():
306 """test_get_xdg_dir_1, check nonexistant xdg_dir"""
307 reload(path)
308 path.get_home_dir = lambda : HOME_TEST_DIR
309 os.name = "posix"
310 env.pop('IPYTHON_DIR', None)
311 env.pop('IPYTHONDIR', None)
312 env.pop('XDG_CONFIG_HOME', None)
313 nt.assert_equal(path.get_xdg_dir(), None)
314
315 @with_environment
316 def test_get_xdg_dir_2():
317 """test_get_xdg_dir_2, check xdg_dir default to ~/.config"""
318 reload(path)
319 path.get_home_dir = lambda : HOME_TEST_DIR
320 os.name = "posix"
321 env.pop('IPYTHON_DIR', None)
322 env.pop('IPYTHONDIR', None)
323 env.pop('XDG_CONFIG_HOME', None)
324 cfgdir=os.path.join(path.get_home_dir(), '.config')
325 os.makedirs(cfgdir)
326
327 nt.assert_equal(path.get_xdg_dir(), cfgdir)
242 328
243 329 def test_filefind():
244 330 """Various tests for filefind"""
General Comments 0
You need to be logged in to leave comments. Login now