diff --git a/openeo/rest/models/logs.py b/openeo/rest/models/logs.py index 25a43d263..aedddd0bc 100644 --- a/openeo/rest/models/logs.py +++ b/openeo/rest/models/logs.py @@ -22,6 +22,7 @@ class LogEntry(dict): between None and non-existing. None for example refers to no-data in many cases while the absence of the property means that the user did not provide any data for debugging. + - ``stacktrace``: Stacktrace for the error, string, optional, available since API 1.3.0 """ _required = {"id", "level", "message"} @@ -49,6 +50,11 @@ def message(self): def level(self): return self["level"] + @property + def stacktrace(self) -> Union[str, None]: + """Stacktrace for the error, available since API 1.3.0. Returns None if not present.""" + return self.get("stacktrace", None) + # TODO: add properties for "code", "time", "path", "links" and "data" with sensible defaults? diff --git a/tests/rest/models/test_logs.py b/tests/rest/models/test_logs.py index 48312d38a..0bc346f66 100644 --- a/tests/rest/models/test_logs.py +++ b/tests/rest/models/test_logs.py @@ -36,6 +36,22 @@ def test_log_entry_legacy(): assert log.log_id == "log01" +def test_log_entry_stacktrace_missing(): + log = LogEntry(id="log01", level="error", message="oops") + assert log.stacktrace is None + + +def test_log_entry_stacktrace_present(): + log = LogEntry( + id="log01", + level="error", + message="oops", + stacktrace="line 1\nline 2\nline 3", + ) + assert log.stacktrace == "line 1\nline 2\nline 3" + assert log["stacktrace"] == "line 1\nline 2\nline 3" + + @pytest.mark.parametrize( ["log_level_in", "expected_log_level"], [