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.xml_order
"""This module contains a linter for tool XML block order.
For more information on the IUC standard for XML block order see -
https://github.com/galaxy-iuc/standards.
"""
from typing import (
Optional,
TYPE_CHECKING,
)
from galaxy.tool_util.lint import Linter
from ._util import is_datasource
if TYPE_CHECKING:
from galaxy.tool_util.lint import LintContext
from galaxy.tool_util.parser.interface import ToolSource
# https://github.com/galaxy-iuc/standards
# https://github.com/galaxy-iuc/standards/pull/7/files
TAG_ORDER = [
"description",
"macros",
"options",
"edam_topics",
"edam_operations",
"xrefs",
"parallelism",
"requirements",
"required_files",
"code",
"stdio",
"version_command",
"command",
"environment_variables",
"configfiles",
"inputs",
"outputs",
"tests",
"help",
"citations",
]
DATASOURCE_TAG_ORDER = [
"description",
"macros",
"requirements",
"command",
"configfiles",
"inputs",
"request_param_translation",
"uihints",
"outputs",
"options",
"help",
"citations",
]
[docs]class XMLOrder(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
tool_root = tool_xml.getroot()
if is_datasource(tool_xml):
tag_ordering = DATASOURCE_TAG_ORDER
else:
tag_ordering = TAG_ORDER
last_tag = None
last_key: Optional[int] = None
for elem in tool_root:
tag = elem.tag
if tag not in tag_ordering:
continue
key = tag_ordering.index(tag)
if last_key:
if last_key > key:
lint_ctx.warn(
f"Best practice violation [{tag}] elements should come before [{last_tag}]",
linter=cls.name(),
node=elem,
)
last_tag = tag
last_key = key