diff planemo/lib/python3.7/site-packages/galaxy/tool_util/linters/outputs.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/planemo/lib/python3.7/site-packages/galaxy/tool_util/linters/outputs.py	Fri Jul 31 00:32:28 2020 -0400
@@ -0,0 +1,78 @@
+"""This module contains a linting functions for tool outputs."""
+from ._util import is_valid_cheetah_placeholder
+
+
+def lint_output(tool_xml, lint_ctx):
+    """Check output elements, ensure there is at least one and check attributes."""
+    outputs = tool_xml.findall("./outputs")
+    if len(outputs) == 0:
+        lint_ctx.warn("Tool contains no outputs section, most tools should produce outputs.")
+    if len(outputs) > 1:
+        lint_ctx.warn("Tool contains multiple output sections, behavior undefined.")
+
+    num_outputs = 0
+    if len(outputs) == 0:
+        lint_ctx.warn("No outputs found")
+        return
+
+    for output in list(outputs[0]):
+        if output.tag not in ["data", "collection"]:
+            lint_ctx.warn("Unknown element found in outputs [%s]" % output.tag)
+            continue
+        num_outputs += 1
+        if "name" not in output.attrib:
+            lint_ctx.warn("Tool output doesn't define a name - this is likely a problem.")
+        else:
+            if not is_valid_cheetah_placeholder(output.attrib["name"]):
+                lint_ctx.warn("Tool output name [%s] is not a valid Cheetah placeholder.", output.attrib["name"])
+
+        format_set = False
+        if output.tag == "data":
+            if __check_format(output, lint_ctx):
+                format_set = True
+            elif "auto_format" in output.attrib and output.attrib["auto_format"]:
+                format_set = True
+
+        elif output.tag == "collection":
+            if "type" not in output.attrib:
+                lint_ctx.warn("Collection output with undefined 'type' found.")
+            if "structured_like" in output.attrib and "inherit_format" in output.attrib:
+                format_set = True
+        if "format_source" in output.attrib:
+            format_set = True
+        for sub in output:
+            if __check_pattern(sub):
+                format_set = True
+            elif __check_format(sub, lint_ctx):
+                format_set = True
+
+        if not format_set:
+            lint_ctx.warn("Tool %s output %s doesn't define an output format." % (output.tag, output.attrib.get("name", "with missing name")))
+
+    lint_ctx.info("%d outputs found.", num_outputs)
+
+
+def __check_format(node, lint_ctx):
+    """
+    check if format/ext attribute is set in a given node
+    issue a warning if the value is input
+    return true (node defines format/ext) / false (else)
+    """
+    fmt = node.attrib.get("format", node.attrib.get("ext", None))
+    if fmt == "input":
+        lint_ctx.warn("Using format='input' on %s, format_source attribute is less ambiguous and should be used instead." % node.tag)
+    return fmt is not None
+
+
+def __check_pattern(node):
+    """
+    check if pattern attribute is set and defines the extension
+    """
+    if node.tag != "discover_datasets":
+        return False
+    if "pattern" not in node.attrib:
+        return False
+    if node.attrib["pattern"] == "__default__":
+        return True
+    if "ext" in node.attrib["pattern"] and node.attrib["pattern"].startswith("__") and node.attrib["pattern"].endswith("__"):
+        return True