From e7b9a10c7ae3f3635fbdf58f7ddd8295a2d1acdd Mon Sep 17 00:00:00 2001 From: Horea Christian Date: Tue, 22 Aug 2017 20:44:17 +0200 Subject: [PATCH] Detecting and appropriately warning about unconnected duplicate nodes --- .../pipeline/engine/tests/test_workflows.py | 36 +++++++++++++++++++ nipype/pipeline/engine/workflows.py | 9 +++-- 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 nipype/pipeline/engine/tests/test_workflows.py diff --git a/nipype/pipeline/engine/tests/test_workflows.py b/nipype/pipeline/engine/tests/test_workflows.py new file mode 100644 index 0000000000..32b2fa3505 --- /dev/null +++ b/nipype/pipeline/engine/tests/test_workflows.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +"""Tests for the engine workflows module +""" +import pytest + +from ... import engine as pe +from ....interfaces import utility as niu + + +def test_duplicate_node_check(): + + wf = pe.Workflow(name="testidentity") + + original_list = [0,1,2,3,4,5,6,7,8,9] + + selector1 = pe.Node(niu.Select(), name="selector1") + selector1.inputs.index = original_list[:-1] + selector1.inputs.inlist = original_list + selector2 = pe.Node(niu.Select(), name="selector2") + selector2.inputs.index = original_list[:-2] + selector3 = pe.Node(niu.Select(), name="selector3") + selector3.inputs.index = original_list[:-3] + selector4 = pe.Node(niu.Select(), name="selector3") + selector4.inputs.index = original_list[:-4] + + wf_connections = [ + (selector1, selector2, [("out","inlist")]), + (selector2, selector3, [("out","inlist")]), + (selector3, selector4, [("out","inlist")]), + ] + + with pytest.raises(IOError) as excinfo: + wf.connect(wf_connections) + assert 'Duplicate node name "selector3" found.' == str(excinfo.value) diff --git a/nipype/pipeline/engine/workflows.py b/nipype/pipeline/engine/workflows.py index f30ed50051..e1535b4cf9 100644 --- a/nipype/pipeline/engine/workflows.py +++ b/nipype/pipeline/engine/workflows.py @@ -700,8 +700,13 @@ def _check_nodes(self, nodes): for node in nodes: if node.name in node_names: idx = node_names.index(node.name) - if node_lineage[idx] in [node._hierarchy, self.name]: - raise IOError('Duplicate node name %s found.' % node.name) + try: + this_node_lineage = node_lineage[idx] + except IndexError: + raise IOError('Duplicate node name "%s" found.' % node.name) + else: + if this_node_lineage in [node._hierarchy, self.name]: + raise IOError('Duplicate node name "%s" found.' % node.name) else: node_names.append(node.name)