diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index e11ba47479..c72aab4a34 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -28,6 +28,7 @@ import tempfile from os.path import join, dirname from warnings import warn +from packaging import version from .. import config, logging from ..utils.filemanip import ( @@ -2733,6 +2734,10 @@ class BIDSDataGrabberInputSpec(DynamicTraitedSpec): return_type = traits.Enum('file', 'namedtuple', usedefault=True) strict = traits.Bool(desc='Return only BIDS "proper" files (e.g., ' 'ignore derivatives/, sourcedata/, etc.)') + domains = traits.Either(None, traits.List(), + usedefault=True, + desc='(Optional): Pass list of domains ' + '(e.g. ["bids", "derivatives"]) for file searching.') class BIDSDataGrabber(LibraryBaseInterface, IOBase): @@ -2808,14 +2813,31 @@ def __init__(self, infields=None, **kwargs): def _list_outputs(self): # Version resilience + import bids + from packaging import version try: from bids import BIDSLayout except ImportError: from bids.grabbids import BIDSLayout + + pybids_ver = version.parse(bids.__version__) exclude = None if self.inputs.strict: exclude = ['derivatives/', 'code/', 'sourcedata/'] - layout = BIDSLayout(self.inputs.base_dir, exclude=exclude) + + if pybids_ver < version.parse('0.5'): + raise ImportError("pybids must be >= 0.5, " + "installed version: {ver}".format(ver=pybids_ver)) + elif pybids_ver >= version.parse('0.5') and pybids_ver < version.parse('0.6'): + layout = BIDSLayout(self.inputs.base_dir, + config=self.inputs.domains, + exclude=exclude) + else: + # pybids >= 0.6.0 + if self.inputs.domains is None: + self.inputs.domains = ['bids'] + layout = BIDSLayout((self.inputs.base_dir, self.inputs.domains), + exclude=exclude) # If infield is not given nm input value, silently ignore filters = {} diff --git a/nipype/interfaces/tests/test_auto_BIDSDataGrabber.py b/nipype/interfaces/tests/test_auto_BIDSDataGrabber.py index 8acdcc9787..99a81f675a 100644 --- a/nipype/interfaces/tests/test_auto_BIDSDataGrabber.py +++ b/nipype/interfaces/tests/test_auto_BIDSDataGrabber.py @@ -6,6 +6,7 @@ def test_BIDSDataGrabber_inputs(): input_map = dict( base_dir=dict(mandatory=True, ), + domains=dict(usedefault=True, ), output_query=dict(), raise_on_empty=dict(usedefault=True, ), return_type=dict(usedefault=True, ),