Allow discovering dataset collections in galaxy.json in a nested fashion.

Fixes #2658.
This commit is contained in:
John Chilton
2017-08-17 15:41:11 -04:00
parent 72e361bcf1
commit 6563e387a5
3 changed files with 102 additions and 0 deletions
@@ -93,8 +93,25 @@ class ToolProvidedMetadata(object):
def get_new_datasets(self, output_name):
datasets = self.tool_provided_job_metadata.get(output_name, {}).get("datasets", [])
if not datasets:
elements = self.tool_provided_job_metadata.get(output_name, {}).get("elements", [])
if elements:
datasets = self._elements_to_datasets(elements)
return datasets
def _elements_to_datasets(self, elements, level=0):
for element in elements:
extra_kwds = {"identifier_%d" % level: element["name"]}
if "elements" in element:
for inner_element in self._elements_to_datasets(element["elements"], level=level + 1):
dataset = extra_kwds.copy()
dataset.update(inner_element)
yield dataset
else:
dataset = extra_kwds
extra_kwds.update(element)
yield extra_kwds
def collect_dynamic_collections(
tool,
@@ -0,0 +1,84 @@
<tool id="collection_creates_dynamic_nested_from_json_elements" name="collection_creates_dynamic_nested_from_json_elements" version="0.1.0" profile="17.09">
<command>
echo "A" > oe1_ie1.fq ;
echo "B" > oe1_ie2.fq ;
echo "C" > oe2_ie1.fq ;
echo "D" > oe2_ie2.fq ;
echo "E" > oe3_ie1.fq ;
echo "F" > oe3_ie2.fq ;
cp $c1 galaxy.json
</command>
<configfiles>
<configfile name="c1">{"list_output": {
"elements": [
{"name": "oe1", "elements": [
{"name": "ie1", "filename": "oe1_ie1.fq"},
{"name": "ie2", "filename": "oe1_ie2.fq"}
]},
{"name": "oe2", "elements": [
{"name": "ie1", "filename": "oe2_ie1.fq"},
{"name": "ie2", "filename": "oe2_ie2.fq"}
]},
{"name": "oe3", "elements": [
{"name": "ie1", "filename": "oe3_ie1.fq"},
{"name": "ie2", "filename": "oe3_ie2.fq"}
]}
]}}</configfile>
</configfiles>
<inputs>
<param name="foo" type="text" label="Dummy Parameter" />
</inputs>
<outputs>
<collection name="list_output" type="list:list" label="Duplicate List">
<!-- Use named regex group to grab pattern
<identifier_0>_<identifier_1>.fq. Here identifier_0 is the list
identifier of the outer list and identifier_1 is the list identifier
of the inner list (for instance oe1_ie2.fq in above example).
-->
<discover_datasets from_provided_metadata="true" ext="fastqsanger" visible="true" />
</collection>
</outputs>
<tests>
<test>
<param name="foo" value="bar" />
<output_collection name="list_output" type="list:list">
<element name="oe1">
<element name="ie1">
<assert_contents>
<has_text_matching expression="^A\n$" />
</assert_contents>
</element>
<element name="ie2">
<assert_contents>
<has_text_matching expression="^B\n$" />
</assert_contents>
</element>
</element>
<element name="oe2">
<element name="ie1">
<assert_contents>
<has_text_matching expression="^C\n$" />
</assert_contents>
</element>
<element name="ie2">
<assert_contents>
<has_text_matching expression="^D\n$" />
</assert_contents>
</element>
</element>
<element name="oe3">
<element name="ie1">
<assert_contents>
<has_text_matching expression="^E\n$" />
</assert_contents>
</element>
<element name="ie2">
<assert_contents>
<has_text_matching expression="^F\n$" />
</assert_contents>
</element>
</element>
</output_collection>
</test>
</tests>
</tool>
@@ -105,6 +105,7 @@
<tool file="collection_split_on_column.xml" />
<tool file="collection_creates_dynamic_nested.xml" />
<tool file="collection_creates_dynamic_nested_from_json.xml" />
<tool file="collection_creates_dynamic_nested_from_json_elements.xml" />
<tool file="collection_creates_dynamic_list_of_pairs.xml" />
<tool file="collection_type_source.xml" />
<tool file="collection_creates_list_fail.xml" />