annotate toolfactory/galaxyxml/tool/__init__.py @ 92:6ce360759c28 draft

Uploaded
author fubar
date Thu, 19 Nov 2020 23:59:50 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
92
6ce360759c28 Uploaded
fubar
parents:
diff changeset
1 import copy
6ce360759c28 Uploaded
fubar
parents:
diff changeset
2 import logging
6ce360759c28 Uploaded
fubar
parents:
diff changeset
3
6ce360759c28 Uploaded
fubar
parents:
diff changeset
4 from galaxyxml import GalaxyXML, Util
6ce360759c28 Uploaded
fubar
parents:
diff changeset
5 from galaxyxml.tool.parameters import XMLParam
6ce360759c28 Uploaded
fubar
parents:
diff changeset
6
6ce360759c28 Uploaded
fubar
parents:
diff changeset
7 from lxml import etree
6ce360759c28 Uploaded
fubar
parents:
diff changeset
8
6ce360759c28 Uploaded
fubar
parents:
diff changeset
9 VALID_TOOL_TYPES = ("data_source", "data_source_async")
6ce360759c28 Uploaded
fubar
parents:
diff changeset
10 VALID_URL_METHODS = ("get", "post")
6ce360759c28 Uploaded
fubar
parents:
diff changeset
11
6ce360759c28 Uploaded
fubar
parents:
diff changeset
12 logging.basicConfig(level=logging.INFO)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
13 logger = logging.getLogger(__name__)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
14
6ce360759c28 Uploaded
fubar
parents:
diff changeset
15
6ce360759c28 Uploaded
fubar
parents:
diff changeset
16 class Tool(GalaxyXML):
6ce360759c28 Uploaded
fubar
parents:
diff changeset
17
6ce360759c28 Uploaded
fubar
parents:
diff changeset
18 def __init__(
6ce360759c28 Uploaded
fubar
parents:
diff changeset
19 self,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
20 name,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
21 id,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
22 version,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
23 description,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
24 executable,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
25 hidden=False,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
26 tool_type=None,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
27 URL_method=None,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
28 workflow_compatible=True,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
29 interpreter=None,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
30 version_command="interpreter filename.exe --version",
6ce360759c28 Uploaded
fubar
parents:
diff changeset
31 command_override=None,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
32 ):
6ce360759c28 Uploaded
fubar
parents:
diff changeset
33
6ce360759c28 Uploaded
fubar
parents:
diff changeset
34 self.executable = executable
6ce360759c28 Uploaded
fubar
parents:
diff changeset
35 self.interpreter = interpreter
6ce360759c28 Uploaded
fubar
parents:
diff changeset
36 self.command_override = command_override
6ce360759c28 Uploaded
fubar
parents:
diff changeset
37 kwargs = {
6ce360759c28 Uploaded
fubar
parents:
diff changeset
38 "name": name,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
39 "id": id,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
40 "version": version,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
41 "hidden": hidden,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
42 "workflow_compatible": workflow_compatible,
6ce360759c28 Uploaded
fubar
parents:
diff changeset
43 }
6ce360759c28 Uploaded
fubar
parents:
diff changeset
44 self.version_command = version_command
6ce360759c28 Uploaded
fubar
parents:
diff changeset
45
6ce360759c28 Uploaded
fubar
parents:
diff changeset
46 # Remove some of the default values to make tools look a bit nicer
6ce360759c28 Uploaded
fubar
parents:
diff changeset
47 if not hidden:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
48 del kwargs["hidden"]
6ce360759c28 Uploaded
fubar
parents:
diff changeset
49 if workflow_compatible:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
50 del kwargs["workflow_compatible"]
6ce360759c28 Uploaded
fubar
parents:
diff changeset
51
6ce360759c28 Uploaded
fubar
parents:
diff changeset
52 kwargs = Util.coerce(kwargs)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
53 self.root = etree.Element("tool", **kwargs)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
54
6ce360759c28 Uploaded
fubar
parents:
diff changeset
55 if tool_type is not None:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
56 if tool_type not in VALID_TOOL_TYPES:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
57 raise Exception("Tool type must be one of %s" % ",".join(VALID_TOOL_TYPES))
6ce360759c28 Uploaded
fubar
parents:
diff changeset
58 else:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
59 kwargs["tool_type"] = tool_type
6ce360759c28 Uploaded
fubar
parents:
diff changeset
60
6ce360759c28 Uploaded
fubar
parents:
diff changeset
61 if URL_method is not None:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
62 if URL_method in VALID_URL_METHODS:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
63 kwargs["URL_method"] = URL_method
6ce360759c28 Uploaded
fubar
parents:
diff changeset
64 else:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
65 raise Exception("URL_method must be one of %s" % ",".join(VALID_URL_METHODS))
6ce360759c28 Uploaded
fubar
parents:
diff changeset
66
6ce360759c28 Uploaded
fubar
parents:
diff changeset
67 description_node = etree.SubElement(self.root, "description")
6ce360759c28 Uploaded
fubar
parents:
diff changeset
68 description_node.text = description
6ce360759c28 Uploaded
fubar
parents:
diff changeset
69
6ce360759c28 Uploaded
fubar
parents:
diff changeset
70 def add_comment(self, comment_txt):
6ce360759c28 Uploaded
fubar
parents:
diff changeset
71 comment = etree.Comment(comment_txt)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
72 self.root.insert(0, comment)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
73
6ce360759c28 Uploaded
fubar
parents:
diff changeset
74 def append_version_command(self):
6ce360759c28 Uploaded
fubar
parents:
diff changeset
75 version_command = etree.SubElement(self.root, "version_command")
6ce360759c28 Uploaded
fubar
parents:
diff changeset
76 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
77 version_command.text = etree.CDATA(self.version_command)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
78 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
79 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
80
6ce360759c28 Uploaded
fubar
parents:
diff changeset
81 def append(self, sub_node):
6ce360759c28 Uploaded
fubar
parents:
diff changeset
82 if issubclass(type(sub_node), XMLParam):
6ce360759c28 Uploaded
fubar
parents:
diff changeset
83 self.root.append(sub_node.node)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
84 else:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
85 self.root.append(sub_node)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
86
6ce360759c28 Uploaded
fubar
parents:
diff changeset
87 def clean_command_string(self, command_line):
6ce360759c28 Uploaded
fubar
parents:
diff changeset
88 clean = []
6ce360759c28 Uploaded
fubar
parents:
diff changeset
89 for x in command_line:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
90 if x is not [] and x is not [""]:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
91 clean.append(x)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
92
6ce360759c28 Uploaded
fubar
parents:
diff changeset
93 return "\n".join(clean)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
94
6ce360759c28 Uploaded
fubar
parents:
diff changeset
95 def export(self, keep_old_command=False): # noqa
6ce360759c28 Uploaded
fubar
parents:
diff changeset
96
6ce360759c28 Uploaded
fubar
parents:
diff changeset
97 export_xml = copy.deepcopy(self)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
98
6ce360759c28 Uploaded
fubar
parents:
diff changeset
99 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
100 export_xml.append(export_xml.edam_operations)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
101 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
102 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
103
6ce360759c28 Uploaded
fubar
parents:
diff changeset
104 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
105 export_xml.append(export_xml.edam_topics)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
106 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
107 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
108
6ce360759c28 Uploaded
fubar
parents:
diff changeset
109 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
110 export_xml.append(export_xml.requirements)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
111 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
112 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
113
6ce360759c28 Uploaded
fubar
parents:
diff changeset
114 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
115 export_xml.append(export_xml.configfiles)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
116 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
117 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
118
6ce360759c28 Uploaded
fubar
parents:
diff changeset
119 if self.command_override:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
120 command_line = self.command_override
6ce360759c28 Uploaded
fubar
parents:
diff changeset
121 else:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
122 command_line = []
6ce360759c28 Uploaded
fubar
parents:
diff changeset
123 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
124 command_line.append(export_xml.inputs.cli())
6ce360759c28 Uploaded
fubar
parents:
diff changeset
125 except Exception as e:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
126 logger.warning(str(e))
6ce360759c28 Uploaded
fubar
parents:
diff changeset
127
6ce360759c28 Uploaded
fubar
parents:
diff changeset
128 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
129 command_line.append(export_xml.outputs.cli())
6ce360759c28 Uploaded
fubar
parents:
diff changeset
130 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
131 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
132
6ce360759c28 Uploaded
fubar
parents:
diff changeset
133 # Add stdio section
6ce360759c28 Uploaded
fubar
parents:
diff changeset
134 stdio = etree.SubElement(export_xml.root, "stdio")
6ce360759c28 Uploaded
fubar
parents:
diff changeset
135 etree.SubElement(stdio, "exit_code", range="1:", level="fatal")
6ce360759c28 Uploaded
fubar
parents:
diff changeset
136
6ce360759c28 Uploaded
fubar
parents:
diff changeset
137 # Append version command
6ce360759c28 Uploaded
fubar
parents:
diff changeset
138 export_xml.append_version_command()
6ce360759c28 Uploaded
fubar
parents:
diff changeset
139
6ce360759c28 Uploaded
fubar
parents:
diff changeset
140 # Steal interpreter from kwargs
6ce360759c28 Uploaded
fubar
parents:
diff changeset
141 command_kwargs = {}
6ce360759c28 Uploaded
fubar
parents:
diff changeset
142 if export_xml.interpreter is not None:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
143 command_kwargs["interpreter"] = export_xml.interpreter
6ce360759c28 Uploaded
fubar
parents:
diff changeset
144
6ce360759c28 Uploaded
fubar
parents:
diff changeset
145 # Add command section
6ce360759c28 Uploaded
fubar
parents:
diff changeset
146 command_node = etree.SubElement(export_xml.root, "command", **command_kwargs)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
147
6ce360759c28 Uploaded
fubar
parents:
diff changeset
148 if keep_old_command:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
149 if getattr(self, "command", None):
6ce360759c28 Uploaded
fubar
parents:
diff changeset
150 command_node.text = etree.CDATA(export_xml.command)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
151 else:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
152 logger.warning("The tool does not have any old command stored. " + "Only the command line is written.")
6ce360759c28 Uploaded
fubar
parents:
diff changeset
153 command_node.text = export_xml.executable
6ce360759c28 Uploaded
fubar
parents:
diff changeset
154 else:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
155 if self.command_override:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
156 actual_cli = export_xml.clean_command_string(command_line)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
157 else:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
158 actual_cli = "%s %s" % (export_xml.executable, export_xml.clean_command_string(command_line))
6ce360759c28 Uploaded
fubar
parents:
diff changeset
159 command_node.text = etree.CDATA(actual_cli.strip())
6ce360759c28 Uploaded
fubar
parents:
diff changeset
160
6ce360759c28 Uploaded
fubar
parents:
diff changeset
161 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
162 export_xml.append(export_xml.inputs)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
163 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
164 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
165
6ce360759c28 Uploaded
fubar
parents:
diff changeset
166 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
167 export_xml.append(export_xml.outputs)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
168 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
169 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
170
6ce360759c28 Uploaded
fubar
parents:
diff changeset
171 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
172 export_xml.append(export_xml.tests)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
173 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
174 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
175
6ce360759c28 Uploaded
fubar
parents:
diff changeset
176 help_element = etree.SubElement(export_xml.root, "help")
6ce360759c28 Uploaded
fubar
parents:
diff changeset
177 help_element.text = etree.CDATA(export_xml.help)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
178
6ce360759c28 Uploaded
fubar
parents:
diff changeset
179 try:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
180 export_xml.append(export_xml.citations)
6ce360759c28 Uploaded
fubar
parents:
diff changeset
181 except Exception:
6ce360759c28 Uploaded
fubar
parents:
diff changeset
182 pass
6ce360759c28 Uploaded
fubar
parents:
diff changeset
183
6ce360759c28 Uploaded
fubar
parents:
diff changeset
184 return super(Tool, export_xml).export()