Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/planemo/training/tool_input.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author | shellac |
---|---|
date | Sat, 02 May 2020 07:14:21 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:26e78fe6e8c4 |
---|---|
1 """Module contains code for the ToolInput class, dealing with the description of tool in workflow and XML.""" | |
2 | |
3 from planemo import templates | |
4 from planemo.io import info | |
5 | |
6 | |
7 INPUT_PARAM = """ | |
8 >{{space}}- *"{{param_label}}"*: `{{param_value}}` | |
9 """ | |
10 | |
11 INPUT_FILE_TEMPLATE = """ | |
12 >{{space}}- {{ '{%' }} icon {{icon}} {{ '%}' }} *"{{input_name}}"*: {{input_value}} | |
13 """ | |
14 | |
15 INPUT_SECTION = """ | |
16 >{{space}}- In *"{{section_label}}"*: | |
17 """ | |
18 | |
19 INPUT_ADD_REPEAT = """ | |
20 >{{space}}- {{ '{%' }} icon param-repeat {{ '%}' }} *"Insert {{repeat_label}}"* | |
21 """ | |
22 | |
23 SPACE = ' ' | |
24 | |
25 | |
26 class ToolInput(object): | |
27 """Class to describe a tool input / parameter and its value from a workflow.""" | |
28 | |
29 def __init__(self, tool_inp_desc, wf_param_values, wf_steps, level, should_be_there=False, force_default=False): | |
30 """Init an instance of ToolInput.""" | |
31 self.name = tool_inp_desc['name'] | |
32 if 'type' not in tool_inp_desc: | |
33 raise ValueError("No type for the parameter %s" % tool_inp_desc['name']) | |
34 self.type = tool_inp_desc['type'] | |
35 self.tool_inp_desc = tool_inp_desc | |
36 self.level = level | |
37 self.wf_param_values = wf_param_values | |
38 self.wf_steps = wf_steps | |
39 self.formatted_desc = '' | |
40 self.force_default = force_default | |
41 | |
42 if self.name not in self.wf_param_values: | |
43 if not should_be_there: | |
44 info("%s not in workflow" % self.name) | |
45 else: | |
46 raise ValueError("%s not in workflow" % (self.name)) | |
47 else: | |
48 self.wf_param_values = self.wf_param_values[self.name] | |
49 | |
50 def get_formatted_inputs(self): | |
51 """Format the inputs of a step.""" | |
52 inputlist = '' | |
53 inps = [] | |
54 if isinstance(self.wf_param_values, list): | |
55 # multiple input (not collection) | |
56 icon = 'param-files' | |
57 for i in self.wf_param_values: | |
58 inps.append('`%s` %s' % ( | |
59 i['output_name'], | |
60 get_input_tool_name(i['id'], self.wf_steps))) | |
61 else: | |
62 inp = self.wf_param_values | |
63 if 'id' in inp: | |
64 # sinle input or collection | |
65 inp_type = self.wf_steps[str(inp['id'])]['type'] | |
66 if 'collection' in inp_type: | |
67 icon = 'param-collection' | |
68 else: | |
69 icon = 'param-file' | |
70 inps = ['`%s` %s' % ( | |
71 inp['output_name'], | |
72 get_input_tool_name(inp['id'], self.wf_steps))] | |
73 if len(inps) > 0: | |
74 inputlist += templates.render(INPUT_FILE_TEMPLATE, **{ | |
75 "icon": icon, | |
76 "input_name": self.tool_inp_desc['label'], | |
77 "input_value": ', '.join(inps), | |
78 "space": SPACE * self.level | |
79 }) | |
80 return inputlist | |
81 | |
82 def get_lower_param_desc(self): | |
83 """Get the formatted description of the paramaters in the 'inputs' of the tool description.""" | |
84 sub_param_desc = '' | |
85 for inp in self.tool_inp_desc["inputs"]: | |
86 tool_inp = ToolInput( | |
87 inp, | |
88 self.wf_param_values, | |
89 self.wf_steps, | |
90 self.level + 1) | |
91 sub_param_desc += tool_inp.get_formatted_desc() | |
92 return sub_param_desc | |
93 | |
94 def get_formatted_section_desc(self): | |
95 """Format the description (label and value) for parameters in a section.""" | |
96 section_paramlist = '' | |
97 sub_param_desc = self.get_lower_param_desc() | |
98 if sub_param_desc != '': | |
99 section_paramlist += templates.render(INPUT_SECTION, **{ | |
100 'space': SPACE * self.level, | |
101 'section_label': self.tool_inp_desc['title']}) | |
102 section_paramlist += sub_param_desc | |
103 return section_paramlist | |
104 | |
105 def get_formatted_conditional_desc(self): | |
106 """Format the description (label and value) for parameters in a conditional.""" | |
107 conditional_paramlist = '' | |
108 # Get conditional parameter | |
109 inp = ToolInput( | |
110 self.tool_inp_desc['test_param'], | |
111 self.wf_param_values, | |
112 self.wf_steps, | |
113 self.level, | |
114 should_be_there=True, | |
115 force_default=True) | |
116 conditional_paramlist = inp.get_formatted_desc() | |
117 cond_param = inp.wf_param_values | |
118 | |
119 # Get parameters in the when and their values | |
120 tmp_tool_inp_desc = self.tool_inp_desc | |
121 for case in tmp_tool_inp_desc['cases']: | |
122 if case['value'] == cond_param and len(case['inputs']) > 0: | |
123 self.tool_inp_desc = case | |
124 conditional_paramlist += self.get_lower_param_desc() | |
125 self.tool_inp_desc = tmp_tool_inp_desc | |
126 return conditional_paramlist | |
127 | |
128 def get_formatted_repeat_desc(self): | |
129 """Format the description (label and value) for parameters in a repeat.""" | |
130 repeat_paramlist = '' | |
131 if self.wf_param_values != '[]': | |
132 tool_inp = {} | |
133 for inp in self.tool_inp_desc["inputs"]: | |
134 tool_inp.setdefault(inp['name'], inp) | |
135 tmp_wf_param_values = self.wf_param_values | |
136 cur_level = self.level | |
137 for ind, param in enumerate(tmp_wf_param_values): | |
138 self.wf_param_values = param | |
139 self.level = cur_level + 1 | |
140 paramlist_in_repeat = self.get_lower_param_desc() | |
141 if paramlist_in_repeat != '': | |
142 # add first click | |
143 repeat_paramlist += templates.render(INPUT_ADD_REPEAT, **{ | |
144 'space': SPACE * (self.level), | |
145 'repeat_label': self.tool_inp_desc['title']}) | |
146 repeat_paramlist += paramlist_in_repeat | |
147 self.level = cur_level | |
148 self.wf_param_values = tmp_wf_param_values | |
149 | |
150 repeat_desc = '' | |
151 if repeat_paramlist != '': | |
152 repeat_desc += templates.render(INPUT_SECTION, **{ | |
153 'space': SPACE * self.level, | |
154 'section_label': self.tool_inp_desc['title']}) + repeat_paramlist | |
155 return repeat_desc | |
156 | |
157 def get_formatted_other_param_desc(self): | |
158 """Get value of a 'simple' parameter if different from the default value, None otherwise.""" | |
159 param_value = None | |
160 if self.tool_inp_desc['value'] == self.wf_param_values and not self.force_default: | |
161 param_value = None | |
162 elif self.type == 'boolean': | |
163 if bool(self.tool_inp_desc['value']) == self.wf_param_values: | |
164 param_value = None | |
165 else: | |
166 param_value = 'Yes' if self.wf_param_values else 'No' | |
167 elif self.type == 'select': | |
168 param_values = [] | |
169 for opt in self.tool_inp_desc['options']: | |
170 if opt[1] == self.wf_param_values: | |
171 param_values.append(opt[0]) | |
172 param_value = ', '.join(param_values) | |
173 elif self.type == 'data_column': | |
174 param_value = "c%s" % self.wf_param_values | |
175 else: | |
176 param_value = self.wf_param_values | |
177 | |
178 param_desc = '' | |
179 if param_value is not None: | |
180 param_desc = templates.render(INPUT_PARAM, **{ | |
181 'space': SPACE * self.level, | |
182 'param_label': self.tool_inp_desc['label'], | |
183 'param_value': param_value}) | |
184 return param_desc | |
185 | |
186 def get_formatted_desc(self): | |
187 """Get the formatted description (ready for hands-on tutorial) of the parameter.""" | |
188 if self.wf_param_values: | |
189 if self.type == 'data' or self.type == 'data_collection': | |
190 self.formatted_desc += self.get_formatted_inputs() | |
191 elif self.type == 'section': | |
192 self.formatted_desc += self.get_formatted_section_desc() | |
193 elif self.type == 'conditional': | |
194 self.formatted_desc += self.get_formatted_conditional_desc() | |
195 elif self.type == 'repeat': | |
196 self.formatted_desc += self.get_formatted_repeat_desc() | |
197 else: | |
198 self.formatted_desc += self.get_formatted_other_param_desc() | |
199 return self.formatted_desc | |
200 | |
201 | |
202 def get_input_tool_name(step_id, steps): | |
203 """Get the string with the name of the tool that generated an input.""" | |
204 inp_provenance = '' | |
205 inp_prov_id = str(step_id) | |
206 if inp_prov_id in steps: | |
207 name = steps[inp_prov_id]['name'] | |
208 if 'Input dataset' in name: | |
209 inp_provenance = "(%s)" % name | |
210 else: | |
211 inp_provenance = "(output of **%s** {%% icon tool %%})" % name | |
212 return inp_provenance | |
213 | |
214 | |
215 def get_empty_input(): | |
216 """Get the string for an empty input.""" | |
217 return templates.render(INPUT_FILE_TEMPLATE, **{ | |
218 'space': 1 * SPACE, | |
219 'icon': 'param-file', | |
220 'input_name': 'Input file', | |
221 'input_value': 'File' | |
222 }) | |
223 | |
224 | |
225 def get_empty_param(): | |
226 """Get the string for an empty param.""" | |
227 return templates.render(INPUT_PARAM, **{ | |
228 'space': 1 * SPACE, | |
229 'param_label': 'Parameter', | |
230 'param_value': 'a value' | |
231 }) |