1""" Functions / decorators for finding / requiring nibabel-data directory
2"""
3
4from os import environ, listdir
5from os.path import dirname, realpath, join as pjoin, isdir, exists
6
7import unittest
8
9
10def get_nibabel_data():
11    """ Return path to nibabel-data or empty string if missing
12
13    First use ``NIBABEL_DATA_DIR`` environment variable.
14
15    If this variable is missing then look for data in directory below package
16    directory.
17    """
18    nibabel_data = environ.get('NIBABEL_DATA_DIR')
19    if nibabel_data is None:
20        mod = __import__('nibabel')
21        containing_path = dirname(dirname(realpath(mod.__file__)))
22        nibabel_data = pjoin(containing_path, 'nibabel-data')
23    return nibabel_data if isdir(nibabel_data) else ''
24
25
26def needs_nibabel_data(subdir=None):
27    """ Decorator for tests needing nibabel-data
28
29    Parameters
30    ----------
31    subdir : None or str
32        Subdirectory we need in nibabel-data directory.  If None, only require
33        nibabel-data directory itself.
34
35    Returns
36    -------
37    skip_dec : decorator
38        Decorator skipping tests if required directory not present
39    """
40    nibabel_data = get_nibabel_data()
41    if nibabel_data == '':
42        return unittest.skip("Need nibabel-data directory for this test")
43    if subdir is None:
44        return lambda x: x
45    required_path = pjoin(nibabel_data, subdir)
46    # Path should not be empty (as is the case for not-updated submodules)
47    have_files = exists(required_path) and len(listdir(required_path)) > 0
48    return unittest.skipUnless(have_files,
49                               f"Need files in {required_path} for these tests")
50