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