]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
json: make MkosiConfig and MkosiArgs dumpable in composite structures
authorJoerg Behrmann <behrmann@physik.fu-berlin.de>
Fri, 20 Oct 2023 14:29:43 +0000 (16:29 +0200)
committerJoerg Behrmann <behrmann@physik.fu-berlin.de>
Fri, 20 Oct 2023 14:29:43 +0000 (16:29 +0200)
mkosi/config.py

index 4b06af7353b8de7c0c3397e1f261be721c5ddbda..87718fb1e09292a78383a96372709900dcd01ffe 100644 (file)
@@ -648,13 +648,15 @@ class MkosiArgs:
             if k in inspect.signature(cls).parameters
         })
 
-    def to_json(self, *, indent: Optional[int] = 4, sort_keys: bool = True) -> str:
-        """Dump MkosiArgs as JSON string."""
+    def to_dict(self) -> dict[str, Any]:
         def key_transformer(k: str) -> str:
             return "".join(p.capitalize() for p in k.split("_"))
 
-        d = {key_transformer(k): v for k, v in dataclasses.asdict(self).items()}
-        return json.dumps(d, cls=MkosiJsonEncoder, indent=indent, sort_keys=sort_keys)
+        return {key_transformer(k): v for k, v in dataclasses.asdict(self).items()}
+
+    def to_json(self, *, indent: Optional[int] = 4, sort_keys: bool = True) -> str:
+        """Dump MkosiArgs as JSON string."""
+        return json.dumps(self.to_dict(), cls=MkosiJsonEncoder, indent=indent, sort_keys=sort_keys)
 
     @classmethod
     def _load_json(cls, s: Union[str, dict[str, Any], SupportsRead[str], SupportsRead[bytes]]) -> dict[str, Any]:
@@ -915,15 +917,17 @@ class MkosiConfig:
             ]
         }
 
-    def to_json(self, *, indent: Optional[int] = 4, sort_keys: bool = True) -> str:
-        """Dump MkosiConfig as JSON string."""
+    def to_dict(self) -> dict[str, Any]:
         def key_transformer(k: str) -> str:
             if (s := SETTINGS_LOOKUP_BY_DEST.get(k)) is not None:
                 return s.name
             return "".join(p.capitalize() for p in k.split("_"))
 
-        d = {key_transformer(k): v for k, v in dataclasses.asdict(self).items()}
-        return json.dumps(d, cls=MkosiJsonEncoder, indent=indent, sort_keys=sort_keys)
+        return {key_transformer(k): v for k, v in dataclasses.asdict(self).items()}
+
+    def to_json(self, *, indent: Optional[int] = 4, sort_keys: bool = True) -> str:
+        """Dump MkosiConfig as JSON string."""
+        return json.dumps(self.to_dict(), cls=MkosiJsonEncoder, indent=indent, sort_keys=sort_keys)
 
     @classmethod
     def _load_json(cls, s: Union[str, dict[str, Any], SupportsRead[str], SupportsRead[bytes]]) -> dict[str, Any]:
@@ -2764,6 +2768,8 @@ class MkosiJsonEncoder(json.JSONEncoder):
             return os.fspath(obj)
         elif isinstance(obj, uuid.UUID):
             return str(obj)
+        elif isinstance(obj, (MkosiArgs, MkosiConfig)):
+            return obj.to_dict()
         return json.JSONEncoder.default(self, obj)