diff --git a/osbuild/monitor.py b/osbuild/monitor.py index 274de87a..f3ce077b 100644 --- a/osbuild/monitor.py +++ b/osbuild/monitor.py @@ -21,6 +21,16 @@ import osbuild from osbuild.util.term import fmt as vt +def omitempty(d: dict): + """ Omit None and empty string ("") values from the given dict """ + for k, v in list(d.items()): + if v is None or v == "": + del d[k] + elif isinstance(v, dict): + omitempty(v) + return d + + class Context: """Context for a single log line. Automatically calculates hash/id when read.""" @@ -157,13 +167,13 @@ class LogLine: self.progress = progress def as_dict(self): - return { + return omitempty({ "message": self.message, "error": self.error, "context": self.context.as_dict(), "progress": self.progress.as_dict(), "timestamp": time.time(), - } + }) class TextWriter: diff --git a/test/mod/test_monitor.py b/test/mod/test_monitor.py index d70bc44a..5880a2a9 100644 --- a/test/mod/test_monitor.py +++ b/test/mod/test_monitor.py @@ -223,7 +223,8 @@ def test_json_progress_monitor(): assert logitem["message"] == "pipeline 1 message 1" assert logitem["context"]["origin"] == "org.osbuild" assert logitem["context"]["pipeline"]["name"] == "test-pipeline-first" - assert logitem["context"]["pipeline"]["stage"]["name"] is None + # empty items are omited + assert "name" not in logitem["context"]["pipeline"]["stage"] logitem = json.loads(log[3]) assert logitem["message"] == "pipeline 1 message 2"