Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/planemo/commands/cmd_normalize.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/planemo/commands/cmd_normalize.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,98 @@ +"""Module describing the planemo ``normalize`` command.""" +from xml.etree import ElementTree + +import click +from galaxy.tool_util.linters.xml_order import TAG_ORDER +from galaxy.tool_util.loader import ( + load_tool, + raw_tool_xml_tree, +) + +from planemo import options +from planemo.cli import command_function + + +@click.command('normalize') +@options.required_tool_arg() +@click.option( + "--expand_macros", + is_flag=True, + help=("Expand macros while normalizing tool XML - useful to see how " + "macros are evaluated.") +) +@click.option( + "--skip_reorder", + is_flag=True, + help=("Planemo will reorder top-level tool blocks according to tool " + "development best practices as part of this command, this flag " + "will disable that behavior.") +) +@click.option( + "--skip_reindent", + is_flag=True, + help=("Planemo will reindent the XML according to tool development " + "best practices as part of this command, this flag will disable " + "that behavior.") +) +@command_function +def cli(ctx, path, expand_macros=False, **kwds): + """Generate normalized tool XML from input. + + This will break the formatting of your tool and is currently only intended + for viewing macro expansions for for use with XSD validation (see + https://github.com/JeanFred/Galaxy-XSD for instance). Please do not use + the output as is - it frequently makes tool less readable not more. + + The top-level blocks will be reordered and whitespace fixed according to + the tool development best practices outlined on the Galaxy wiki. + + \b + % # Print normalized version of tool. + % planemo normalize tool.xml + <tool> + ... + % # Print a variant of tool with all macros expanded out, useful for + % # debugging complex macros. + % planemo normalize --expand_macros tool.xml + <tool> + ... + """ + if expand_macros: + tree = load_tool(path) + else: + tree = raw_tool_xml_tree(path) + + root = tree.getroot() + if not kwds.get("skip_reorder", False): + last_index = len(TAG_ORDER) + data = [] + for elem in root: + tag = elem.tag + if tag in TAG_ORDER: + key = TAG_ORDER.index(tag) + else: + key = last_index + last_index += 1 + data.append((key, elem)) + data.sort() + root[:] = [item[-1] for item in data] + if not kwds.get("skip_reindent", False): + _indent(root) + ElementTree.dump(root) + + +def _indent(elem, level=0): + # http://stackoverflow.com/questions/749796/pretty-printing-xml-in-python + i = "\n" + level * " " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + " " + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + _indent(elem, level + 1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i