Mercurial > repos > fubar > tool_factory_2
diff toolfactory/galaxyxml/tool/__init__.py @ 35:5d38cb3d9be8 draft
added patched galaxyxml code temporarily until PR accepted
author | fubar |
---|---|
date | Sat, 08 Aug 2020 19:55:55 -0400 |
parents | |
children | ce2b1f8ea68d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolfactory/galaxyxml/tool/__init__.py Sat Aug 08 19:55:55 2020 -0400 @@ -0,0 +1,172 @@ +import copy +import logging +from lxml import etree +from galaxyxml import Util, GalaxyXML +from galaxyxml.tool.parameters import XMLParam + +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 != None: + 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()