From 14a304a0aae974dc75ce296506dbd6560b470dd9 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Sat, 15 Aug 2020 10:32:22 -0400 Subject: [PATCH 1/4] TEST: Reproduce gh-3230 --- nipype/pipeline/engine/tests/test_utils.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/nipype/pipeline/engine/tests/test_utils.py b/nipype/pipeline/engine/tests/test_utils.py index 1e86e5a071..0705f0ad53 100644 --- a/nipype/pipeline/engine/tests/test_utils.py +++ b/nipype/pipeline/engine/tests/test_utils.py @@ -11,7 +11,12 @@ from ....interfaces import base as nib from ....interfaces import utility as niu from .... import config -from ..utils import clean_working_directory, write_workflow_prov, load_resultfile +from ..utils import ( + clean_working_directory, + write_workflow_prov, + load_resultfile, + format_node, +) class InputSpec(nib.TraitedSpec): @@ -327,3 +332,11 @@ def test_save_load_resultfile(tmpdir, use_relative): ) config.set("execution", "use_relative_paths", old_use_relative) + + +def test_format_node(): + node = pe.Node(niu.IdentityInterface(fields=["a", "b"]), name="node") + serialized = format_node(node) + workspace = {"Node": pe.Node} + exec("\n".join(serialized), workspace) + assert workspace["node"].interface._fields == node.interface._fields From 6566e6eefae53787e03959e1785cf05a87932a75 Mon Sep 17 00:00:00 2001 From: Matteo Mancini Date: Mon, 3 Aug 2020 11:18:33 +0100 Subject: [PATCH 2/4] Removed line that excluded fields parameter during export. --- nipype/pipeline/engine/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nipype/pipeline/engine/utils.py b/nipype/pipeline/engine/utils.py index d7a65b74de..3d0f078e35 100644 --- a/nipype/pipeline/engine/utils.py +++ b/nipype/pipeline/engine/utils.py @@ -365,7 +365,6 @@ def format_node(node, format="python", include_config=False): comment = "# Node: %s" % node.fullname spec = signature(node.interface.__init__) args = [p.name for p in list(spec.parameters.values())] - args = args[1:] if args: filled_args = [] for arg in args: From 7df2d625a8fb04f1884dd49ee50adaa51c2dc5d2 Mon Sep 17 00:00:00 2001 From: Matteo Mancini Date: Mon, 3 Aug 2020 11:23:50 +0100 Subject: [PATCH 3/4] Added if statement to correctly handle strings and list during export. --- nipype/pipeline/engine/utils.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/nipype/pipeline/engine/utils.py b/nipype/pipeline/engine/utils.py index 3d0f078e35..6f73d62189 100644 --- a/nipype/pipeline/engine/utils.py +++ b/nipype/pipeline/engine/utils.py @@ -369,9 +369,15 @@ def format_node(node, format="python", include_config=False): filled_args = [] for arg in args: if hasattr(node.interface, "_%s" % arg): - filled_args.append( - "%s=%s" % (arg, getattr(node.interface, "_%s" % arg)) - ) + argval = getattr(node.interface, "_%s" % arg) + if isinstance(argval, str): + filled_args.append( + "%s='%s'" % (arg, argval) + ) + else: + filled_args.append( + "%s=%s" % (arg, argval) + ) args = ", ".join(filled_args) else: args = "" From fc8e991eb687383db9f2894a9ad1175ce382c782 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Sat, 15 Aug 2020 10:42:52 -0400 Subject: [PATCH 4/4] RF: Simplify serialization --- nipype/pipeline/engine/utils.py | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/nipype/pipeline/engine/utils.py b/nipype/pipeline/engine/utils.py index 6f73d62189..f77f771ea7 100644 --- a/nipype/pipeline/engine/utils.py +++ b/nipype/pipeline/engine/utils.py @@ -364,23 +364,12 @@ def format_node(node, format="python", include_config=False): importline = "from %s import %s" % (klass.__module__, klass.__class__.__name__) comment = "# Node: %s" % node.fullname spec = signature(node.interface.__init__) - args = [p.name for p in list(spec.parameters.values())] - if args: - filled_args = [] - for arg in args: - if hasattr(node.interface, "_%s" % arg): - argval = getattr(node.interface, "_%s" % arg) - if isinstance(argval, str): - filled_args.append( - "%s='%s'" % (arg, argval) - ) - else: - filled_args.append( - "%s=%s" % (arg, argval) - ) - args = ", ".join(filled_args) - else: - args = "" + filled_args = [] + for param in spec.parameters.values(): + val = getattr(node.interface, f"_{param.name}", None) + if val is not None: + filled_args.append(f"{param.name}={val!r}") + args = ", ".join(filled_args) klass_name = klass.__class__.__name__ if isinstance(node, MapNode): nodedef = '%s = MapNode(%s(%s), iterfield=%s, name="%s")' % (