diff --git a/lib/galaxy/dataset_collections/subcollections.py b/lib/galaxy/dataset_collections/subcollections.py
index 3a536a34da4..99bd289e28b 100644
--- a/lib/galaxy/dataset_collections/subcollections.py
+++ b/lib/galaxy/dataset_collections/subcollections.py
@@ -20,6 +20,6 @@ def _split_dataset_collection(dataset_collection, collection_type):
if child_collection.collection_type == collection_type:
split_elements.append(element)
else:
- split_elements.extend(_split_dataset_collection(element.child_collection, element.child_collection.collection_type))
+ split_elements.extend(_split_dataset_collection(element.child_collection, collection_type))
return split_elements
diff --git a/lib/galaxy/tools/parser/output_actions.py b/lib/galaxy/tools/parser/output_actions.py
index 35798452b5a..475eecebdd2 100644
--- a/lib/galaxy/tools/parser/output_actions.py
+++ b/lib/galaxy/tools/parser/output_actions.py
@@ -243,7 +243,10 @@ class FromParamToolOutputActionOption(ToolOutputActionOption):
# if this is an HDCA for instance let reverse.ext grab
# the reverse element and then continue for loop to grab
# dataset extension
- value = value.collection[attr_name].element_object
+ try:
+ value = value.collection[attr_name].element_object
+ except KeyError:
+ value = value.child_collection[attr_name].element_object
elif hasattr(value, "collection") and value in COLLECTION_ATTRIBUTES:
value = getattr(value.collection, attr_name)
else:
diff --git a/test/api/test_tools.py b/test/api/test_tools.py
index e18965d69b0..432debda4d6 100644
--- a/test/api/test_tools.py
+++ b/test/api/test_tools.py
@@ -736,6 +736,23 @@ class ToolsTestCase(api.ApiTestCase):
assert output1_details["file_ext"] == "txt" if (use_action == "do") else "data"
assert output2_details["file_ext"] == "txt" if (use_action == "do") else "data"
+ @skip_without_tool("output_action_change_format_paired")
+ def test_map_over_with_nested_paired_output_format_actions(self):
+ history_id = self.dataset_populator.new_history()
+ hdca_id = self.__build_nested_list(history_id)
+ inputs = {
+ "input": {'batch': True, 'values': [dict(map_over_type='paired', src="hdca", id=hdca_id)]}
+ }
+ create = self._run('output_action_change_format_paired', history_id, inputs).json()
+ outputs = create['outputs']
+ jobs = create['jobs']
+ implicit_collections = create['implicit_collections']
+ self.assertEquals(len(jobs), 2)
+ self.assertEquals(len(outputs), 2)
+ self.assertEquals(len(implicit_collections), 1)
+ for output in outputs:
+ assert output["file_ext"] == "txt"
+
@skip_without_tool("output_filter_with_input")
def test_map_over_with_output_filter_no_filtering(self):
with self.dataset_populator.test_history() as history_id:
diff --git a/test/functional/tools/output_action_change_format_paired.xml b/test/functional/tools/output_action_change_format_paired.xml
new file mode 100644
index 00000000000..7c31145f063
--- /dev/null
+++ b/test/functional/tools/output_action_change_format_paired.xml
@@ -0,0 +1,32 @@
+
+
+ printf "1\t2\n" > out1;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/functional/tools/samples_tool_conf.xml b/test/functional/tools/samples_tool_conf.xml
index cb8e49d5f46..fa7179cb073 100644
--- a/test/functional/tools/samples_tool_conf.xml
+++ b/test/functional/tools/samples_tool_conf.xml
@@ -106,6 +106,7 @@
+