diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index 3f46c9866d..7f14b0e796 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -827,15 +827,19 @@ def _run_interface(self, runtime): ): for key, vals in self.result.iteritems(): self.result[key] = vals[0] + else: + #sort all keys acording to out_paths + for key in self.result.keys(): + if key == "out_paths": + continue + sort_tuples = human_order_sorted(zip(self.result["out_paths"], + self.result[key])) + self.result[key] = [x for (_, x) in sort_tuples] + self.result["out_paths"] = human_order_sorted(self.result["out_paths"]) + if not self.result: raise RuntimeError("Regular expression did not match any files!") - - #sort all keys acording to out_paths - for key in self.result.keys(): - if key == "out_paths": - continue - self.result[key] = [x for (_,x) in human_order_sorted(zip(self.result["out_paths"], self.result[key]))] - self.result["out_paths"] = human_order_sorted(self.result["out_paths"]) + return runtime def _list_outputs(self): diff --git a/nipype/interfaces/tests/test_io.py b/nipype/interfaces/tests/test_io.py index 5f67d9bfba..07fcb89040 100644 --- a/nipype/interfaces/tests/test_io.py +++ b/nipype/interfaces/tests/test_io.py @@ -171,27 +171,68 @@ def test_datasink_copydir(): shutil.rmtree(outdir) shutil.rmtree(pth) + def test_datafinder_copydir(): outdir = mkdtemp() open(os.path.join(outdir, "findme.txt"), 'a').close() open(os.path.join(outdir, "dontfindme"), 'a').close() + open(os.path.join(outdir, "dontfindmealsotxt"), 'a').close() open(os.path.join(outdir, "findmetoo.txt"), 'a').close() + open(os.path.join(outdir, "ignoreme.txt"), 'a').close() + open(os.path.join(outdir, "alsoignore.txt"), 'a').close() from nipype.interfaces.io import DataFinder df = DataFinder() df.inputs.root_paths = outdir - df.inputs.match_regex = '.+/(?P.+).txt' + df.inputs.match_regex = '.+/(?P.+)\.txt' + df.inputs.ignore_regexes = ['ignore'] result = df.run() expected = ["findme.txt", "findmetoo.txt"] for path, expected_fname in zip(result.outputs.out_paths, expected): _, fname = os.path.split(path) yield assert_equal, fname, expected_fname - + yield assert_equal, result.outputs.basename, ["findme", "findmetoo"] shutil.rmtree(outdir) +def test_datafinder_depth(): + outdir = mkdtemp() + os.makedirs(os.path.join(outdir, '0', '1', '2', '3')) + + from nipype.interfaces.io import DataFinder + df = DataFinder() + df.inputs.root_paths = os.path.join(outdir, '0') + for min_depth in range(4): + for max_depth in range(min_depth, 4): + df.inputs.min_depth = min_depth + df.inputs.max_depth = max_depth + result = df.run() + expected = [str(x) for x in range(min_depth, max_depth + 1)] + for path, exp_fname in zip(result.outputs.out_paths, expected): + _, fname = os.path.split(path) + yield assert_equal, fname, exp_fname + + shutil.rmtree(outdir) + + +def test_datafinder_unpack(): + outdir = mkdtemp() + single_res = os.path.join(outdir, "findme.txt") + open(single_res, 'a').close() + open(os.path.join(outdir, "dontfindme"), 'a').close() + + from nipype.interfaces.io import DataFinder + df = DataFinder() + df.inputs.root_paths = outdir + df.inputs.match_regex = '.+/(?P.+)\.txt' + df.inputs.unpack_single = True + result = df.run() + print result.outputs.out_paths + yield assert_equal, result.outputs.out_paths, single_res + + def test_freesurfersource(): fss = nio.FreeSurferSource() yield assert_equal, fss.inputs.hemi, 'both'