Repository 'tool_factory_2'
hg clone https://toolshed.g2.bx.psu.edu/repos/fubar/tool_factory_2

Changeset 39:2cd6555baf44 (2020-08-12)
Previous changeset 38:a30536c100bf (2020-08-12) Next changeset 40:51fa77152988 (2020-08-13)
Commit message:
Uploaded
modified:
toolfactory/rgToolFactory2.py
toolfactory/rgToolFactory2.xml
removed:
toolfactory/__init__.py
toolfactory/galaxyxml/__init__.py
toolfactory/galaxyxml/__pycache__/__init__.cpython-36.pyc
toolfactory/galaxyxml/tool/__init__.py
toolfactory/galaxyxml/tool/__pycache__/__init__.cpython-36.pyc
toolfactory/galaxyxml/tool/import_xml.py
toolfactory/galaxyxml/tool/parameters/__init__.py
toolfactory/galaxyxml/tool/parameters/__pycache__/__init__.cpython-36.pyc
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/galaxyxml/__init__.py
--- a/toolfactory/galaxyxml/__init__.py Wed Aug 12 01:43:46 2020 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,64 +0,0 @@
-from builtins import object
-from builtins import str
-
-from lxml import etree
-
-
-class GalaxyXML(object):
-    def __init__(self):
-        self.root = etree.Element("root")
-
-    def export(self):
-        return etree.tostring(self.root, pretty_print=True, encoding="unicode")
-
-
-class Util(object):
-    @classmethod
-    def coerce(cls, data, kill_lists=False):
-        """Recursive data sanitisation
-        """
-        if isinstance(data, dict):
-            return {k: cls.coerce(v, kill_lists=kill_lists) for k, v in list(data.items()) if v is not None}
-        elif isinstance(data, list):
-            if kill_lists:
-                return cls.coerce(data[0])
-            else:
-                return [cls.coerce(v, kill_lists=kill_lists) for v in data]
-        else:
-            return cls.coerce_value(data)
-
-    @classmethod
-    def coerce_value(cls, obj):
-        """Make everything a string!
-        """
-        if isinstance(obj, bool):
-            if obj:
-                return "true"
-            else:
-                return "false"
-        elif isinstance(obj, str):
-            return obj
-        else:
-            return str(obj)
-
-    @classmethod
-    def clean_kwargs(cls, params, final=False):
-        if "kwargs" in params:
-            kwargs = params["kwargs"]
-            for k in kwargs:
-                params[k] = kwargs[k]
-            del params["kwargs"]
-        if "self" in params:
-            del params["self"]
-
-        if "__class__" in params:
-            del params["__class__"]
-
-        # There will be more params, it would be NICE to use a whitelist
-        # instead of a blacklist, but until we have more data let's just
-        # blacklist stuff we see commonly.
-        if final:
-            for blacklist in ("positional",):
-                if blacklist in params:
-                    del params[blacklist]
-        return params
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/galaxyxml/__pycache__/__init__.cpython-36.pyc
b
Binary file toolfactory/galaxyxml/__pycache__/__init__.cpython-36.pyc has changed
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/galaxyxml/tool/__init__.py
--- a/toolfactory/galaxyxml/tool/__init__.py Wed Aug 12 01:43:46 2020 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,181 +0,0 @@
-import copy
-import logging
-
-from galaxyxml import GalaxyXML, Util
-from galaxyxml.tool.parameters import XMLParam
-
-from lxml import etree
-
-VALID_TOOL_TYPES = ("data_source", "data_source_async")
-VALID_URL_METHODS = ("get", "post")
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-class Tool(GalaxyXML):
-
-    def __init__(
-        self,
-        name,
-        id,
-        version,
-        description,
-        executable,
-        hidden=False,
-        tool_type=None,
-        URL_method=None,
-        workflow_compatible=True,
-        interpreter=None,
-        version_command="interpreter filename.exe --version",
-        command_line_override=None,
-    ):
-
-        self.executable = executable
-        self.interpreter = interpreter
-        self.command_line_override = command_line_override
-        kwargs = {
-            "name": name,
-            "id": id,
-            "version": version,
-            "hidden": hidden,
-            "workflow_compatible": workflow_compatible,
-        }
-        self.version_command = version_command
-
-        # Remove some of the default values to make tools look a bit nicer
-        if not hidden:
-            del kwargs["hidden"]
-        if workflow_compatible:
-            del kwargs["workflow_compatible"]
-
-        kwargs = Util.coerce(kwargs)
-        self.root = etree.Element("tool", **kwargs)
-
-        if tool_type is not None:
-            if tool_type not in VALID_TOOL_TYPES:
-                raise Exception("Tool type must be one of %s" % ",".join(VALID_TOOL_TYPES))
-            else:
-                kwargs["tool_type"] = tool_type
-
-                if URL_method is not None:
-                    if URL_method in VALID_URL_METHODS:
-                        kwargs["URL_method"] = URL_method
-                    else:
-                        raise Exception("URL_method must be one of %s" % ",".join(VALID_URL_METHODS))
-
-        description_node = etree.SubElement(self.root, "description")
-        description_node.text = description
-
-    def add_comment(self, comment_txt):
-        comment = etree.Comment(comment_txt)
-        self.root.insert(0, comment)
-
-    def append_version_command(self):
-        version_command = etree.SubElement(self.root, "version_command")
-        try:
-            version_command.text = etree.CDATA(self.version_command)
-        except Exception:
-            pass
-
-    def append(self, sub_node):
-        if issubclass(type(sub_node), XMLParam):
-            self.root.append(sub_node.node)
-        else:
-            self.root.append(sub_node)
-
-    def clean_command_string(self, command_line):
-        clean = []
-        for x in command_line:
-            if x is not [] and x is not [""]:
-                clean.append(x)
-
-        return "\n".join(clean)
-
-    def export(self, keep_old_command=False):  # noqa
-
-        export_xml = copy.deepcopy(self)
-
-        try:
-            export_xml.append(export_xml.edam_operations)
-        except Exception:
-            pass
-
-        try:
-            export_xml.append(export_xml.edam_topics)
-        except Exception:
-            pass
-
-        try:
-            export_xml.append(export_xml.requirements)
-        except Exception:
-            pass
-
-        try:
-            export_xml.append(export_xml.configfiles)
-        except Exception:
-            pass
-
-        if self.command_line_override:
-            command_line = self.command_line_override
-        else:
-            command_line = []
-            try:
-                command_line.append(export_xml.inputs.cli())
-            except Exception as e:
-                logger.warning(str(e))
-
-            try:
-                command_line.append(export_xml.outputs.cli())
-            except Exception:
-                pass
-
-        # Add stdio section
-        stdio = etree.SubElement(export_xml.root, "stdio")
-        etree.SubElement(stdio, "exit_code", range="1:", level="fatal")
-
-        # Append version command
-        export_xml.append_version_command()
-
-        # Steal interpreter from kwargs
-        command_kwargs = {}
-        if export_xml.interpreter is not None:
-            command_kwargs["interpreter"] = export_xml.interpreter
-
-        # Add command section
-        command_node = etree.SubElement(export_xml.root, "command", **command_kwargs)
-
-        if keep_old_command:
-            if getattr(self, "command", None):
-                command_node.text = etree.CDATA(export_xml.command)
-            else:
-                logger.warning("The tool does not have any old command stored. " + "Only the command line is written.")
-                command_node.text = export_xml.executable
-        else:
-            actual_cli = "%s %s" % (export_xml.executable, export_xml.clean_command_string(command_line))
-            command_node.text = etree.CDATA(actual_cli.strip())
-
-        try:
-            export_xml.append(export_xml.inputs)
-        except Exception:
-            pass
-
-        try:
-            export_xml.append(export_xml.outputs)
-        except Exception:
-            pass
-
-        try:
-            export_xml.append(export_xml.tests)
-        except Exception:
-            pass
-
-        help_element = etree.SubElement(export_xml.root, "help")
-        help_element.text = etree.CDATA(export_xml.help)
-
-        try:
-            export_xml.append(export_xml.citations)
-        except Exception:
-            pass
-
-        return super(Tool, export_xml).export()
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/galaxyxml/tool/__pycache__/__init__.cpython-36.pyc
b
Binary file toolfactory/galaxyxml/tool/__pycache__/__init__.cpython-36.pyc has changed
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/galaxyxml/tool/import_xml.py
--- a/toolfactory/galaxyxml/tool/import_xml.py Wed Aug 12 01:43:46 2020 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,713 +0,0 @@\n-import logging\n-import xml.etree.ElementTree as ET\n-\n-import galaxyxml.tool as gxt\n-import galaxyxml.tool.parameters as gxtp\n-\n-logging.basicConfig(level=logging.INFO)\n-logger = logging.getLogger(__name__)\n-\n-\n-class GalaxyXmlParser(object):\n-    """\n-    Class to import content from an existing Galaxy XML wrapper.\n-    """\n-\n-    def _init_tool(self, xml_root):\n-        """\n-        Init tool from existing xml tool.\n-\n-        :param xml_root: root of the galaxy xml file.\n-        :type xml_root: :class:`xml.etree._Element`\n-        """\n-        version_cmd = None\n-        description = None\n-        for child in xml_root:\n-            if child.tag == "description":\n-                description = child.text\n-            elif child.tag == "command":\n-                executable = child.text.split()[0]\n-                command = child.text\n-            elif child.tag == "version_command":\n-                version_cmd = child.text\n-\n-        tool = gxt.Tool(\n-            xml_root.attrib["name"],\n-            xml_root.attrib["id"],\n-            xml_root.attrib.get("version", None),\n-            description,\n-            executable,\n-            hidden=xml_root.attrib.get("hidden", False),\n-            tool_type=xml_root.attrib.get("tool_type", None),\n-            URL_method=xml_root.attrib.get("URL_method", None),\n-            workflow_compatible=xml_root.attrib.get("workflow_compatible", True),\n-            version_command=version_cmd,\n-        )\n-        tool.command = command\n-        return tool\n-\n-    def _load_description(self, tool, desc_root):\n-        """\n-        <description> is already loaded during initiation.\n-\n-        :param tool: Tool object from galaxyxml.\n-        :type tool: :class:`galaxyxml.tool.Tool`\n-        :param desc_root: root of <description> tag.\n-        :type desc_root: :class:`xml.etree._Element`\n-        """\n-        logger.info("<description> is loaded during initiation of the object.")\n-\n-    def _load_version_command(self, tool, vers_root):\n-        """\n-        <version_command> is already loaded during initiation.\n-\n-        :param tool: Tool object from galaxyxml.\n-        :type tool: :class:`galaxyxml.tool.Tool`\n-        :param vers_root: root of <version_command> tag.\n-        :type vers_root: :class:`xml.etree._Element`\n-        """\n-        logger.info("<version_command> is loaded during initiation of the object.")\n-\n-    def _load_stdio(self, tool, stdio_root):\n-        """\n-        So far, <stdio> is automatically generated by galaxyxml.\n-\n-        :param tool: Tool object from galaxyxml.\n-        :type tool: :class:`galaxyxml.tool.Tool`\n-        :param desc_root: root of <stdio> tag.\n-        :type desc_root: :class:`xml.etree._Element`\n-        """\n-        logger.info("<stdio> is not loaded but automatically generated by galaxyxml.")\n-\n-    def _load_command(self, tool, desc_root):\n-        """\n-        <command> is already loaded during initiation.\n-\n-        :param tool: Tool object from galaxyxml.\n-        :type tool: :class:`galaxyxml.tool.Tool`\n-        :param desc_root: root of <command> tag.\n-        :type desc_root: :class:`xml.etree._Element`\n-        """\n-        logger.info("<command> is loaded during initiation of the object.")\n-\n-    def _load_help(self, tool, help_root):\n-        """\n-        Load the content of the <help> into the tool.\n-\n-        :param tool: Tool object from galaxyxml.\n-        :type tool: :class:`galaxyxml.tool.Tool`\n-        :param requirements_root: root of <help> tag.\n-        :type requirements_root: :class:`xml.etree._Element`\n-        """\n-        tool.help = help_root.text\n-\n-    def _load_requirements(self, tool, requirements_root):\n-        """\n-        Add <requirements> to the tool.\n-\n-        :param tool: Tool object from galaxyxml.\n-        :type tool: :class:`galaxyxml.tool.Tool`\n-        :param requirements_root: root of <requirements> tag.\n-        :type requirements_root: :class:`xml.etree._Element`\n-        """'..b')\n-        outputs_root.append(collection)\n-\n-    def _load_discover_datasets(self, root, disc_root):\n-        """\n-        Add <discover_datasets> to root (<collection>).\n-\n-        :param root: root to append <collection> to.\n-        :param disc_root: root of <discover_datasets> tag.\n-        :param disc_root: :class:`xml.etree._Element`\n-        """\n-        root.append(\n-            gxtp.DiscoverDatasets(\n-                disc_root.attrib["pattern"],\n-                directory=disc_root.attrib.get("directory", None),\n-                format=disc_root.attrib.get("format", None),\n-                ext=disc_root.attrib.get("ext", None),\n-                visible=disc_root.attrib.get("visible", None),\n-            )\n-        )\n-\n-    def _load_filter(self, root, filter_root):\n-        """\n-        Add <filter> to root (<collection> or <data>).\n-\n-        :param root: root to append <collection> to.\n-        :param coll_root: root of <filter> tag.\n-        :param coll_root: :class:`xml.etree._Element`\n-        """\n-        root.append(gxtp.OutputFilter(filter_root.text))\n-\n-    def load_outputs(self, root, outputs_root):\n-        """\n-        Add <outputs> to the root.\n-\n-        :param root: root to attach <outputs> to (<tool>).\n-        :param tests_root: root of <outputs> tag.\n-        :type tests_root: :class:`xml.etree._Element`\n-        """\n-        for out_child in outputs_root:\n-            try:\n-                getattr(self, "_load_{}".format(out_child.tag))(root, out_child)\n-            except AttributeError:\n-                logger.warning(out_child.tag + " tag is not processed for <outputs>.")\n-\n-\n-class TestsParser(object):\n-    """\n-    Class to parse content of the <tests> tag from a Galaxy XML wrapper.\n-    """\n-\n-    def _load_param(self, test_root, param_root):\n-        """\n-        Add <param> to the <test>.\n-\n-        :param root: <test> root to append <param> to.\n-        :param repeat_root: root of <param> tag.\n-        :param repeat_root: :class:`xml.etree._Element`\n-        """\n-        test_root.append(\n-            gxtp.TestParam(\n-                param_root.attrib["name"],\n-                value=param_root.attrib.get("value", None),\n-                ftype=param_root.attrib.get("ftype", None),\n-                dbkey=param_root.attrib.get("dbkey", None),\n-            )\n-        )\n-\n-    def _load_output(self, test_root, output_root):\n-        """\n-        Add <output> to the <test>.\n-\n-        :param root: <test> root to append <output> to.\n-        :param repeat_root: root of <output> tag.\n-        :param repeat_root: :class:`xml.etree._Element`\n-        """\n-        test_root.append(\n-            gxtp.TestOutput(\n-                name=output_root.attrib.get("name", None),\n-                file=output_root.attrib.get("file", None),\n-                ftype=output_root.attrib.get("ftype", None),\n-                sort=output_root.attrib.get("sort", None),\n-                value=output_root.attrib.get("value", None),\n-                md5=output_root.attrib.get("md5", None),\n-                checksum=output_root.attrib.get("checksum", None),\n-                compare=output_root.attrib.get("compare", None),\n-                lines_diff=output_root.attrib.get("lines_diff", None),\n-                delta=output_root.attrib.get("delta", None),\n-            )\n-        )\n-\n-    def load_tests(self, root, tests_root):\n-        """\n-        Add <tests> to the root.\n-\n-        :param root: root to attach <tests> to (<tool>).\n-        :param tests_root: root of <tests> tag.\n-        :type tests_root: :class:`xml.etree._Element`\n-        """\n-        for test_root in tests_root:\n-            test = gxtp.Test()\n-            for test_child in test_root:\n-                try:\n-                    getattr(self, "_load_{}".format(test_child.tag))(test, test_child)\n-                except AttributeError:\n-                    logger.warning(test_child.tag + " tag is not processed within <test>.")\n-            root.append(test)\n'
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/galaxyxml/tool/parameters/__init__.py
--- a/toolfactory/galaxyxml/tool/parameters/__init__.py Wed Aug 12 01:43:46 2020 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,739 +0,0 @@\n-from builtins import object\n-from builtins import str\n-\n-from galaxyxml import Util\n-\n-from lxml import etree\n-\n-\n-\n-class XMLParam(object):\n-    name = "node"\n-\n-    def __init__(self, *args, **kwargs):\n-        # http://stackoverflow.com/a/12118700\n-        self.children = []\n-        kwargs = {k: v for k, v in list(kwargs.items()) if v is not None}\n-        kwargs = Util.coerce(kwargs, kill_lists=True)\n-        kwargs = Util.clean_kwargs(kwargs, final=True)\n-        self.node = etree.Element(self.name, **kwargs)\n-\n-    def append(self, sub_node):\n-        if self.acceptable_child(sub_node):\n-            # If one of ours, they aren\'t etree nodes, they\'re custom objects\n-            if issubclass(type(sub_node), XMLParam):\n-                self.node.append(sub_node.node)\n-                self.children.append(sub_node)\n-            else:\n-                raise Exception(\n-                    "Child was unacceptable to parent (%s is not appropriate for %s)" % (type(self), type(sub_node))\n-                )\n-        else:\n-            raise Exception(\n-                "Child was unacceptable to parent (%s is not appropriate for %s)" % (type(self), type(sub_node))\n-            )\n-\n-    def validate(self):\n-        # Very few need validation, but some nodes we may want to have\n-        # validation routines on. Should only be called when DONE.\n-        for child in self.children:\n-            # If any child fails to validate return false.\n-            if not child.validate():\n-                return False\n-        return True\n-\n-    def cli(self):\n-        lines = []\n-        for child in self.children:\n-            lines.append(child.command_line())\n-            # lines += child.command_line()\n-        return "\\n".join(lines)\n-\n-    def command_line(self):\n-        return None\n-\n-\n-class RequestParamTranslation(XMLParam):\n-    name = "request_param_translation"\n-\n-    def __init__(self, **kwargs):\n-        self.node = etree.Element(self.name)\n-\n-    def acceptable_child(self, child):\n-        return isinstance(child, RequestParamTranslation)\n-\n-\n-class RequestParam(XMLParam):\n-    name = "request_param"\n-\n-    def __init__(self, galaxy_name, remote_name, missing, **kwargs):\n-        # TODO: bulk copy locals into self.attr?\n-        self.galaxy_name = galaxy_name\n-        # http://stackoverflow.com/a/1408860\n-        params = Util.clean_kwargs(locals().copy())\n-        super(RequestParam, self).__init__(**params)\n-\n-    def acceptable_child(self, child):\n-        return isinstance(child, AppendParam) and self.galaxy_name == "URL"\n-\n-\n-class AppendParam(XMLParam):\n-    name = "append_param"\n-\n-    def __init__(self, separator="&amp;", first_separator="?", join="=", **kwargs):\n-        params = Util.clean_kwargs(locals().copy())\n-        super(AppendParam, self).__init__(**params)\n-\n-    def acceptable_child(self, child):\n-        return isinstance(child, AppendParamValue)\n-\n-\n-class AppendParamValue(XMLParam):\n-    name = "value"\n-\n-    def __init__(self, name="_export", missing="1", **kwargs):\n-        params = Util.clean_kwargs(locals().copy())\n-        super(AppendParamValue, self).__init__(**params)\n-\n-    def acceptable_child(self, child):\n-        return False\n-\n-\n-class EdamOperations(XMLParam):\n-    name = "edam_operations"\n-\n-    def acceptable_child(self, child):\n-        return issubclass(type(child), EdamOperation)\n-\n-    def has_operation(self, edam_operation):\n-        """\n-        Check the presence of a given edam_operation.\n-\n-        :type edam_operation: STRING\n-        """\n-        for operation in self.children:\n-            if operation.node.text == edam_operation:\n-                return True\n-        return False\n-\n-\n-class EdamOperation(XMLParam):\n-    name = "edam_operation"\n-\n-    def __init__(self, value):\n-        super(EdamOperation, self).__init__()\n-        self.node.text = str(value)\n-\n-\n-class EdamTopics(XMLParam):\n-    name = "edam_topics"\n-\n-    def acceptable_child(self, chil'..b'e"):\n-            return self.command_line_override\n-        else:\n-            return "%s%s%s" % (self.flag(), self.space_between_arg, self.mako_name())\n-\n-    def mako_name(self):\n-        return "$" + self.mako_identifier\n-\n-    def flag(self):\n-        flag = "-" * self.num_dashes\n-        return flag + self.mako_identifier\n-\n-    def acceptable_child(self, child):\n-        return isinstance(child, OutputFilter) or isinstance(child, ChangeFormat) or isinstance(child, DiscoverDatasets)\n-\n-\n-class OutputFilter(XMLParam):\n-    name = "filter"\n-\n-    def __init__(self, text, **kwargs):\n-        params = Util.clean_kwargs(locals().copy())\n-        del params["text"]\n-        super(OutputFilter, self).__init__(**params)\n-        self.node.text = text\n-\n-    def acceptable_child(self, child):\n-        return False\n-\n-\n-class ChangeFormat(XMLParam):\n-    name = "change_format"\n-\n-    def __init__(self, **kwargs):\n-        params = Util.clean_kwargs(locals().copy())\n-        super(ChangeFormat, self).__init__(**params)\n-\n-    def acceptable_child(self, child):\n-        return isinstance(child, ChangeFormatWhen)\n-\n-\n-class ChangeFormatWhen(XMLParam):\n-    name = "when"\n-\n-    def __init__(self, input, format, value, **kwargs):\n-        params = Util.clean_kwargs(locals().copy())\n-        super(ChangeFormatWhen, self).__init__(**params)\n-\n-    def acceptable_child(self, child):\n-        return False\n-\n-\n-class OutputCollection(XMLParam):\n-    name = "collection"\n-\n-    def __init__(\n-        self,\n-        name,\n-        type=None,\n-        label=None,\n-        format_source=None,\n-        type_source=None,\n-        structured_like=None,\n-        inherit_format=None,\n-        **kwargs\n-    ):\n-        params = Util.clean_kwargs(locals().copy())\n-        super(OutputCollection, self).__init__(**params)\n-\n-    def acceptable_child(self, child):\n-        return isinstance(child, OutputData) or isinstance(child, OutputFilter) or isinstance(child, DiscoverDatasets)\n-\n-\n-class DiscoverDatasets(XMLParam):\n-    name = "discover_datasets"\n-\n-    def __init__(self, pattern, directory=None, format=None, ext=None, visible=None, **kwargs):\n-        params = Util.clean_kwargs(locals().copy())\n-        super(DiscoverDatasets, self).__init__(**params)\n-\n-\n-class Tests(XMLParam):\n-    name = "tests"\n-\n-    def acceptable_child(self, child):\n-        return issubclass(type(child), Test)\n-\n-\n-class Test(XMLParam):\n-    name = "test"\n-\n-    def acceptable_child(self, child):\n-        return isinstance(child, TestParam) or isinstance(child, TestOutput)\n-\n-\n-class TestParam(XMLParam):\n-    name = "param"\n-\n-    def __init__(self, name, value=None, ftype=None, dbkey=None, **kwargs):\n-        params = Util.clean_kwargs(locals().copy())\n-        super(TestParam, self).__init__(**params)\n-\n-\n-class TestOutput(XMLParam):\n-    name = "output"\n-\n-    def __init__(\n-        self,\n-        name=None,\n-        file=None,\n-        ftype=None,\n-        sort=None,\n-        value=None,\n-        md5=None,\n-        checksum=None,\n-        compare=None,\n-        lines_diff=None,\n-        delta=None,\n-        **kwargs\n-    ):\n-        params = Util.clean_kwargs(locals().copy())\n-        super(TestOutput, self).__init__(**params)\n-\n-\n-class Citations(XMLParam):\n-    name = "citations"\n-\n-    def acceptable_child(self, child):\n-        return issubclass(type(child), Citation)\n-\n-    def has_citation(self, type, value):\n-        """\n-        Check the presence of a given citation.\n-\n-        :type type: STRING\n-        :type value: STRING\n-        """\n-        for citation in self.children:\n-            if citation.node.attrib["type"] == type and citation.node.text == value:\n-                return True\n-        return False\n-\n-\n-class Citation(XMLParam):\n-    name = "citation"\n-\n-    def __init__(self, type, value):\n-        passed_kwargs = {}\n-        passed_kwargs["type"] = type\n-        super(Citation, self).__init__(**passed_kwargs)\n-        self.node.text = str(value)\n'
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/galaxyxml/tool/parameters/__pycache__/__init__.cpython-36.pyc
b
Binary file toolfactory/galaxyxml/tool/parameters/__pycache__/__init__.cpython-36.pyc has changed
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/rgToolFactory2.py
--- a/toolfactory/rgToolFactory2.py Wed Aug 12 01:43:46 2020 -0400
+++ b/toolfactory/rgToolFactory2.py Wed Aug 12 19:00:44 2020 -0400
b
@@ -17,8 +17,10 @@
 # removed all the old complications including making the new tool use this same script
 # galaxyxml now generates the tool xml https://github.com/hexylena/galaxyxml
 # No support for automatic HTML file creation from arbitrary outputs
-# TODO: add option to run that code as a post execution hook
-# TODO: add additional history input parameters - currently only one
+# essential problem is to create two command lines - one for the tool xml and a different
+# one to run the executable with the supplied test data and settings
+# Be simpler to write the tool, then run it with planemo and soak up the test outputs.
+
 
 
 import argparse
@@ -249,6 +251,8 @@
         )
         art = "%s.%s" % (self.tool_name, self.args.interpreter_name)
         artifact = open(art, "wb")
+        if self.args.interpreter_name == "python":
+            artifact.write(bytes("#!/usr/bin/env python\n", "utf8"))
         artifact.write(bytes(self.script, "utf8"))
         artifact.close()
         aCL(self.args.interpreter_name)
@@ -541,7 +545,8 @@
         )
         self.tool.add_comment("Source in git at: %s" % (toolFactoryURL))
         self.tool.add_comment(
-            "Cite: Creating re-usable tools from scripts doi: 10.1093/bioinformatics/bts573"
+            "Cite: Creating re-usable tools from scripts doi: \
+            10.1093/bioinformatics/bts573"
         )
         exml = self.tool.export()
         xf = open('%s.xml' % self.tool_name, "w")
b
diff -r a30536c100bf -r 2cd6555baf44 toolfactory/rgToolFactory2.xml
--- a/toolfactory/rgToolFactory2.xml Wed Aug 12 01:43:46 2020 -0400
+++ b/toolfactory/rgToolFactory2.xml Wed Aug 12 19:00:44 2020 -0400
[
@@ -122,7 +122,7 @@
   </macros>
    <requirements>
       <requirement type="package">python</requirement>
-      <requirement type="package">lxml</requirement>
+      <requirement type="package">galaxyxml</requirement>
   </requirements>
   <command interpreter="python"><![CDATA[
 #import os