Skip to content

Commit 8341801

Browse files
committed
Merge pull request #765 from chrisfilo/enh/datafinder_test
Test and sorting for DataFinder
2 parents 9ec0774 + ce0ff04 commit 8341801

File tree

4 files changed

+80
-0
lines changed

4 files changed

+80
-0
lines changed

CHANGES

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
Release 0.9.2 (January 8, 2014)
2+
============
3+
4+
* FIX: DataFinder was broken due to a typo
5+
* FIX: Order of DataFinder outputs was not guaranteed, it's human sorted now
6+
17
Release 0.9.1 (December 25, 2013)
28
============
39

nipype/interfaces/io.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,8 +827,19 @@ def _run_interface(self, runtime):
827827
):
828828
for key, vals in self.result.iteritems():
829829
self.result[key] = vals[0]
830+
else:
831+
#sort all keys acording to out_paths
832+
for key in self.result.keys():
833+
if key == "out_paths":
834+
continue
835+
sort_tuples = human_order_sorted(zip(self.result["out_paths"],
836+
self.result[key]))
837+
self.result[key] = [x for (_, x) in sort_tuples]
838+
self.result["out_paths"] = human_order_sorted(self.result["out_paths"])
839+
830840
if not self.result:
831841
raise RuntimeError("Regular expression did not match any files!")
842+
832843
return runtime
833844

834845
def _list_outputs(self):

nipype/interfaces/tests/test_io.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,67 @@ def test_datasink_copydir():
172172
shutil.rmtree(pth)
173173

174174

175+
def test_datafinder_copydir():
176+
outdir = mkdtemp()
177+
open(os.path.join(outdir, "findme.txt"), 'a').close()
178+
open(os.path.join(outdir, "dontfindme"), 'a').close()
179+
open(os.path.join(outdir, "dontfindmealsotxt"), 'a').close()
180+
open(os.path.join(outdir, "findmetoo.txt"), 'a').close()
181+
open(os.path.join(outdir, "ignoreme.txt"), 'a').close()
182+
open(os.path.join(outdir, "alsoignore.txt"), 'a').close()
183+
184+
from nipype.interfaces.io import DataFinder
185+
df = DataFinder()
186+
df.inputs.root_paths = outdir
187+
df.inputs.match_regex = '.+/(?P<basename>.+)\.txt'
188+
df.inputs.ignore_regexes = ['ignore']
189+
result = df.run()
190+
expected = ["findme.txt", "findmetoo.txt"]
191+
for path, expected_fname in zip(result.outputs.out_paths, expected):
192+
_, fname = os.path.split(path)
193+
yield assert_equal, fname, expected_fname
194+
195+
yield assert_equal, result.outputs.basename, ["findme", "findmetoo"]
196+
197+
shutil.rmtree(outdir)
198+
199+
200+
def test_datafinder_depth():
201+
outdir = mkdtemp()
202+
os.makedirs(os.path.join(outdir, '0', '1', '2', '3'))
203+
204+
from nipype.interfaces.io import DataFinder
205+
df = DataFinder()
206+
df.inputs.root_paths = os.path.join(outdir, '0')
207+
for min_depth in range(4):
208+
for max_depth in range(min_depth, 4):
209+
df.inputs.min_depth = min_depth
210+
df.inputs.max_depth = max_depth
211+
result = df.run()
212+
expected = [str(x) for x in range(min_depth, max_depth + 1)]
213+
for path, exp_fname in zip(result.outputs.out_paths, expected):
214+
_, fname = os.path.split(path)
215+
yield assert_equal, fname, exp_fname
216+
217+
shutil.rmtree(outdir)
218+
219+
220+
def test_datafinder_unpack():
221+
outdir = mkdtemp()
222+
single_res = os.path.join(outdir, "findme.txt")
223+
open(single_res, 'a').close()
224+
open(os.path.join(outdir, "dontfindme"), 'a').close()
225+
226+
from nipype.interfaces.io import DataFinder
227+
df = DataFinder()
228+
df.inputs.root_paths = outdir
229+
df.inputs.match_regex = '.+/(?P<basename>.+)\.txt'
230+
df.inputs.unpack_single = True
231+
result = df.run()
232+
print result.outputs.out_paths
233+
yield assert_equal, result.outputs.out_paths, single_res
234+
235+
175236
def test_freesurfersource():
176237
fss = nio.FreeSurferSource()
177238
yield assert_equal, fss.inputs.hemi, 'both'

nipype/utils/misc.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ def atoi(text):
1717
return int(text) if text.isdigit() else text
1818

1919
def natural_keys(text):
20+
if isinstance(text, tuple):
21+
text = text[0]
2022
return [ atoi(c) for c in re.split('(\d+)', text) ]
2123

2224
return sorted(l, key=natural_keys)

0 commit comments

Comments
 (0)