Skip to content

Commit 16c621d

Browse files
committed
refactor, added tests
1 parent 3d225dc commit 16c621d

File tree

3 files changed

+118
-63
lines changed

3 files changed

+118
-63
lines changed

bin/nipype_cmd

Lines changed: 2 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,8 @@
11
#!/usr/bin/env python
22
# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
33
# vi: set ft=python sts=4 ts=4 sw=4 et:
4-
"""Script to auto-generate our API docs.
5-
"""
6-
# stdlib imports
7-
import os
8-
import argparse
94
import sys
10-
import inspect
11-
from nipype.interfaces.base import Interface
5+
from nipype.utils.nipype_cmd import main
126

13-
14-
def listClasses(module=None):
15-
if module:
16-
__import__(module)
17-
pkg = sys.modules[module]
18-
print "Available Interfaces:"
19-
for k,v in pkg.__dict__.items():
20-
if inspect.isclass(v) and issubclass(v, Interface):
21-
print "\t%s"%k
22-
23-
def add_options(parser=None, module=None, function=None):
24-
interface = None
25-
if parser and module and function:
26-
__import__(module)
27-
interface = getattr(sys.modules[module],function)()
28-
29-
for k,v in interface.inputs.items():
30-
if hasattr(v, "mandatory") and v.mandatory:
31-
parser.add_argument(k, help=v.desc)
32-
else:
33-
parser.add_argument("--%s"%k, dest=k,
34-
help=v.desc)
35-
return parser, interface
36-
37-
def run_instance(interface, options):
38-
if interface:
39-
print "setting function inputs"
40-
for k,_ in interface.inputs.items():
41-
if getattr(options, k) != None:
42-
setattr(interface.inputs, k,
43-
getattr(options, k))
44-
print interface.inputs
45-
res = interface.run()
46-
print res.outputs
47-
48-
49-
def parse_args():
50-
51-
if len(sys.argv) == 2 and not sys.argv[1].startswith("-"):
52-
listClasses(sys.argv[1])
53-
return
54-
55-
parser = argparse.ArgumentParser(description='Nipype interface runner')
56-
parser.add_argument("module", type=str, help="Module name")
57-
parser.add_argument("interface", type=str, help="Interface name")
58-
parsed = parser.parse_args(args=sys.argv[1:3])
59-
60-
_, prog = os.path.split(sys.argv[0])
61-
interface_parser = argparse.ArgumentParser(description="Run %s"%parsed.interface, prog=" ".join([prog] + sys.argv[1:3]))
62-
interface_parser, interface = add_options(interface_parser, parsed.module, parsed.interface)
63-
args = interface_parser.parse_args(args=sys.argv[3:])
64-
run_instance(interface, args)
65-
66-
67-
#*****************************************************************************
687
if __name__ == '__main__':
69-
parse_args()
8+
main(sys.argv)

nipype/utils/nipype_cmd.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import os
2+
import argparse
3+
import inspect
4+
import sys
5+
from nipype.interfaces.base import Interface
6+
7+
8+
def listClasses(module=None):
9+
if module:
10+
__import__(module)
11+
pkg = sys.modules[module]
12+
print "Available Interfaces:"
13+
for k,v in pkg.__dict__.items():
14+
if inspect.isclass(v) and issubclass(v, Interface):
15+
print "\t%s"%k
16+
17+
def add_options(parser=None, module=None, function=None):
18+
interface = None
19+
if parser and module and function:
20+
__import__(module)
21+
interface = getattr(sys.modules[module],function)()
22+
23+
for k,v in interface.inputs.items():
24+
if hasattr(v, "mandatory") and v.mandatory:
25+
parser.add_argument(k, help=v.desc)
26+
else:
27+
parser.add_argument("--%s"%k, dest=k,
28+
help=v.desc)
29+
return parser, interface
30+
31+
def run_instance(interface, options):
32+
if interface:
33+
print "setting function inputs"
34+
for input_name, _ in interface.inputs.items():
35+
if getattr(options, input_name) != None:
36+
str_value = getattr(options, input_name)
37+
casted_value = getattr(interface.inputs, input_name)(str_value)
38+
setattr(interface.inputs, input_name,
39+
casted_value)
40+
print interface.inputs
41+
res = interface.run()
42+
print res.outputs
43+
44+
45+
def main(argv):
46+
47+
if len(argv) == 2 and not argv[1].startswith("-"):
48+
listClasses(argv[1])
49+
sys.exit(0)
50+
51+
parser = argparse.ArgumentParser(description='Nipype interface runner')
52+
parser.add_argument("module", type=str, help="Module name")
53+
parser.add_argument("interface", type=str, help="Interface name")
54+
parsed = parser.parse_args(args=argv[1:3])
55+
56+
_, prog = os.path.split(argv[0])
57+
interface_parser = argparse.ArgumentParser(description="Run %s"%parsed.interface, prog=" ".join([prog] + argv[1:3]))
58+
interface_parser, interface = add_options(interface_parser, parsed.module, parsed.interface)
59+
args = interface_parser.parse_args(args=argv[3:])
60+
run_instance(interface, args)

nipype/utils/tests/test_cmd.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env python
2+
3+
from StringIO import StringIO
4+
import unittest, sys
5+
from nipype.utils import nipype_cmd
6+
from contextlib import contextmanager
7+
8+
@contextmanager
9+
def capture_sys_output():
10+
caputure_out, capture_err = StringIO(), StringIO()
11+
current_out, current_err = sys.stdout, sys.stderr
12+
try:
13+
sys.stdout, sys.stderr = caputure_out, capture_err
14+
yield caputure_out, capture_err
15+
finally:
16+
sys.stdout, sys.stderr = current_out, current_err
17+
18+
19+
class TestNipypeCMD(unittest.TestCase):
20+
21+
def test_main_returns_2_on_empty(self):
22+
with self.assertRaises(SystemExit) as cm:
23+
with capture_sys_output() as (stdout, stderr):
24+
nipype_cmd.main(['nipype_cmd'])
25+
26+
exit_exception = cm.exception
27+
self.assertEqual(exit_exception.code, 2)
28+
29+
self.assertEqual(stderr.getvalue(),
30+
"""usage: runfiles.py [-h] module interface
31+
runfiles.py: error: too few arguments
32+
""")
33+
self.assertEqual(stdout.getvalue(), '')
34+
35+
def test_main_returns_0_on_help(self):
36+
with self.assertRaises(SystemExit) as cm:
37+
with capture_sys_output() as (stdout, stderr):
38+
nipype_cmd.main(['nipype_cmd', '-h'])
39+
40+
exit_exception = cm.exception
41+
self.assertEqual(exit_exception.code, 0)
42+
43+
self.assertEqual(stderr.getvalue(), '')
44+
self.assertEqual(stdout.getvalue(),
45+
"""usage: runfiles.py [-h] module interface\n\nNipype interface runner
46+
47+
positional arguments:
48+
module Module name
49+
interface Interface name
50+
51+
optional arguments:
52+
-h, --help show this help message and exit
53+
""")
54+
55+
if __name__ == '__main__':
56+
unittest.main()

0 commit comments

Comments
 (0)