From beacb0a668176791aad9f4c5a9538ed26bed9172 Mon Sep 17 00:00:00 2001 From: oesteban Date: Mon, 26 Nov 2018 10:46:38 -0800 Subject: [PATCH] [TST] Improve py.test configuration of doctests This PR ensures that doctests are run OUTSIDE nipype's source directory in all the cases. Previously, doctests would chdir into the testing/data folder and some interfaces would generate results. Also, deletes ``nipype/testing/data/slice_timing.1D``, which seems to have seaked into the tree for these very reasons in some past PR. --- nipype/conftest.py | 38 ++++++++++++++++++++------ nipype/interfaces/ants/registration.py | 20 +++++++------- nipype/interfaces/bru2nii.py | 2 +- nipype/pipeline/plugins/lsf.py | 2 +- nipype/testing/data/slice_timing.1D | 1 - 5 files changed, 42 insertions(+), 21 deletions(-) delete mode 100644 nipype/testing/data/slice_timing.1D diff --git a/nipype/conftest.py b/nipype/conftest.py index 9e646a2a4f..9a9175ce28 100644 --- a/nipype/conftest.py +++ b/nipype/conftest.py @@ -1,21 +1,43 @@ +import os +import shutil +from tempfile import mkdtemp import pytest import numpy -import os +import py.path as pp -DATADIR = os.path.realpath( +NIPYPE_DATADIR = os.path.realpath( os.path.join(os.path.dirname(__file__), 'testing/data')) +temp_folder = mkdtemp() +data_dir = os.path.join(temp_folder, 'data') +shutil.copytree(NIPYPE_DATADIR, data_dir) @pytest.fixture(autouse=True) def add_np(doctest_namespace): doctest_namespace['np'] = numpy doctest_namespace['os'] = os - - doctest_namespace["datadir"] = DATADIR + doctest_namespace["datadir"] = data_dir @pytest.fixture(autouse=True) -def in_testing(request): - # This seems to be a reliable way to distinguish tests from doctests - if request.function is None: - os.chdir(DATADIR) +def _docdir(request): + """Grabbed from https://stackoverflow.com/a/46991331""" + # Trigger ONLY for the doctests. + doctest_plugin = request.config.pluginmanager.getplugin("doctest") + if isinstance(request.node, doctest_plugin.DoctestItem): + + # Get the fixture dynamically by its name. + tmpdir = pp.local(data_dir) + + # Chdir only for the duration of the test. + with tmpdir.as_cwd(): + yield + + else: + # For normal tests, we have to yield, since this is a yield-fixture. + yield + + +def pytest_unconfigure(config): + # Delete temp folder after session is finished + shutil.rmtree(temp_folder) diff --git a/nipype/interfaces/ants/registration.py b/nipype/interfaces/ants/registration.py index 9d3b07e96a..556c19bf17 100644 --- a/nipype/interfaces/ants/registration.py +++ b/nipype/interfaces/ants/registration.py @@ -736,17 +736,17 @@ class Registration(ANTSCommand): >>> reg4.inputs.collapse_output_transforms = True >>> outputs = reg4._list_outputs() >>> pprint.pprint(outputs) # doctest: +ELLIPSIS, - {'composite_transform': '.../nipype/testing/data/output_Composite.h5', + {'composite_transform': '...data/output_Composite.h5', 'elapsed_time': , 'forward_invert_flags': [], 'forward_transforms': [], - 'inverse_composite_transform': '.../nipype/testing/data/output_InverseComposite.h5', + 'inverse_composite_transform': '...data/output_InverseComposite.h5', 'inverse_warped_image': , 'metric_value': , 'reverse_invert_flags': [], 'reverse_transforms': [], - 'save_state': '.../nipype/testing/data/trans.mat', - 'warped_image': '.../nipype/testing/data/output_warped_image.nii.gz'} + 'save_state': '...data/trans.mat', + 'warped_image': '...data/output_warped_image.nii.gz'} >>> reg4.cmdline 'antsRegistration --collapse-output-transforms 1 --dimensionality 3 --initial-moving-transform [ trans.mat, 1 ] \ --initialize-transforms-per-stage 1 --interpolation Linear --output [ output_, output_warped_image.nii.gz ] \ @@ -767,16 +767,16 @@ class Registration(ANTSCommand): {'composite_transform': , 'elapsed_time': , 'forward_invert_flags': [False, False], - 'forward_transforms': ['.../nipype/testing/data/output_0GenericAffine.mat', - '.../nipype/testing/data/output_1Warp.nii.gz'], + 'forward_transforms': ['...data/output_0GenericAffine.mat', + '...data/output_1Warp.nii.gz'], 'inverse_composite_transform': , 'inverse_warped_image': , 'metric_value': , 'reverse_invert_flags': [True, False], - 'reverse_transforms': ['.../nipype/testing/data/output_0GenericAffine.mat', \ - '.../nipype/testing/data/output_1InverseWarp.nii.gz'], - 'save_state': '.../nipype/testing/data/trans.mat', - 'warped_image': '.../nipype/testing/data/output_warped_image.nii.gz'} + 'reverse_transforms': ['...data/output_0GenericAffine.mat', \ + '...data/output_1InverseWarp.nii.gz'], + 'save_state': '...data/trans.mat', + 'warped_image': '...data/output_warped_image.nii.gz'} >>> reg4b.aggregate_outputs() # doctest: +SKIP >>> reg4b.cmdline 'antsRegistration --collapse-output-transforms 1 --dimensionality 3 --initial-moving-transform [ trans.mat, 1 ] \ diff --git a/nipype/interfaces/bru2nii.py b/nipype/interfaces/bru2nii.py index 4261f308a9..9c6a5c6acf 100644 --- a/nipype/interfaces/bru2nii.py +++ b/nipype/interfaces/bru2nii.py @@ -47,7 +47,7 @@ class Bru2(CommandLine): >>> converter = Bru2() >>> converter.inputs.input_dir = "brukerdir" >>> converter.cmdline # doctest: +ELLIPSIS - 'Bru2 -o .../nipype/testing/data/brukerdir brukerdir' + 'Bru2 -o .../data/brukerdir brukerdir' """ input_spec = Bru2InputSpec output_spec = Bru2OutputSpec diff --git a/nipype/pipeline/plugins/lsf.py b/nipype/pipeline/plugins/lsf.py index bdaabc31e6..c96a1bf44d 100644 --- a/nipype/pipeline/plugins/lsf.py +++ b/nipype/pipeline/plugins/lsf.py @@ -113,7 +113,7 @@ def _submit_batchtask(self, scriptfile, node): break iflogger.setLevel(oldlevel) # retrieve lsf taskid - match = re.search('<(\d*)>', result.runtime.stdout) + match = re.search(r'<(\d*)>', result.runtime.stdout) if match: taskid = int(match.groups()[0]) else: diff --git a/nipype/testing/data/slice_timing.1D b/nipype/testing/data/slice_timing.1D deleted file mode 100644 index f240e0d513..0000000000 --- a/nipype/testing/data/slice_timing.1D +++ /dev/null @@ -1 +0,0 @@ -0.0 0.4 0.8 1.2 1.6 2.0 2.4 2.8 3.2 3.6 4.0 4.4 4.8 5.2 5.6 6.0 6.4 6.8 7.2 7.6 8.0 8.4 8.8 9.2 9.6 10.0 10.4 10.8 11.2 11.6 12.0 12.4 12.8 13.2 13.6 14.0 14.4 14.8 15.2 15.6 \ No newline at end of file