Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.tool_util.parser.stdio
[docs]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',
}
[docs] @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
[docs]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.
"""
[docs] 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", "")
[docs] 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,
}
[docs]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".
"""
[docs] 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", "")
[docs] 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,
}
[docs]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, []
[docs]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