From f89050c3dced88d5295971ab019e5c9a5706f6cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 14 Aug 2024 17:18:31 +0200 Subject: [PATCH] refactor: Handle both lists and dicts for members when loading JSON data in preparation of v1 Issue-310: https://github.com/mkdocstrings/griffe/issues/310 --- src/_griffe/encoders.py | 16 ++++++++++++++-- src/_griffe/models.py | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/_griffe/encoders.py b/src/_griffe/encoders.py index f82ce9b6..c56a42d1 100644 --- a/src/_griffe/encoders.py +++ b/src/_griffe/encoders.py @@ -177,7 +177,13 @@ def _attach_parent_to_exprs(obj: Class | Function | Attribute, parent: Module | def _load_module(obj_dict: dict[str, Any]) -> Module: module = Module(name=obj_dict["name"], filepath=Path(obj_dict["filepath"]), docstring=_load_docstring(obj_dict)) - for module_member in obj_dict.get("members", []): + # YORE: Bump 2: Replace line with `members = obj_dict.get("members", {}).values()`. + members = obj_dict.get("members", []) + # YORE: Bump 2: Remove block. + if isinstance(members, dict): + members = members.values() + + for module_member in members: module.set_member(module_member.name, module_member) _attach_parent_to_exprs(module_member, module) module.labels |= set(obj_dict.get("labels", ())) @@ -193,7 +199,13 @@ def _load_class(obj_dict: dict[str, Any]) -> Class: decorators=_load_decorators(obj_dict), bases=obj_dict["bases"], ) - for class_member in obj_dict.get("members", []): + # YORE: Bump 2: Replace line with `members = obj_dict.get("members", {}).values()`. + members = obj_dict.get("members", []) + # YORE: Bump 2: Remove block. + if isinstance(members, dict): + members = members.values() + + for class_member in members: class_.set_member(class_member.name, class_member) _attach_parent_to_exprs(class_member, class_) class_.labels |= set(obj_dict.get("labels", ())) diff --git a/src/_griffe/models.py b/src/_griffe/models.py index 0d124822..b721f067 100644 --- a/src/_griffe/models.py +++ b/src/_griffe/models.py @@ -861,9 +861,10 @@ def as_dict(self, *, full: bool = False, **kwargs: Any) -> dict[str, Any]: if self.docstring: base["docstring"] = self.docstring - # doing this last for a prettier JSON dump base["labels"] = self.labels + # YORE: Bump 1: Replace line with `base["members"] = {name: member.as_dict(full=full, **kwargs) for name, member in self.members.items()}`. base["members"] = [member.as_dict(full=full, **kwargs) for member in self.members.values()] + # Also replace array and items by object and additionalProperties in docs/schema.json line 163. return base