comparison planemo/lib/python3.7/site-packages/galaxy/tool_util/parser/cwl.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
comparison
equal deleted inserted replaced
0:d30785e31577 1:56ad4e20f292
1 import logging
2 import os
3 from collections import OrderedDict
4
5 from galaxy.tool_util.cwl.parser import tool_proxy
6 from galaxy.tool_util.deps import requirements
7 from .interface import (
8 PageSource,
9 PagesSource,
10 ToolSource,
11 )
12 from .output_actions import ToolOutputActionGroup
13 from .output_objects import ToolOutput
14 from .stdio import (
15 StdioErrorLevel,
16 ToolStdioExitCode,
17 )
18 from .yaml import YamlInputSource
19
20 log = logging.getLogger(__name__)
21
22
23 class CwlToolSource(ToolSource):
24
25 def __init__(self, tool_file, strict_cwl_validation=True):
26 self._cwl_tool_file = tool_file
27 self._id, _ = os.path.splitext(os.path.basename(tool_file))
28 self._tool_proxy = None
29 self._source_path = tool_file
30 self._strict_cwl_validation = strict_cwl_validation
31
32 @property
33 def source_path(self):
34 return self._source_path
35
36 @property
37 def tool_proxy(self):
38 if self._tool_proxy is None:
39 self._tool_proxy = tool_proxy(self._source_path, strict_cwl_validation=self._strict_cwl_validation)
40 return self._tool_proxy
41
42 def parse_tool_type(self):
43 return 'cwl'
44
45 def parse_id(self):
46 return self._id
47
48 def parse_name(self):
49 return self.tool_proxy.label() or self.parse_id()
50
51 def parse_command(self):
52 return "$__cwl_command"
53
54 def parse_environment_variables(self):
55 environment_variables = []
56 # TODO: Is this even possible from here, should instead this be moved
57 # into the job.
58
59 # for environment_variable_el in environment_variables_el.findall("environment_variable"):
60 # definition = {
61 # "name": environment_variable_el.get("name"),
62 # "template": environment_variable_el.text,
63 # }
64 # environment_variables.append(
65 # definition
66 # )
67
68 return environment_variables
69
70 def parse_edam_operations(self):
71 return []
72
73 def parse_edam_topics(self):
74 return []
75
76 def parse_help(self):
77 return self.tool_proxy.doc()
78
79 def parse_sanitize(self):
80 return False
81
82 def parse_strict_shell(self):
83 return True
84
85 def parse_stdio(self):
86 # TODO: remove duplication with YAML
87 # New format - starting out just using exit code.
88 exit_code_lower = ToolStdioExitCode()
89 exit_code_lower.range_start = float("-inf")
90 exit_code_lower.range_end = -1
91 exit_code_lower.error_level = StdioErrorLevel.FATAL
92 exit_code_high = ToolStdioExitCode()
93 exit_code_high.range_start = 1
94 exit_code_high.range_end = float("inf")
95 exit_code_lower.error_level = StdioErrorLevel.FATAL
96 return [exit_code_lower, exit_code_high], []
97
98 def parse_interpreter(self):
99 return None
100
101 def parse_version(self):
102 return "0.0.1"
103
104 def parse_description(self):
105 return self.tool_proxy.description()
106
107 def parse_interactivetool(self):
108 return []
109
110 def parse_input_pages(self):
111 page_source = CwlPageSource(self.tool_proxy)
112 return PagesSource([page_source])
113
114 def parse_outputs(self, tool):
115 output_instances = self.tool_proxy.output_instances()
116 outputs = OrderedDict()
117 output_defs = []
118 for output_instance in output_instances:
119 output_defs.append(self._parse_output(tool, output_instance))
120 # TODO: parse outputs collections
121 for output_def in output_defs:
122 outputs[output_def.name] = output_def
123 return outputs, OrderedDict()
124
125 def _parse_output(self, tool, output_instance):
126 name = output_instance.name
127 # TODO: handle filters, actions, change_format
128 output = ToolOutput(name)
129 if "File" in output_instance.output_data_type:
130 output.format = "_sniff_"
131 else:
132 output.format = "expression.json"
133 output.change_format = []
134 output.format_source = None
135 output.metadata_source = ""
136 output.parent = None
137 output.label = None
138 output.count = None
139 output.filters = []
140 output.tool = tool
141 output.hidden = ""
142 output.dataset_collector_descriptions = []
143 output.actions = ToolOutputActionGroup(output, None)
144 return output
145
146 def parse_requirements_and_containers(self):
147 containers = []
148 docker_identifier = self.tool_proxy.docker_identifier()
149 if docker_identifier:
150 containers.append({"type": "docker",
151 "identifier": docker_identifier})
152
153 software_requirements = self.tool_proxy.software_requirements()
154 return requirements.parse_requirements_from_dict(dict(
155 requirements=list(map(lambda r: {"name": r[0], "version": r[1], "type": "package"}, software_requirements)),
156 containers=containers,
157 ))
158
159 def parse_profile(self):
160 return "16.04"
161
162 def parse_python_template_version(self):
163 return '3.5'
164
165
166 class CwlPageSource(PageSource):
167
168 def __init__(self, tool_proxy):
169 cwl_instances = tool_proxy.input_instances()
170 self._input_list = list(map(self._to_input_source, cwl_instances))
171
172 def _to_input_source(self, input_instance):
173 as_dict = input_instance.to_dict()
174 return YamlInputSource(as_dict)
175
176 def parse_input_sources(self):
177 return self._input_list