Skip to content

Commit c250501

Browse files
committed
redo split
1 parent cf62963 commit c250501

File tree

5 files changed

+93
-81
lines changed

5 files changed

+93
-81
lines changed

pydra/tasks/fsl/utils/split.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22
from pydra import ShellCommandTask
33
import typing as ty
44

5+
6+
def Split_output(inputs):
7+
import os, glob
8+
9+
output_dir = os.getcwd()
10+
return sorted(glob.glob(output_dir, f"{inputs.output_basename}*.*"))
11+
12+
513
input_fields = [
614
(
715
"in_file",
@@ -29,15 +37,37 @@
2937
},
3038
),
3139
]
32-
Split_input_spec = specs.SpecInfo(name="Input", fields=input_fields, bases=(specs.ShellSpec,))
40+
Split_input_spec = specs.SpecInfo(
41+
name="Input", fields=input_fields, bases=(specs.ShellSpec,)
42+
)
3343

34-
output_fields = []
44+
output_fields = [
45+
(
46+
"out_files",
47+
specs.MultiOutputFile,
48+
{
49+
"requires": ["in_file", "output_basename", "dimension"],
50+
"callable": "Split_output",
51+
},
52+
)
53+
]
3554
Split_output_spec = specs.SpecInfo(
3655
name="Output", fields=output_fields, bases=(specs.ShellOutSpec,)
3756
)
3857

3958

4059
class Split(ShellCommandTask):
60+
"""
61+
Example
62+
-------
63+
>>> task = Split()
64+
>>> task.inputs.in_file = "test.nii.gz"
65+
>>> task.inputs.output_basename = "test_split"
66+
>>> task.inputs.dimension = "t"
67+
>>> task.cmdline
68+
'fslsplit test.nii.gz test_split -t'
69+
"""
70+
4171
input_spec = Split_input_spec
4272
output_spec = Split_output_spec
4373
executable = "fslsplit"

pydra/tasks/fsl/utils/tests/test_run_split.py

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,22 @@
33
from ..split import Split
44

55

6-
@pytest.mark.xfail("FSLDIR" not in os.environ, reason="no FSL found", raises=FileNotFoundError)
7-
@pytest.mark.parametrize("inputs, outputs", [])
6+
@pytest.mark.xfail(
7+
"FSLDIR" not in os.environ, reason="no FSL found", raises=FileNotFoundError
8+
)
9+
@pytest.mark.parametrize(
10+
"inputs, outputs",
11+
[
12+
(
13+
{
14+
"in_file": "test.nii.gz",
15+
"output_basename": "test_split",
16+
"dimension": "t",
17+
},
18+
["out_files"],
19+
)
20+
],
21+
)
822
def test_Split(test_data, inputs, outputs):
923
if inputs is None:
1024
in_file = Path(test_data) / "test.nii.gz"
@@ -31,42 +45,13 @@ def test_Split(test_data, inputs, outputs):
3145
except:
3246
pass
3347
task = Split(**inputs)
34-
assert set(task.generated_output_names) == set(["return_code", "stdout", "stderr"] + outputs)
48+
assert set(task.generated_output_names) == set(
49+
["return_code", "stdout", "stderr"] + outputs
50+
)
3551
res = task()
3652
print("RESULT: ", res)
3753
for out_nm in outputs:
3854
if isinstance(getattr(res.output, out_nm), list):
3955
assert [os.path.exists(x) for x in getattr(res.output, out_nm)]
4056
else:
4157
assert os.path.exists(getattr(res.output, out_nm))
42-
43-
44-
@pytest.mark.parametrize("inputs, error", [(None, "AttributeError")])
45-
def test_Split_exception(test_data, inputs, error):
46-
if inputs is None:
47-
in_file = Path(test_data) / "test.nii.gz"
48-
task = Split(in_file=in_file)
49-
else:
50-
for key, val in inputs.items():
51-
try:
52-
pattern = r"\.[a-zA-Z]*"
53-
if isinstance(val, str):
54-
if re.findall(pattern, val) != []:
55-
inputs[key] = Path(test_data) / val
56-
elif "_dir" in key:
57-
dirpath = Path(test_data) / val
58-
if dirpath.exists() and dirpath.is_dir():
59-
shutil.rmtree(dirpath)
60-
inputs[key] = Path(test_data) / val
61-
else:
62-
inputs[key] = eval(val)
63-
elif isinstance(val, list):
64-
if all(re.findall(pattern, _) != [] for _ in val):
65-
inputs[key] = [Path(test_data) / _ for _ in val]
66-
else:
67-
inputs[key] = eval(val)
68-
except:
69-
pass
70-
task = Split(**inputs)
71-
with pytest.raises(eval(error)):
72-
task.generated_output_names

pydra/tasks/fsl/utils/tests/test_spec_split.py

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,19 @@
33
from ..split import Split
44

55

6-
@pytest.mark.parametrize("inputs, outputs", [])
6+
@pytest.mark.parametrize(
7+
"inputs, outputs",
8+
[
9+
(
10+
{
11+
"in_file": "test.nii.gz",
12+
"output_basename": "test_split",
13+
"dimension": "t",
14+
},
15+
["out_files"],
16+
)
17+
],
18+
)
719
def test_Split(test_data, inputs, outputs):
820
if inputs is None:
921
in_file = Path(test_data) / "test.nii.gz"
@@ -30,35 +42,6 @@ def test_Split(test_data, inputs, outputs):
3042
except:
3143
pass
3244
task = Split(**inputs)
33-
assert set(task.generated_output_names) == set(["return_code", "stdout", "stderr"] + outputs)
34-
35-
36-
@pytest.mark.parametrize("inputs, error", [(None, "AttributeError")])
37-
def test_Split_exception(test_data, inputs, error):
38-
if inputs is None:
39-
in_file = Path(test_data) / "test.nii.gz"
40-
task = Split(in_file=in_file)
41-
else:
42-
for key, val in inputs.items():
43-
try:
44-
pattern = r"\.[a-zA-Z]*"
45-
if isinstance(val, str):
46-
if re.findall(pattern, val) != []:
47-
inputs[key] = Path(test_data) / val
48-
elif "_dir" in key:
49-
dirpath = Path(test_data) / val
50-
if dirpath.exists() and dirpath.is_dir():
51-
shutil.rmtree(dirpath)
52-
inputs[key] = Path(test_data) / val
53-
else:
54-
inputs[key] = eval(val)
55-
elif isinstance(val, list):
56-
if all(re.findall(pattern, _) != [] for _ in val):
57-
inputs[key] = [Path(test_data) / _ for _ in val]
58-
else:
59-
inputs[key] = eval(val)
60-
except:
61-
pass
62-
task = Split(**inputs)
63-
with pytest.raises(eval(error)):
64-
task.generated_output_names
45+
assert set(task.generated_output_names) == set(
46+
["return_code", "stdout", "stderr"] + outputs
47+
)

specs/callables.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -392,13 +392,19 @@ def MELODIC_output(field, inputs):
392392
return outputs
393393

394394

395-
def SLICE_output(inputs):
396-
import glob
395+
# def SLICE_output(inputs):
396+
# import glob
397397

398-
suffix = "slice_*"
399-
if inputs.out_base_name:
400-
fname_template = f"{inputs.out_base_name}_{suffix}"
401-
else:
402-
fname_template = f"{inputs.in_file}_{suffix}"
398+
# suffix = "slice_*"
399+
# if inputs.out_base_name:
400+
# fname_template = f"{inputs.out_base_name}_{suffix}"
401+
# else:
402+
# fname_template = f"{inputs.in_file}_{suffix}"
403+
404+
# return sorted(glob(fname_template))
405+
406+
def Split_output(inputs):
407+
import os, glob
403408

404-
return sorted(glob(fname_template))
409+
output_dir = os.getcwd()
410+
return sorted(glob.glob(output_dir, f"{inputs.output_basename}*.*"))

specs/fsl_utils_param.yml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,21 @@ Smooth:
332332

333333
Split:
334334
output_requirements:
335-
out_file: [in_file, dimension]
336-
output_templates:
335+
out_files: [in_file, output_basename, dimension]
336+
output_callables:
337+
out_files: Split_output
337338
doctest:
339+
in_file: test.nii.gz
340+
output_basename: test_split
341+
dimension: t
342+
cmdline: fslsplit test.nii.gz test_split -t
343+
338344
tests_inputs:
339-
-
345+
- in_file: test.nii.gz
346+
output_basename: test_split
347+
dimension: t
340348
tests_outputs:
341-
- AttributeError
349+
- [out_files]
342350

343351
SwapDimensions:
344352
output_requirements:

0 commit comments

Comments
 (0)