From ffd0d8eb213d7da40857e8d484114b130f1bab9a Mon Sep 17 00:00:00 2001 From: adelavega Date: Tue, 9 Oct 2018 09:47:47 -0400 Subject: [PATCH 01/14] Lock travis Python 0.6.5 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6aaec256d4..3e9a9aaf40 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,7 +87,7 @@ before_install: - travis_retry pip install -r requirements.txt - travis_retry pip install grabbit==0.1.2 -- travis_retry git clone https://github.com/INCF/pybids.git ${HOME}/pybids && +- travis_retry git clone https://github.com/INCF/pybids.git ${HOME}/pybids && git checkout 0.6.5 pip install -e ${HOME}/pybids install: From 801b295b1e22b87cb273d7003cd31b6bfb112074 Mon Sep 17 00:00:00 2001 From: adelavega Date: Mon, 15 Oct 2018 12:49:07 -0500 Subject: [PATCH 02/14] Update BIDSDataGrabber for pybids 0.7, including tests, and derivatives handling --- .travis.yml | 2 +- nipype/interfaces/io.py | 23 ++++++++++++++--------- nipype/interfaces/tests/test_io.py | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 37316aea61..235bf9892c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,7 +87,7 @@ before_install: - travis_retry pip install -r requirements.txt - travis_retry pip install grabbit==0.1.2 -- travis_retry git clone -b 0.6.5 https://github.com/INCF/pybids.git ${HOME}/pybids && pip install -e ${HOME}/pybids +- travis_retry git clone https://github.com/INCF/pybids.git ${HOME}/pybids && pip install -e ${HOME}/pybids install: - travis_retry pip install $EXTRA_PIP_FLAGS -e .[$NIPYPE_EXTRAS] diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index 627d9ca7ac..3aaab428bf 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -2761,8 +2761,10 @@ class BIDSDataGrabberInputSpec(DynamicTraitedSpec): desc='Generate exception if list is empty ' 'for a given field') return_type = traits.Enum('file', 'namedtuple', usedefault=True) - strict = traits.Bool(desc='Return only BIDS "proper" files (e.g., ' - 'ignore derivatives/, sourcedata/, etc.)') + index_derivatives = traits.Bool(False, usedefault=True, + desc='Index derivatives/ sub-directory') + extra_derivatives = traits.List(Directory(exists=True), + desc='Additional derivative directories to index') class BIDSDataGrabber(IOBase): @@ -2788,7 +2790,7 @@ class BIDSDataGrabber(IOBase): are filtered on common entities, which can be explicitly defined as infields. - >>> bg = BIDSDataGrabber(infields = ['subject'], outfields = ['dwi']) + >>> bg = BIDSDataGrabber(infields = ['subject']) >>> bg.inputs.base_dir = 'ds005/' >>> bg.inputs.subject = '01' >>> bg.inputs.output_query['dwi'] = dict(modality='dwi') @@ -2810,8 +2812,10 @@ def __init__(self, infields=None, **kwargs): if not isdefined(self.inputs.output_query): self.inputs.output_query = { - "func": {"modality": "func", 'extensions': ['nii', '.nii.gz']}, - "anat": {"modality": "anat", 'extensions': ['nii', '.nii.gz']}, + "bold": {"datatype": "func", "suffix": "bold", + "extensions": ["nii", ".nii.gz"]}, + "T1w": {"datatype": "anat", "suffix": "T1w", + "extensions": ["nii", ".nii.gz"]}, } # If infields is empty, use all BIDS entities @@ -2838,10 +2842,11 @@ def _run_interface(self, runtime): return runtime def _list_outputs(self): - exclude = None - if self.inputs.strict: - exclude = ['derivatives/', 'code/', 'sourcedata/'] - layout = bidslayout.BIDSLayout(self.inputs.base_dir, exclude=exclude) + layout = bidslayout.BIDSLayout(self.inputs.base_dir, + derivatives=self.inputs.derivatives) + + if isdefined(self.inputs.extra_derivatives): + layout.add_derivatives(self.inputs.extra_derivatives) # If infield is not given nm input value, silently ignore filters = {} diff --git a/nipype/interfaces/tests/test_io.py b/nipype/interfaces/tests/test_io.py index c81e6f8e06..a2762284b7 100644 --- a/nipype/interfaces/tests/test_io.py +++ b/nipype/interfaces/tests/test_io.py @@ -591,9 +591,9 @@ def test_bids_grabber(tmpdir): bg.inputs.base_dir = os.path.join(datadir, 'ds005') bg.inputs.subject = '01' results = bg.run() - assert 'sub-01_T1w.nii.gz' in map(os.path.basename, results.outputs.anat) + assert 'sub-01_T1w.nii.gz' in map(os.path.basename, results.outputs.T1w) assert 'sub-01_task-mixedgamblestask_run-01_bold.nii.gz' in \ - map(os.path.basename, results.outputs.func) + map(os.path.basename, results.outputs.bold) @pytest.mark.skipif(not have_pybids, From 1d267c89068301a629ab3906d1c353ac947d8f3e Mon Sep 17 00:00:00 2001 From: adelavega Date: Mon, 15 Oct 2018 13:18:38 -0500 Subject: [PATCH 03/14] Fix test, outfields --- nipype/interfaces/tests/test_io.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nipype/interfaces/tests/test_io.py b/nipype/interfaces/tests/test_io.py index a2762284b7..f00555e521 100644 --- a/nipype/interfaces/tests/test_io.py +++ b/nipype/interfaces/tests/test_io.py @@ -633,9 +633,9 @@ def test_bids_infields_outfields(tmpdir): for outfield in outfields: assert(outfield in bg._outputs().traits()) - # now try without defining outfields, we should get anat and func for free + # now try without defining outfields bg = nio.BIDSDataGrabber() - for outfield in ['anat', 'func']: + for outfield in ['T1w', 'bold']: assert outfield in bg._outputs().traits() From b0121c03f06c30fabaaf4d7012e4f8424bbb7392 Mon Sep 17 00:00:00 2001 From: adelavega Date: Tue, 16 Oct 2018 17:07:52 -0500 Subject: [PATCH 04/14] Refer to proper input, index_derivatives --- nipype/interfaces/io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index 3aaab428bf..303c808263 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -2843,7 +2843,7 @@ def _run_interface(self, runtime): def _list_outputs(self): layout = bidslayout.BIDSLayout(self.inputs.base_dir, - derivatives=self.inputs.derivatives) + derivatives=self.inputs.index_derivatives) if isdefined(self.inputs.extra_derivatives): layout.add_derivatives(self.inputs.extra_derivatives) From cc89c582cda5eeaeb6b958e7525f3678a92ced28 Mon Sep 17 00:00:00 2001 From: adelavega Date: Fri, 19 Oct 2018 11:05:10 -0700 Subject: [PATCH 05/14] Datatype not modality, in pybids tests --- nipype/interfaces/io.py | 2 +- nipype/interfaces/tests/test_io.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index 303c808263..c64d01e795 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -2793,7 +2793,7 @@ class BIDSDataGrabber(IOBase): >>> bg = BIDSDataGrabber(infields = ['subject']) >>> bg.inputs.base_dir = 'ds005/' >>> bg.inputs.subject = '01' - >>> bg.inputs.output_query['dwi'] = dict(modality='dwi') + >>> bg.inputs.output_query['dwi'] = dict(datatype='dwi') >>> results = bg.run() # doctest: +SKIP """ diff --git a/nipype/interfaces/tests/test_io.py b/nipype/interfaces/tests/test_io.py index f00555e521..b4ac80366b 100644 --- a/nipype/interfaces/tests/test_io.py +++ b/nipype/interfaces/tests/test_io.py @@ -607,7 +607,7 @@ def test_bids_fields(tmpdir): bg = nio.BIDSDataGrabber(infields = ['subject'], outfields = ['dwi']) bg.inputs.base_dir = os.path.join(datadir, 'ds005') bg.inputs.subject = '01' - bg.inputs.output_query['dwi'] = dict(modality='dwi') + bg.inputs.output_query['dwi'] = dict(datatype='dwi') results = bg.run() assert 'sub-01_dwi.nii.gz' in map(os.path.basename, results.outputs.dwi) From a0e92f17b234b16898d813771be6ce7512e5b119 Mon Sep 17 00:00:00 2001 From: delavega4 Date: Fri, 11 Jan 2019 13:44:17 -0500 Subject: [PATCH 06/14] Lint BIDSGrabbder --- nipype/interfaces/io.py | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index 84978316a0..f90afdac05 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -2721,20 +2721,25 @@ def _list_outputs(self): class BIDSDataGrabberInputSpec(DynamicTraitedSpec): - base_dir = Directory(exists=True, - desc='Path to BIDS Directory.', - mandatory=True) - output_query = traits.Dict(key_trait=Str, - value_trait=traits.Dict, - desc='Queries for outfield outputs') - raise_on_empty = traits.Bool(True, usedefault=True, - desc='Generate exception if list is empty ' - 'for a given field') - return_type = traits.Enum('file', 'namedtuple', usedefault=True) - index_derivatives = traits.Bool(False, usedefault=True, - desc='Index derivatives/ sub-directory') - extra_derivatives = traits.List(Directory(exists=True), - desc='Additional derivative directories to index') + base_dir = Directory( + exists=True, + desc='Path to BIDS Directory.', + mandatory=True) + output_query = traits.Dict( + key_trait=Str, + value_trait=traits.Dict, + desc='Queries for outfield outputs') + raise_on_empty = traits.Bool( + True, usedefault=True, + desc='Generate exception if list is empty for a given field') + return_type = traits.Enum( + 'file', 'namedtuple', usedefault=True) + index_derivatives = traits.Bool( + False, usedefault=True, + desc='Index derivatives/ sub-directory') + extra_derivatives = traits.List( + Directory(exists=True), + desc='Additional derivative directories to index') class BIDSDataGrabber(LibraryBaseInterface, IOBase): @@ -2786,13 +2791,14 @@ def __init__(self, infields=None, **kwargs): "bold": {"datatype": "func", "suffix": "bold", "extensions": ["nii", ".nii.gz"]}, "T1w": {"datatype": "anat", "suffix": "T1w", - "extensions": ["nii", ".nii.gz"]}, + "extensions": ["nii", ".nii.gz"]}, } # If infields is empty, use all BIDS entities if infields is None: from bids import layout as bidslayout - bids_config = join(dirname(bidslayout.__file__), 'config', 'bids.json') + bids_config = join( + dirname(bidslayout.__file__), 'config', 'bids.json') bids_config = json.load(open(bids_config, 'r')) infields = [i['name'] for i in bids_config['entities']] @@ -2809,7 +2815,7 @@ def __init__(self, infields=None, **kwargs): def _list_outputs(self): from bids import BIDSLayout layout = BIDSLayout(self.inputs.base_dir, - derivatives=self.inputs.index_derivatives) + derivatives=self.inputs.index_derivatives) if isdefined(self.inputs.extra_derivatives): layout.add_derivatives(self.inputs.extra_derivatives) From 0f94d9da4d7b8e3b21b4e8859a20ab0986117653 Mon Sep 17 00:00:00 2001 From: delavega4 Date: Fri, 11 Jan 2019 13:51:29 -0500 Subject: [PATCH 07/14] Bump pybids version to 0.7.0 --- .travis.yml | 4 ++-- docker/generate_dockerfiles.sh | 2 +- nipype/info.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 235bf9892c..56fc6ea7f7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,8 +86,8 @@ before_install: fi; - travis_retry pip install -r requirements.txt -- travis_retry pip install grabbit==0.1.2 -- travis_retry git clone https://github.com/INCF/pybids.git ${HOME}/pybids && pip install -e ${HOME}/pybids +- travis_retry pip install grabbit==0.2.6 +- travis_retry pip install git+git@github.com:bids-standard/pybids.git@0.7.0#egg=pybids install: - travis_retry pip install $EXTRA_PIP_FLAGS -e .[$NIPYPE_EXTRAS] diff --git a/docker/generate_dockerfiles.sh b/docker/generate_dockerfiles.sh index 9c281f8bbc..31b43d62b6 100755 --- a/docker/generate_dockerfiles.sh +++ b/docker/generate_dockerfiles.sh @@ -92,7 +92,7 @@ function generate_main_dockerfile() { conda_install='python=${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} icu=58.1 libxml2 libxslt matplotlib mkl numpy paramiko pandas psutil scikit-learn scipy traits=4.6.0' \ - pip_install="grabbit==0.1.2 https://github.com/INCF/pybids/tarball/0.6.5" \ + pip_install="grabbit==0.2.6 https://github.com/bids-standard/pybids/tarball/0.7.0" \ activate=true \ --copy docker/files/run_builddocs.sh docker/files/run_examples.sh \ docker/files/run_pytests.sh nipype/external/fsl_imglob.py /usr/bin/ \ diff --git a/nipype/info.py b/nipype/info.py index c6503ac753..bdf020d76d 100644 --- a/nipype/info.py +++ b/nipype/info.py @@ -169,7 +169,7 @@ def get_nipype_gitversion(): 'profiler': ['psutil>=5.0'], 'duecredit': ['duecredit'], 'xvfbwrapper': ['xvfbwrapper'], - 'pybids': ['pybids==0.6.5'], + 'pybids': ['pybids==0.7.0'], 'ssh': ['paramiko'], # 'mesh': ['mayavi'] # Enable when it works } From 77a051013856fbd12bb0be3a499c0f918aeaa75b Mon Sep 17 00:00:00 2001 From: delavega4 Date: Fri, 11 Jan 2019 14:39:32 -0500 Subject: [PATCH 08/14] use https for travis pybids requirement --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 56fc6ea7f7..a762a02d00 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,7 +87,7 @@ before_install: - travis_retry pip install -r requirements.txt - travis_retry pip install grabbit==0.2.6 -- travis_retry pip install git+git@github.com:bids-standard/pybids.git@0.7.0#egg=pybids +- travis_retry pip install git+https://github.com/bids-standard/pybids.git@0.7.0#egg=pybids install: - travis_retry pip install $EXTRA_PIP_FLAGS -e .[$NIPYPE_EXTRAS] From 5590d4dc43d838301c4931289894f8e4bab24420 Mon Sep 17 00:00:00 2001 From: delavega4 Date: Mon, 14 Jan 2019 11:48:10 -0500 Subject: [PATCH 09/14] Re-enable editable mode, and run tests in Python 2 --- .travis.yml | 2 +- nipype/interfaces/tests/test_io.py | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index a762a02d00..b1bc985cd4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,7 +87,7 @@ before_install: - travis_retry pip install -r requirements.txt - travis_retry pip install grabbit==0.2.6 -- travis_retry pip install git+https://github.com/bids-standard/pybids.git@0.7.0#egg=pybids +- travis_retry pip install -e git+https://github.com/bids-standard/pybids.git@0.7.0#egg=pybids install: - travis_retry pip install $EXTRA_PIP_FLAGS -e .[$NIPYPE_EXTRAS] diff --git a/nipype/interfaces/tests/test_io.py b/nipype/interfaces/tests/test_io.py index b4ac80366b..4420e4a49c 100644 --- a/nipype/interfaces/tests/test_io.py +++ b/nipype/interfaces/tests/test_io.py @@ -581,8 +581,6 @@ def test_jsonsink(tmpdir, inputs_attributes): # There are three reasons these tests will be skipped: @pytest.mark.skipif(not have_pybids, reason="Pybids is not installed") -@pytest.mark.skipif(sys.version_info < (3, 0), - reason="Pybids no longer supports Python 2") @pytest.mark.skipif(not dist_is_editable('pybids'), reason="Pybids is not installed in editable mode") def test_bids_grabber(tmpdir): @@ -598,8 +596,6 @@ def test_bids_grabber(tmpdir): @pytest.mark.skipif(not have_pybids, reason="Pybids is not installed") -@pytest.mark.skipif(sys.version_info < (3, 0), - reason="Pybids no longer supports Python 2") @pytest.mark.skipif(not dist_is_editable('pybids'), reason="Pybids is not installed in editable mode") def test_bids_fields(tmpdir): @@ -614,8 +610,6 @@ def test_bids_fields(tmpdir): @pytest.mark.skipif(not have_pybids, reason="Pybids is not installed") -@pytest.mark.skipif(sys.version_info < (3, 0), - reason="Pybids no longer supports Python 2") @pytest.mark.skipif(not dist_is_editable('pybids'), reason="Pybids is not installed in editable mode") def test_bids_infields_outfields(tmpdir): From b75bf7cc13301b7732565cc3a430e28098b69170 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Tue, 22 Jan 2019 10:44:53 -0600 Subject: [PATCH 10/14] Update nipype/info.py Co-Authored-By: adelavega --- nipype/info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/info.py b/nipype/info.py index 9d4b04efd3..3350e93ef6 100644 --- a/nipype/info.py +++ b/nipype/info.py @@ -176,7 +176,7 @@ def get_nipype_gitversion(): 'profiler': ['psutil>=5.0'], 'duecredit': ['duecredit'], 'xvfbwrapper': ['xvfbwrapper'], - 'pybids': ['pybids==0.7.0'], + 'pybids': ['pybids>=0.7.0'], 'ssh': ['paramiko'], # 'mesh': ['mayavi'] # Enable when it works } From 7105cb541d4491cd79137a6ab947035bf78d312d Mon Sep 17 00:00:00 2001 From: delavega4 Date: Tue, 22 Jan 2019 10:47:02 -0600 Subject: [PATCH 11/14] Remove return type named tuple --- nipype/interfaces/io.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index f90afdac05..e085dad2cd 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -2732,8 +2732,6 @@ class BIDSDataGrabberInputSpec(DynamicTraitedSpec): raise_on_empty = traits.Bool( True, usedefault=True, desc='Generate exception if list is empty for a given field') - return_type = traits.Enum( - 'file', 'namedtuple', usedefault=True) index_derivatives = traits.Bool( False, usedefault=True, desc='Index derivatives/ sub-directory') @@ -2831,7 +2829,7 @@ def _list_outputs(self): for key, query in self.inputs.output_query.items(): args = query.copy() args.update(filters) - filelist = layout.get(return_type=self.inputs.return_type, **args) + filelist = layout.get(return_type='file', **args) if len(filelist) == 0: msg = 'Output key: %s returned no files' % key if self.inputs.raise_on_empty: From 75a5a2be76a229614f7e2de6d87c2c141b8fdfb4 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Tue, 22 Jan 2019 10:47:52 -0600 Subject: [PATCH 12/14] Update nipype/interfaces/io.py Mandatory index_derivatives Co-Authored-By: adelavega --- nipype/interfaces/io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index f90afdac05..85d3c9e35c 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -2735,7 +2735,7 @@ class BIDSDataGrabberInputSpec(DynamicTraitedSpec): return_type = traits.Enum( 'file', 'namedtuple', usedefault=True) index_derivatives = traits.Bool( - False, usedefault=True, + False, mandatory=True, usedefault=True, desc='Index derivatives/ sub-directory') extra_derivatives = traits.List( Directory(exists=True), From b623cddcb2c0cfe6cf18f49bade97def88432070 Mon Sep 17 00:00:00 2001 From: delavega4 Date: Tue, 22 Jan 2019 12:47:37 -0600 Subject: [PATCH 13/14] remake specs --- nipype/interfaces/tests/test_auto_BIDSDataGrabber.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nipype/interfaces/tests/test_auto_BIDSDataGrabber.py b/nipype/interfaces/tests/test_auto_BIDSDataGrabber.py index 8acdcc9787..24cbda657b 100644 --- a/nipype/interfaces/tests/test_auto_BIDSDataGrabber.py +++ b/nipype/interfaces/tests/test_auto_BIDSDataGrabber.py @@ -6,10 +6,13 @@ def test_BIDSDataGrabber_inputs(): input_map = dict( base_dir=dict(mandatory=True, ), + extra_derivatives=dict(), + index_derivatives=dict( + mandatory=True, + usedefault=True, + ), output_query=dict(), raise_on_empty=dict(usedefault=True, ), - return_type=dict(usedefault=True, ), - strict=dict(), ) inputs = BIDSDataGrabber.input_spec() From aeda06a840994bd39e6fdf614a73fdb4bec5cb09 Mon Sep 17 00:00:00 2001 From: delavega4 Date: Tue, 22 Jan 2019 15:58:06 -0600 Subject: [PATCH 14/14] Add FSL auto test --- .../fsl/tests/test_auto_EddyQuad.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 nipype/interfaces/fsl/tests/test_auto_EddyQuad.py diff --git a/nipype/interfaces/fsl/tests/test_auto_EddyQuad.py b/nipype/interfaces/fsl/tests/test_auto_EddyQuad.py new file mode 100644 index 0000000000..4302cdc312 --- /dev/null +++ b/nipype/interfaces/fsl/tests/test_auto_EddyQuad.py @@ -0,0 +1,65 @@ +# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT +from __future__ import unicode_literals +from ..epi import EddyQuad + + +def test_EddyQuad_inputs(): + input_map = dict( + args=dict(argstr='%s', ), + base_name=dict( + argstr='%s', + position=0, + usedefault=True, + ), + bval_file=dict( + argstr='--bvals=%s', + mandatory=True, + ), + bvec_file=dict(argstr='--bvecs=%s', ), + environ=dict( + nohash=True, + usedefault=True, + ), + field=dict(argstr='--field=%s', ), + idx_file=dict( + argstr='--eddyIdx=%s', + mandatory=True, + ), + mask_file=dict( + argstr='--mask=%s', + mandatory=True, + ), + output_dir=dict( + argstr='--output-dir=%s', + name_source=['base_name'], + name_template='%s.qc', + ), + output_type=dict(), + param_file=dict( + argstr='--eddyParams=%s', + mandatory=True, + ), + slice_spec=dict(argstr='--slspec=%s', ), + verbose=dict(argstr='--verbose', ), + ) + inputs = EddyQuad.input_spec() + + for key, metadata in list(input_map.items()): + for metakey, value in list(metadata.items()): + assert getattr(inputs.traits()[key], metakey) == value +def test_EddyQuad_outputs(): + output_map = dict( + avg_b0_pe_png=dict(), + avg_b_png=dict(), + clean_volumes=dict(), + cnr_png=dict(), + qc_json=dict(), + qc_pdf=dict(), + residuals=dict(), + vdm_png=dict(), + ) + outputs = EddyQuad.output_spec() + + for key, metadata in list(output_map.items()): + for metakey, value in list(metadata.items()): + assert getattr(outputs.traits()[key], metakey) == value