annotate ctd2galaxy.py @ 6:71241c4dc4d0 draft

Uploaded
author holtgrewe
date Fri, 28 Jun 2013 14:01:42 -0400
parents 170e48a55078
children 19597b57ada8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
1 #!/usr/bin/env python
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
2 """Conversion of the CTD format into Galaxy XML.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
3
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
4 The CTD parser should be reusable but is not in its own module since it is
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
5 only used here at the moment.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
6 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
7
5
170e48a55078 Uploaded
holtgrewe
parents: 0
diff changeset
8 try:
170e48a55078 Uploaded
holtgrewe
parents: 0
diff changeset
9 import argparse
170e48a55078 Uploaded
holtgrewe
parents: 0
diff changeset
10 except ImportError:
170e48a55078 Uploaded
holtgrewe
parents: 0
diff changeset
11 import argparse26 as argparse
0
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
12 import operator
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
13 import sys
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
14 import xml.sax
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
15 import xml.sax.saxutils
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
16
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
17 class CTDFormatException(Exception):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
18 """Raised when there is a format error in CTD."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
19
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
20
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
21 class CLIElement(object):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
22 """Represents a <clielement> tag.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
23
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
24 :ivar option_identifier: with parameters (e.g. --param), empty if argument.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
25 :type option_identifier: str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
26 :ivar is_list: whether the element is a list.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
27 :type is_list: bool
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
28 :ivar param_node: link to ParametersNode, set after parsing, None if unset
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
29 :ivar is_list: w or not this element is a list.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
30 :type is_list: bool
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
31 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
32
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
33 def __init__(self, option_identifier='', mapping_path='', is_list=False):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
34 """Initialize object."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
35 self.option_identifier = option_identifier
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
36 self.param_node = None # Link to ParametersNode, set after parsing.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
37 self.mapping_path = mapping_path
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
38 self.is_list = is_list
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
39
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
40 def __str__(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
41 """String representaiton of CLIElement."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
42 t = (self.option_identifier, self.mapping_path, self.is_list)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
43 return 'CLIElement(%s, %s, %s)' % tuple(map(repr, list(t)))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
44
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
45
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
46 class ParametersNode(object):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
47 """Represents a <NODE> tag inside the <PARAMETERS> tags.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
48
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
49 :ivar name: name attribute of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
50 :ivar description: text for description attribute of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
51 :ivar value: value attribute of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
52 :ivar type_: type attribute of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
53 :ivar tags: tags attribute of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
54 :ivar supported_formats: supported_format attribute of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
55 :ivar restrictions: restrictions attribute of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
56 :ivar path: the path to the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
57 :ivar path: list of strings
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
58 :ivar parent: link to the parent of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
59 :ivar children: children of the node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
60 :type children: dict with name to node mapping
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
61 :ivar cli_element: CLIElement that this parameter is mapped to.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
62 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
63
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
64 def __init__(self, kind='', name='', description='', value='', type_='', tags='',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
65 restrictions='', supported_formats=''):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
66 """Initialize the object."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
67 self.kind = kind
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
68 self.name = name
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
69 self.description = description
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
70 self.value = value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
71 self.type_ = type_
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
72 self.tags = tags
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
73 self.supported_formats = supported_formats
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
74 self.restrictions = restrictions
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
75 self.path = None # root if is None
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
76 self.parent = None # not set, usually a list
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
77 self.children = {}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
78 self.cli_element = None
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
79
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
80 def computePath(self, is_root=True, path=[]):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
81 """Compute path entry from parent links.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
82
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
83 :param is_root: whether or not this is the root node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
84 :type is_root: bool
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
85 :param path: path to this node, excluding root
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
86 :type path: list of strings
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
87 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
88 self.path = list(path)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
89 if not is_root:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
90 self.path.append(self.name)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
91 if not self.children:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
92 return # nothing to do: early exit.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
93 for name, child in self.children.items():
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
94 child.computePath(False, self.path)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
95
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
96 def applyFunc(self, f):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
97 """Apply f to self and all children."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
98 f(self)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
99 for c in self.children.values():
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
100 c.applyFunc(f)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
101
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
102 def find(self, path):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
103 """Return ParametersNode object at the path below the node."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
104 if not path:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
105 return self
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
106 if not self.children.get(path[0]):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
107 return None
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
108 return self.children[path[0]].find(path[1:])
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
109
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
110 def __str__(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
111 """Return string representation."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
112 t = (self.name, self.description, self.value, self.type_, self.tags,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
113 self.supported_formats, self.children, self.path)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
114 return 'ParametersNode(%s, %s, %s, %s, %s, %s, %s, path=%s)' % tuple(map(repr, t))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
115
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
116 def __repr__(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
117 """Return programmatic representation, same as __str__()."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
118 return str(self)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
119
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
120
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
121 class Tool(object):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
122 """Represents the top-level <tool> tag from a CTD file.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
123
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
124 :ivar name: name attribute value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
125 :type name: str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
126 :ivar executable_name: executableName attribute value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
127 :type executable_name: str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
128 :ivar version: version attribute value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
129 :type version: str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
130 :ivar description: description attribute value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
131 :type description: str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
132 :ivar manual: manual attribute value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
133 :type manual: str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
134 :ivar doc_url: docurl attribute value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
135 :type doc_url: str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
136 :ivar category: category attribute value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
137 :type category: str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
138 :ivar cli_elements: list of CLIElement objects
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
139 :ivar parameters: root parameters node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
140 :type parameters: ParametersNode
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
141 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
142
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
143 def __init__(self, name='', executable_name='', version='',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
144 description='', manual='', doc_url='',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
145 category=''):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
146 self.name = name
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
147 self.executable_name = executable_name
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
148 self.version = version
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
149 self.description = description
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
150 self.manual = manual
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
151 self.doc_url = doc_url
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
152 self.category = category
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
153 self.cli_elements = []
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
154 self.parameters = None
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
155
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
156 def parsingDone(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
157 """Called after parsing is done.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
158
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
159 The method will compute the paths of the parameter nodes and link the
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
160 CLIElement objects in self.cli_elements to the ParameterNode objects.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
161 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
162 self.parameters.computePath()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
163 for ce in self.cli_elements:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
164 if not ce.option_identifier:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
165 continue # Skip arguments
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
166 path = ce.mapping_path.split('.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
167 node = self.parameters.find(path)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
168 if not node:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
169 raise CTDFormatException('Unknown parameter %s' % '.'.join(path))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
170 ce.param_node = node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
171 node.cli_element = ce
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
172
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
173 def __str__(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
174 t = (self.name, self.executable_name, self.version, self.description,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
175 self.manual, self.doc_url, self.category)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
176 return 'Tool(%s, %s, %s, %s, %s, %s, %s)' % tuple(map(repr, list(t)))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
177
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
178
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
179
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
180 class CTDHandler(xml.sax.handler.ContentHandler):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
181 def __init__(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
182 self.result = None
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
183 # A stack of tag names that are currently open.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
184 self.stack = []
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
185 # The current parameter to append nodes below.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
186 self.parameter_node = None
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
187
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
188 def startElement(self, name, attrs):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
189 """Handle start of element."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
190 # Maintain a stack of open tags.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
191 self.stack.append(name)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
192 # Handle the individual cases. The innermost tag is self.stack[-1].
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
193 if self.stack == ['tool']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
194 # Create the top level Tool object.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
195 self.tool = Tool()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
196 self.result = self.tool
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
197 elif self.stack == ['tool', 'cli', 'clielement']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
198 # Create a new CLIElement object for a <clieelement> tag.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
199 if not attrs.get('isList'):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
200 raise CTDFormatException('No attribute isList in <clielement>.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
201 if attrs.get('optionIdentifier') is None:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
202 raise CTDFormatException('no attribute optionIdentifier in <clielement>.')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
203 is_list = (attrs.get('isList') == 'false')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
204 option_identifier = attrs.get('optionIdentifier')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
205 self.tool.cli_elements.append(CLIElement(option_identifier=option_identifier, is_list=is_list))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
206 elif self.stack == ['tool', 'cli', 'clielement', 'mapping']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
207 # Handle a <mapping> sub entry of a <clieelement> tag.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
208 if not attrs.get('referenceName'):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
209 raise CTDFormatException('no attribute referenceName in <mapping>')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
210 self.tool.cli_elements[-1].mapping_path = attrs['referenceName']
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
211 elif self.stack == ['tool', 'PARAMETERS']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
212 # Handle the <PARAMETERS> entry by creating a new top parameters node.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
213 self.tool.parameters = ParametersNode(kind='node', name='<root>')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
214 self.parameter_node = self.tool.parameters
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
215 elif self.stack[:2] == ['tool', 'PARAMETERS'] and self.stack[-1] == 'NODE':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
216 # Create a new node ParametersNode for the <PARAMETERS> entry.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
217 if not attrs.get('name'):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
218 raise CTDFormatException('no attribute name in <NODE>')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
219 name = attrs.get('name')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
220 node = ParametersNode(kind='node', name=name)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
221 node.parent = self.parameter_node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
222 self.parameter_node.children[name] = node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
223 self.parameter_node = node
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
224 elif self.stack[:2] == ['tool', 'PARAMETERS'] and self.stack[-1] == 'ITEM':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
225 # Create a new item ParametersNode for the <ITEM> entry.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
226 if not attrs.get('name'):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
227 raise CTDFormatException('no attribute name in <ITEM>')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
228 name = attrs.get('name')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
229 value = attrs.get('value')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
230 type_ = attrs.get('type')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
231 tags = attrs.get('tags')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
232 description = attrs.get('description')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
233 restrictions = attrs.get('restrictions')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
234 supported_formats = attrs.get('supported_formats')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
235 child = ParametersNode(
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
236 kind='item', name=name, description=description, value=value,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
237 type_=type_, tags=tags, supported_formats=supported_formats,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
238 restrictions=restrictions)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
239 self.parameter_node.children[name] = child
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
240
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
241 def endElement(self, name):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
242 """Handle closing tag."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
243 # Maintain stack.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
244 self.stack.pop()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
245 # Go up one node in the parameters tree if </NODE>
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
246 if name == 'NODE':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
247 self.parameter_node = self.parameter_node.parent
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
248
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
249 def characters(self, content):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
250 """Handle characters in XML file."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
251 if self.stack == ['tool', 'name']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
252 self.tool.name += content
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
253 elif self.stack == ['tool', 'executableName']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
254 self.tool.executable_name += content
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
255 elif self.stack == ['tool', 'version']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
256 self.tool.version += content
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
257 elif self.stack == ['tool', 'description']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
258 self.tool.description += content
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
259 elif self.stack == ['tool', 'manual']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
260 self.tool.manual += content
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
261 elif self.stack == ['tool', 'docurl']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
262 self.tool.doc_url += content
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
263 elif self.stack == ['tool', 'category']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
264 self.tool.category += content
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
265
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
266
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
267 class CTDParser(object):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
268 """Parser for CTD files."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
269
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
270 def __init__(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
271 self.handler = CTDHandler()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
272
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
273 def parse(self, path):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
274 # Parse XML into Tool object.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
275 parser = xml.sax.make_parser()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
276 parser.setContentHandler(self.handler)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
277 parser.parse(path)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
278 # Compute paths for tool's parameters.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
279 self.handler.result.parsingDone()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
280 return self.handler.result
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
281
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
282
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
283 class XMLWriter(object):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
284 """Base class for XML writers.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
285
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
286
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
287 :ivar result: list of strings that are joined for the final XML
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
288 :ivar indent_level: int with the indentation level
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
289 """
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
290
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
291 def __init__(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
292 self.result = []
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
293 self.indent_level = 0
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
294
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
295 def indent(self):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
296 """Return indentation whitespace."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
297 return ' ' * self.indent_level
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
298
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
299 def appendTag(self, tag, text='', args={}):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
300 """Append a tag to self.result with text content only or no content at all."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
301 e = xml.sax.saxutils.quoteattr
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
302 args_str = ' '.join('%s=%s' % (key, e(str(value))) for key, value in args.items())
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
303 if args_str:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
304 args_str = ' '+ args_str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
305 vals = {'indent': self.indent(),
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
306 'tag': tag,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
307 'text': text.strip(),
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
308 'args': args_str}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
309 if text:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
310 self.result.append('%(indent)s<%(tag)s%(args)s>%(text)s</%(tag)s>\n' % vals)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
311 else:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
312 self.result.append('%(indent)s<%(tag)s%(args)s />\n' % vals)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
313
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
314 def openTag(self, tag, args={}):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
315 """Append an opening tag to self.result."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
316 e = xml.sax.saxutils.quoteattr
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
317 args_str = ' '.join('%s=%s' % (key, e(str(value))) for key, value in args.items())
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
318 if args_str:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
319 args_str = ' ' + args_str
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
320 vals = {'indent': self.indent(),
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
321 'tag': tag,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
322 'args': args_str}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
323 self.result.append('%(indent)s<%(tag)s%(args)s>\n' % vals)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
324
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
325 def closeTag(self, tag):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
326 """Append a closing tag to self.result."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
327 vals = {'indent': self.indent(), 'tag': tag}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
328 self.result.append('%(indent)s</%(tag)s>\n' % vals)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
329
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
330 def handleParameters(self, node):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
331 """Recursion for appending tags for ParametersNode."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
332 for pn in node.children.values():
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
333 if pn.kind == 'item':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
334 args = {'name': pn.name,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
335 'value': pn.value,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
336 'type': pn.type_,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
337 'description': pn.description,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
338 'restrictions': pn.restrictions,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
339 'tags': pn.tags}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
340 self.appendTag('ITEM', args=args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
341 else: # node.kind == 'node'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
342 args = {'name': pn.name,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
343 'description': pn.description}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
344 self.openTag('NODE', args=args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
345 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
346 self.handleParameters(pn)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
347 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
348 self.closeTag('NODE')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
349
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
350
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
351 class CTDWriter(XMLWriter):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
352 """Write a Tool to CTD format."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
353
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
354 def run(self, tool, f):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
355 """Write the given Tool to file f."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
356 self.result.append('<?xml version="1.0" encoding="UTF-8"?>\n')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
357 self.openTag('tool')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
358 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
359 self.appendTag('name', tool.name)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
360 self.appendTag('executableName', tool.executable_name)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
361 self.appendTag('version', tool.version)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
362 self.appendTag('description', tool.description)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
363 self.appendTag('manual', tool.manual)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
364 self.appendTag('docurl', tool.doc_url)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
365 self.appendTag('category', tool.category)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
366 # <cli> and <clielement> group
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
367 self.openTag('cli')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
368 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
369 for ce in tool.cli_elements:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
370 self.openTag('clielement', args={'optionIdentifier': ce.option_identifier,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
371 'isList': {True: 'true', False: 'false'}[ce.is_list]})
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
372 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
373 self.appendTag('mapping', args={'referenceName': ce.mapping_path})
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
374 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
375 self.closeTag('clielement')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
376 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
377 self.closeTag('cli')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
378 # <PARAMETERS>, <NODE>, <ITEM> group
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
379 self.openTag('PARAMETERS', args={'version': 1.4,
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
380 'xsi:noNamespaceSchemaLocation': 'http://open-ms.sourceforge.net/schemas/Param_1_4.xsd',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
381 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance'})
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
382 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
383 self.handleParameters(tool.parameters)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
384 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
385 self.closeTag('PARAMETERS')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
386 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
387 self.closeTag('tool')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
388 # Write result
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
389 for x in self.result:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
390 f.write(x)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
391
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
392
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
393 class GalaxyWriter(XMLWriter):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
394 """Write a Tool to the Galaxy format."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
395
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
396 def run(self, tool, f):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
397 """Write the given Tool to file f."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
398 self.result.append('<?xml version="1.0" encoding="UTF-8"?>\n')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
399 self.openTag('tool', {'id': tool.executable_name, 'name': tool.name})
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
400 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
401 self.addCommandTag(tool)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
402 self.appendTag('description', text=tool.description)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
403 self.openTag('inputs')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
404 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
405 tool.parameters.applyFunc(lambda x: self.addInputParam(x))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
406 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
407 self.closeTag('inputs')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
408 self.openTag('outputs')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
409 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
410 tool.parameters.applyFunc(lambda x: self.addOutputParam(x))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
411 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
412 self.closeTag('outputs')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
413 self.openTag('stdio')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
414 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
415 self.appendTag('exit_code', args={'range': '1:', 'level': 'fatal'})
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
416 self.appendTag('exit_code', args={'range': ':-1', 'level': 'fatal'})
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
417 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
418 self.closeTag('stdio')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
419 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
420 self.closeTag('tool')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
421 # Write result
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
422 for x in self.result:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
423 f.write(x)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
424
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
425 def addInputParam(self, param_node):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
426 """Add a ParametersNode object if it is to go to <inputs>."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
427 if param_node.tags and 'output file' in param_node.tags.split(','):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
428 return # Skip output files
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
429 if param_node.kind != 'item':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
430 return # Skip if not item.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
431 args = {}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
432 if param_node.tags and 'input file' in param_node.tags.split(','):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
433 args['type'] = 'data'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
434 args['format'] = ','.join([x.replace('*', '').replace('.', '')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
435 for x in param_node.supported_formats.split(',')])
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
436 args['name'] = '_'.join(param_node.path).replace('-', '_').replace('.', '_')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
437 args['label'] = param_node.description
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
438 args['type'] = 'data'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
439 self.appendTag('param', args=args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
440 else:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
441 TYPE_MAP = {
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
442 'string': 'text',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
443 'double': 'float',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
444 'int': 'integer'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
445 }
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
446 args['type'] = TYPE_MAP[param_node.type_]
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
447 args['name'] = '_'.join(param_node.path).replace('-', '_').replace('.', '_')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
448 args['label'] = param_node.description
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
449 if param_node.type_ == 'string' and param_node.restrictions and \
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
450 sorted(param_node.restrictions.split(',')) == ['false', 'true']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
451 args['type'] = 'boolean'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
452 if param_node.value == 'true':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
453 args['checked'] = 'true'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
454 args['truevalue'] = param_node.cli_element.option_identifier
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
455 args['falsevalue'] = ''
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
456 self.appendTag('param', args=args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
457 return
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
458 args['value'] = param_node.value
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
459 if param_node.type_ == 'string' and param_node.restrictions:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
460 args['type'] = 'select'
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
461 self.openTag('param', args=args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
462 self.indent_level += 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
463 for v in param_node.restrictions.split(','):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
464 self.appendTag('option', v, {'value': v})
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
465 self.indent_level -= 1
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
466 self.closeTag('param')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
467 else:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
468 self.appendTag('param', args=args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
469
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
470 def addOutputParam(self, param_node):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
471 """Add a ParametersNode object if it is to go to <inputs>."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
472 if not param_node.tags or not 'output file' in param_node.tags.split(','):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
473 return # Only add for output files.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
474 args = {}
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
475 if '.' in param_node.supported_formats:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
476 args['format'] = param_node.supported_formats.split(',')[0].split('.')[-1]
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
477 else:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
478 args['format'] = param_node.supported_formats.split(',')[0].split('*')[-1]
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
479 args['name'] = '_'.join(param_node.path).replace('-', '_').replace('.', '_')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
480 args['label'] = param_node.description
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
481 self.appendTag('data', args=args)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
482
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
483 def addCommandTag(self, tool):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
484 """Write <command> tag to self.result."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
485 lst = []
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
486 for ce in tool.cli_elements:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
487 bool_param = False
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
488 if ce.param_node.type_ == 'string' and ce.param_node.restrictions and \
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
489 sorted(ce.param_node.restrictions.split(',')) == ['false', 'true']:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
490 bool_param = True
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
491 if not bool_param and ce.option_identifier:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
492 lst.append(ce.option_identifier)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
493 # The path mapping is not ideal but should work OK.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
494 lst.append('$' + ce.mapping_path.replace('-', '_').replace('.', '_'))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
495 txt = [tool.executable_name] + lst
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
496 self.appendTag('command', text=' '.join(txt))
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
497
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
498
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
499 def main():
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
500 """Main function."""
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
501 # Setup argument parser.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
502 parser = argparse.ArgumentParser(description='Convert CTD to Galaxy XML')
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
503 parser.add_argument('-i', '--in-file', metavar='FILE',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
504 help='CTD file to read.', dest='in_file',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
505 required=True)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
506 parser.add_argument('-o', '--out-file', metavar='FILE',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
507 help='File to write. Output type depends on extension.',
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
508 dest='out_file', required=True)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
509
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
510 args = parser.parse_args()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
511
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
512 # Parse input.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
513 sys.stderr.write('Parsing %s...\n' % args.in_file)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
514 ctd_parser = CTDParser()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
515 tool = ctd_parser.parse(args.in_file)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
516
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
517 # Write output.
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
518 sys.stderr.write('Writing to %s...\n' % args.out_file)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
519 if args.out_file.endswith('.ctd'):
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
520 writer = CTDWriter()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
521 else:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
522 writer = GalaxyWriter()
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
523 with open(args.out_file, 'wb') as f:
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
524 writer.run(tool, f)
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
525
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
526 return 0
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
527
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
528
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
529 if __name__ == '__main__':
61d9bdb6d519 Uploaded
holtgrewe
parents:
diff changeset
530 sys.exit(main())