Warning

This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.

Source code for galaxy.tool_util.linters.outputs

"""This module contains a linting functions for tool outputs."""
from ._util import is_valid_cheetah_placeholder


[docs]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 __check_format(output, lint_ctx): format_set = True if output.tag == "data": if "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, allow_ext=True): format_set = True if not format_set: lint_ctx.warn("Tool {} output {} doesn't define an output format.".format(output.tag, output.attrib.get("name", "with missing name"))) lint_ctx.info("%d outputs found.", num_outputs)
def __check_format(node, lint_ctx, allow_ext=False): """ 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 = None # if allowed (e.g. for discover_datasets), ext takes precedence over format if allow_ext: fmt = node.attrib.get("ext") if fmt is None: fmt = node.attrib.get("format") 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