Mercurial > repos > guerler > springsuite
diff planemo/lib/python3.7/site-packages/galaxy/tool_util/parser/stdio.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:32:28 -0400 (2020-07-31) |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/planemo/lib/python3.7/site-packages/galaxy/tool_util/parser/stdio.py Fri Jul 31 00:32:28 2020 -0400 @@ -0,0 +1,141 @@ +class StdioErrorLevel(object): + """ + These determine stdio-based error levels from matching on regular expressions + and exit codes. They are meant to be used comparatively, such as showing + that warning < fatal. This is really meant to just be an enum. + """ + NO_ERROR = 0 + LOG = 1 + QC = 1.1 + WARNING = 2 + FATAL = 3 + FATAL_OOM = 4 + MAX = 4 + descs = { + NO_ERROR: 'No error', + LOG: 'Log', + QC: 'QC', + WARNING: 'Warning', + FATAL: 'Fatal error', + FATAL_OOM: 'Out of memory error', + } + + @staticmethod + def desc(error_level): + err_msg = "Unknown error" + if error_level > 0 and error_level <= StdioErrorLevel.MAX: + err_msg = StdioErrorLevel.descs[error_level] + return err_msg + + +class ToolStdioExitCode(object): + """ + This is a container for the <stdio> element's <exit_code> subelement. + The exit_code element has a range of exit codes and the error level. + """ + + def __init__(self, as_dict=None): + as_dict = as_dict or {} + self.range_start = as_dict.get("range_start", float("-inf")) + self.range_end = as_dict.get("range_end", float("inf")) + self.error_level = as_dict.get("error_level", StdioErrorLevel.FATAL) + self.desc = as_dict.get("desc", "") + + def to_dict(self): + return { + "class": "ToolStdioExitCode", + "range_start": self.range_start, + "range_end": self.range_end, + "error_level": self.error_level, + "desc": self.desc, + } + + +class ToolStdioRegex(object): + """ + This is a container for the <stdio> element's regex subelement. + The regex subelement has a "match" attribute, a "sources" + attribute that contains "output" and/or "error", and a "level" + attribute that contains "warning" or "fatal". + """ + + def __init__(self, as_dict=None): + as_dict = as_dict or {} + self.match = as_dict.get("match", "") + self.stdout_match = as_dict.get("stdout_match", False) + self.stderr_match = as_dict.get("stderr_match", False) + self.error_level = as_dict.get("error_level", StdioErrorLevel.FATAL) + self.desc = as_dict.get("desc", "") + + def to_dict(self): + return { + "class": "ToolStdioRegex", + "match": self.match, + "stdout_match": self.stdout_match, + "stderr_match": self.stderr_match, + "error_level": self.error_level, + "desc": self.desc, + } + + +def error_on_exit_code(out_of_memory_exit_code=None): + exit_codes = [] + + if out_of_memory_exit_code: + exit_code_oom = ToolStdioExitCode() + exit_code_oom.range_start = int(out_of_memory_exit_code) + exit_code_oom.range_end = int(out_of_memory_exit_code) + _set_oom(exit_code_oom) + exit_codes.append(exit_code_oom) + + exit_code_lower = ToolStdioExitCode() + exit_code_lower.range_start = float("-inf") + exit_code_lower.range_end = -1 + _set_fatal(exit_code_lower) + exit_codes.append(exit_code_lower) + exit_code_high = ToolStdioExitCode() + exit_code_high.range_start = 1 + exit_code_high.range_end = float("inf") + _set_fatal(exit_code_high) + exit_codes.append(exit_code_high) + return exit_codes, [] + + +def aggressive_error_checks(): + exit_codes, _ = error_on_exit_code() + # these regexes are processed as case insensitive by default + regexes = [ + _oom_regex("MemoryError"), + _oom_regex("std::bad_alloc"), + _oom_regex("java.lang.OutOfMemoryError"), + _oom_regex("Out of memory"), + _error_regex("exception:"), + _error_regex("error:") + ] + return exit_codes, regexes + + +def _oom_regex(match): + regex = ToolStdioRegex() + _set_oom(regex) + regex.match = match + regex.stdout_match = True + regex.stderr_match = True + return regex + + +def _error_regex(match): + regex = ToolStdioRegex() + _set_fatal(regex) + regex.match = match + regex.stdout_match = True + regex.stderr_match = True + return regex + + +def _set_oom(obj): + obj.error_level = StdioErrorLevel.FATAL_OOM + + +def _set_fatal(obj): + obj.error_level = StdioErrorLevel.FATAL