Skip to content

Commit d7a775b

Browse files
authored
Merge pull request #3240 from effigies/fix/export_workflow
FIX: Serialize all interface arguments when exporting workflows
2 parents 87f90dd + fc8e991 commit d7a775b

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

nipype/pipeline/engine/tests/test_utils.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@
1111
from ....interfaces import base as nib
1212
from ....interfaces import utility as niu
1313
from .... import config
14-
from ..utils import clean_working_directory, write_workflow_prov, load_resultfile
14+
from ..utils import (
15+
clean_working_directory,
16+
write_workflow_prov,
17+
load_resultfile,
18+
format_node,
19+
)
1520

1621

1722
class InputSpec(nib.TraitedSpec):
@@ -327,3 +332,11 @@ def test_save_load_resultfile(tmpdir, use_relative):
327332
)
328333

329334
config.set("execution", "use_relative_paths", old_use_relative)
335+
336+
337+
def test_format_node():
338+
node = pe.Node(niu.IdentityInterface(fields=["a", "b"]), name="node")
339+
serialized = format_node(node)
340+
workspace = {"Node": pe.Node}
341+
exec("\n".join(serialized), workspace)
342+
assert workspace["node"].interface._fields == node.interface._fields

nipype/pipeline/engine/utils.py

+6-12
Original file line numberDiff line numberDiff line change
@@ -364,18 +364,12 @@ def format_node(node, format="python", include_config=False):
364364
importline = "from %s import %s" % (klass.__module__, klass.__class__.__name__)
365365
comment = "# Node: %s" % node.fullname
366366
spec = signature(node.interface.__init__)
367-
args = [p.name for p in list(spec.parameters.values())]
368-
args = args[1:]
369-
if args:
370-
filled_args = []
371-
for arg in args:
372-
if hasattr(node.interface, "_%s" % arg):
373-
filled_args.append(
374-
"%s=%s" % (arg, getattr(node.interface, "_%s" % arg))
375-
)
376-
args = ", ".join(filled_args)
377-
else:
378-
args = ""
367+
filled_args = []
368+
for param in spec.parameters.values():
369+
val = getattr(node.interface, f"_{param.name}", None)
370+
if val is not None:
371+
filled_args.append(f"{param.name}={val!r}")
372+
args = ", ".join(filled_args)
379373
klass_name = klass.__class__.__name__
380374
if isinstance(node, MapNode):
381375
nodedef = '%s = MapNode(%s(%s), iterfield=%s, name="%s")' % (

0 commit comments

Comments
 (0)