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.help

"""This module contains a linting function for a tool's help."""

from typing import (
    TYPE_CHECKING,
    Union,
)

from galaxy.tool_util.lint import Linter
from galaxy.util import (
    rst_to_html,
    unicodify,
)

if TYPE_CHECKING:
    from galaxy.tool_util.lint import LintContext
    from galaxy.tool_util.parser.interface import ToolSource


[docs]class HelpMissing(Linter):
[docs] @classmethod def lint(cls, tool_source: "ToolSource", lint_ctx: "LintContext"): tool_xml = getattr(tool_source, "xml_tree", None) if not tool_xml: return root = tool_xml.find("./help") if root is None: root = tool_xml.getroot() help = tool_xml.find("./help") if help is None: lint_ctx.warn( "No help section found, consider adding a help section to your tool.", linter=cls.name(), node=root )
[docs]class HelpEmpty(Linter):
[docs] @classmethod def lint(cls, tool_source: "ToolSource", lint_ctx: "LintContext"): tool_xml = getattr(tool_source, "xml_tree", None) if not tool_xml: return help = tool_xml.find("./help") if help is None: return help_text = help.text or "" if not help_text.strip(): lint_ctx.warn("Help section appears to be empty.", linter=cls.name(), node=help)
[docs]class HelpPresent(Linter):
[docs] @classmethod def lint(cls, tool_source: "ToolSource", lint_ctx: "LintContext"): tool_xml = getattr(tool_source, "xml_tree", None) if not tool_xml: return help = tool_xml.find("./help") if help is None: return help_text = help.text or "" if help_text.strip(): lint_ctx.valid("Tool contains help section.", linter=cls.name(), node=help)
[docs]class HelpTODO(Linter):
[docs] @classmethod def lint(cls, tool_source: "ToolSource", lint_ctx: "LintContext"): tool_xml = getattr(tool_source, "xml_tree", None) if not tool_xml: return help = tool_xml.find("./help") if help is None: return help_text = help.text or "" if "TODO" in help_text: lint_ctx.warn("Help contains TODO text.", linter=cls.name(), node=help)
[docs]class HelpInvalidRST(Linter):
[docs] @classmethod def lint(cls, tool_source: "ToolSource", lint_ctx: "LintContext"): tool_xml = getattr(tool_source, "xml_tree", None) if not tool_xml: return help = tool_xml.find("./help") if help is None: return help_text = help.text or "" if not help_text.strip(): return invalid_rst = rst_invalid(help_text) if invalid_rst: lint_ctx.warn(f"Invalid reStructuredText found in help - [{invalid_rst}].", linter=cls.name(), node=help)
[docs]class HelpValidRST(Linter):
[docs] @classmethod def lint(cls, tool_source: "ToolSource", lint_ctx: "LintContext"): tool_xml = getattr(tool_source, "xml_tree", None) if not tool_xml: return help = tool_xml.find("./help") if help is None: return help_text = help.text or "" if not help_text.strip(): return invalid_rst = rst_invalid(help_text) if not invalid_rst: lint_ctx.valid("Help contains valid reStructuredText.", linter=cls.name(), node=help)
[docs]def rst_invalid(text: str) -> Union[bool, str]: """ Predicate to determine if text is invalid reStructuredText. Return False if the supplied text is valid reStructuredText or a string indicating the problem. """ invalid_rst: Union[bool, str] = False try: rst_to_html(text, error=True) except Exception as e: invalid_rst = unicodify(e) return invalid_rst