diff env/lib/python3.7/site-packages/galaxy/util/xml_macros.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/galaxy/util/xml_macros.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,321 +0,0 @@
-import os
-from copy import deepcopy
-from xml.etree import ElementInclude, ElementTree
-
-
-REQUIRED_PARAMETER = object()
-
-
-def load_with_references(path):
-    """Load XML documentation from file system and preprocesses XML macros.
-
-    Return the XML representation of the expanded tree and paths to
-    referenced files that were imported (macros).
-    """
-    tree = raw_xml_tree(path)
-    root = tree.getroot()
-
-    macro_paths = _import_macros(root, path)
-
-    # Collect tokens
-    tokens = _macros_of_type(root, 'token', lambda el: el.text or '')
-    tokens = expand_nested_tokens(tokens)
-
-    # Expand xml macros
-    macro_dict = _macros_of_type(root, 'xml', lambda el: XmlMacroDef(el))
-    _expand_macros([root], macro_dict, tokens)
-
-    return tree, macro_paths
-
-
-def load(path):
-    tree, _ = load_with_references(path)
-    return tree
-
-
-def template_macro_params(root):
-    """
-    Look for template macros and populate param_dict (for cheetah)
-    with these.
-    """
-    param_dict = {}
-    macro_dict = _macros_of_type(root, 'template', lambda el: el.text)
-    for key, value in macro_dict.items():
-        param_dict[key] = value
-    return param_dict
-
-
-def raw_xml_tree(path):
-    """ Load raw (no macro expansion) tree representation of XML represented
-    at the specified path.
-    """
-    tree = _parse_xml(path)
-    return tree
-
-
-def imported_macro_paths(root):
-    macros_el = _macros_el(root)
-    return _imported_macro_paths_from_el(macros_el)
-
-
-def _import_macros(root, path):
-    xml_base_dir = os.path.dirname(path)
-    macros_el = _macros_el(root)
-    if macros_el is not None:
-        macro_els, macro_paths = _load_macros(macros_el, xml_base_dir)
-        _xml_set_children(macros_el, macro_els)
-        return macro_paths
-
-
-def _macros_el(root):
-    return root.find('macros')
-
-
-def _macros_of_type(root, type, el_func):
-    macros_el = root.find('macros')
-    macro_dict = {}
-    if macros_el is not None:
-        macro_els = macros_el.findall('macro')
-        filtered_els = [(macro_el.get("name"), el_func(macro_el))
-                        for macro_el in macro_els
-                        if macro_el.get('type') == type]
-        macro_dict = dict(filtered_els)
-    return macro_dict
-
-
-def expand_nested_tokens(tokens):
-    for token_name in tokens.keys():
-        for current_token_name, current_token_value in tokens.items():
-            if token_name in current_token_value:
-                if token_name == current_token_name:
-                    raise Exception("Token '%s' cannot contain itself" % token_name)
-                tokens[current_token_name] = current_token_value.replace(token_name, tokens[token_name])
-    return tokens
-
-
-def _expand_tokens(elements, tokens):
-    if not tokens or elements is None:
-        return
-
-    for element in elements:
-        _expand_tokens_for_el(element, tokens)
-
-
-def _expand_tokens_for_el(element, tokens):
-    value = element.text
-    if value:
-        new_value = _expand_tokens_str(element.text, tokens)
-        if not (new_value is value):
-            element.text = new_value
-    for key, value in element.attrib.items():
-        new_value = _expand_tokens_str(value, tokens)
-        if not (new_value is value):
-            element.attrib[key] = new_value
-    _expand_tokens(list(element), tokens)
-
-
-def _expand_tokens_str(s, tokens):
-    for key, value in tokens.items():
-        if key in s:
-            s = s.replace(key, value)
-    return s
-
-
-def _expand_macros(elements, macros, tokens):
-    if not macros and not tokens:
-        return
-
-    for element in elements:
-        while True:
-            expand_el = element.find('.//expand')
-            if expand_el is None:
-                break
-            _expand_macro(element, expand_el, macros, tokens)
-
-        _expand_tokens_for_el(element, tokens)
-
-
-def _expand_macro(element, expand_el, macros, tokens):
-    macro_name = expand_el.get('macro')
-    macro_def = macros[macro_name]
-    expanded_elements = deepcopy(macro_def.elements)
-
-    _expand_yield_statements(expanded_elements, expand_el)
-
-    # Recursively expand contained macros.
-    _expand_macros(expanded_elements, macros, tokens)
-    macro_tokens = macro_def.macro_tokens(expand_el)
-    if macro_tokens:
-        _expand_tokens(expanded_elements, macro_tokens)
-
-    # HACK for elementtree, newer implementations (etree/lxml) won't
-    # require this parent_map data structure but elementtree does not
-    # track parents or recognize .find('..').
-    # TODO fix this now that we're not using elementtree
-    parent_map = dict((c, p) for p in element.iter() for c in p)
-    _xml_replace(expand_el, expanded_elements, parent_map)
-
-
-def _expand_yield_statements(macro_def, expand_el):
-    yield_els = [yield_el for macro_def_el in macro_def for yield_el in macro_def_el.findall('.//yield')]
-
-    expand_el_children = list(expand_el)
-    macro_def_parent_map = \
-        dict((c, p) for macro_def_el in macro_def for p in macro_def_el.iter() for c in p)
-
-    for yield_el in yield_els:
-        _xml_replace(yield_el, expand_el_children, macro_def_parent_map)
-
-    # Replace yields at the top level of a macro, seems hacky approach
-    replace_yield = True
-    while replace_yield:
-        for i, macro_def_el in enumerate(macro_def):
-            if macro_def_el.tag == "yield":
-                for target in expand_el_children:
-                    i += 1
-                    macro_def.insert(i, target)
-                macro_def.remove(macro_def_el)
-                continue
-
-        replace_yield = False
-
-
-def _load_macros(macros_el, xml_base_dir):
-    macros = []
-    # Import macros from external files.
-    imported_macros, macro_paths = _load_imported_macros(macros_el, xml_base_dir)
-    macros.extend(imported_macros)
-    # Load all directly defined macros.
-    macros.extend(_load_embedded_macros(macros_el, xml_base_dir))
-    return macros, macro_paths
-
-
-def _load_embedded_macros(macros_el, xml_base_dir):
-    macros = []
-
-    macro_els = []
-    # attribute typed macro
-    if macros_el is not None:
-        macro_els = macros_el.findall("macro")
-    for macro in macro_els:
-        if 'type' not in macro.attrib:
-            macro.attrib['type'] = 'xml'
-        macros.append(macro)
-
-    # type shortcuts (<xml> is a shortcut for <macro type="xml",
-    # likewise for <template>.
-    typed_tag = ['template', 'xml', 'token']
-    for tag in typed_tag:
-        macro_els = []
-        if macros_el is not None:
-            macro_els = macros_el.findall(tag)
-        for macro_el in macro_els:
-            macro_el.attrib['type'] = tag
-            macro_el.tag = 'macro'
-            macros.append(macro_el)
-
-    return macros
-
-
-def _load_imported_macros(macros_el, xml_base_dir):
-    macros = []
-    macro_paths = []
-
-    for tool_relative_import_path in _imported_macro_paths_from_el(macros_el):
-        import_path = \
-            os.path.join(xml_base_dir, tool_relative_import_path)
-        macro_paths.append(import_path)
-        file_macros, current_macro_paths = _load_macro_file(import_path, xml_base_dir)
-        macros.extend(file_macros)
-        macro_paths.extend(current_macro_paths)
-
-    return macros, macro_paths
-
-
-def _imported_macro_paths_from_el(macros_el):
-    imported_macro_paths = []
-    macro_import_els = []
-    if macros_el is not None:
-        macro_import_els = macros_el.findall("import")
-    for macro_import_el in macro_import_els:
-        raw_import_path = macro_import_el.text
-        imported_macro_paths.append(raw_import_path)
-    return imported_macro_paths
-
-
-def _load_macro_file(path, xml_base_dir):
-    tree = _parse_xml(path)
-    root = tree.getroot()
-    return _load_macros(root, xml_base_dir)
-
-
-def _xml_set_children(element, new_children):
-    for old_child in element:
-        element.remove(old_child)
-    for i, new_child in enumerate(new_children):
-        element.insert(i, new_child)
-
-
-def _xml_replace(query, targets, parent_map):
-    # parent_el = query.find('..') ## Something like this would be better with newer xml library
-    parent_el = parent_map[query]
-    matching_index = -1
-    # for index, el in enumerate(parent_el.iter('.')):  ## Something like this for newer implementation
-    for index, el in enumerate(list(parent_el)):
-        if el == query:
-            matching_index = index
-            break
-    assert matching_index >= 0
-    current_index = matching_index
-    for target in targets:
-        current_index += 1
-        parent_el.insert(current_index, deepcopy(target))
-    parent_el.remove(query)
-
-
-class XmlMacroDef(object):
-
-    def __init__(self, el):
-        self.elements = list(el)
-        parameters = {}
-        tokens = []
-        token_quote = "@"
-        for key, value in el.attrib.items():
-            if key == "token_quote":
-                token_quote = value
-            if key == "tokens":
-                for token in value.split(","):
-                    tokens.append((token, REQUIRED_PARAMETER))
-            elif key.startswith("token_"):
-                token = key[len("token_"):]
-                tokens.append((token, value))
-        for name, default in tokens:
-            parameters[name] = (token_quote, default)
-        self.parameters = parameters
-
-    def macro_tokens(self, expand_el):
-        tokens = {}
-        for key, (wrap_char, default_val) in self.parameters.items():
-            token_value = expand_el.attrib.get(key, default_val)
-            if token_value is REQUIRED_PARAMETER:
-                message = "Failed to expand macro - missing required parameter [%s]."
-                raise ValueError(message % key)
-            token_name = "%s%s%s" % (wrap_char, key.upper(), wrap_char)
-            tokens[token_name] = token_value
-        return tokens
-
-
-def _parse_xml(fname):
-    tree = ElementTree.parse(fname)
-    root = tree.getroot()
-    ElementInclude.include(root)
-    return tree
-
-
-__all__ = (
-    "imported_macro_paths",
-    "load",
-    "load_with_references",
-    "raw_xml_tree",
-    "template_macro_params",
-)