Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/galaxy/tool_util/parser/stdio.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/galaxy/tool_util/parser/stdio.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,141 @@ +class StdioErrorLevel: + """ + 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: + """ + 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: + """ + 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