]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
json: make MkosiArgs and MkosiConfig JSON-dumpable
authorJoerg Behrmann <behrmann@physik.fu-berlin.de>
Fri, 15 Sep 2023 16:19:35 +0000 (18:19 +0200)
committerJoerg Behrmann <behrmann@physik.fu-berlin.de>
Wed, 4 Oct 2023 07:47:58 +0000 (09:47 +0200)
mkosi/config.py

index 2a3b516d9dbc50de3cce35696ec0dc0dc814025c..3b66df341e130065c9e5cd9cb4871a04aea9cad1 100644 (file)
@@ -10,6 +10,7 @@ import fnmatch
 import functools
 import graphlib
 import inspect
+import json
 import logging
 import math
 import operator
@@ -668,6 +669,8 @@ class MkosiArgs:
             if k in inspect.signature(cls).parameters
         })
 
+    def to_json(self, *, indent: Optional[int] = 4, sort_keys: bool = True) -> str:
+        return json.dumps(dataclasses.asdict(self), cls=MkosiJsonEncoder, indent=indent, sort_keys=sort_keys)
 
 @dataclasses.dataclass(frozen=True)
 class MkosiConfig:
@@ -877,6 +880,9 @@ class MkosiConfig:
             ]
         }
 
+    def to_json(self, *, indent: Optional[int] = 4, sort_keys: bool = True) -> str:
+        return json.dumps(dataclasses.asdict(self), cls=MkosiJsonEncoder, indent=indent, sort_keys=sort_keys)
+
 
 def parse_ini(path: Path, only_sections: Collection[str] = ()) -> Iterator[tuple[str, str, str]]:
     """
@@ -2617,3 +2623,14 @@ Clean Package Manager Metadata: {yes_no_auto(config.clean_package_metadata)}
 """
 
     return summary
+
+
+class MkosiJsonEncoder(json.JSONEncoder):
+    def default(self, obj: Any) -> Any:
+        if isinstance(obj, StrEnum):
+            return str(obj)
+        elif isinstance(obj, os.PathLike):
+            return os.fspath(obj)
+        elif isinstance(obj, uuid.UUID):
+            return str(obj)
+        return json.JSONEncoder.default(self, obj)