From 614315d3d88ecaa609e4f7da8a54477b4c243269 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 5 Feb 2025 15:45:39 -0500 Subject: [PATCH] fix: Handle references of objects containing references --- tools/schemacode/src/bidsschematools/schema.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tools/schemacode/src/bidsschematools/schema.py b/tools/schemacode/src/bidsschematools/schema.py index 34b0421d46..a95b2696f4 100644 --- a/tools/schemacode/src/bidsschematools/schema.py +++ b/tools/schemacode/src/bidsschematools/schema.py @@ -90,13 +90,18 @@ def _find(obj, predicate): yield from _find(item, predicate) -# Recursive dereference that maintains a top-level schema -def _dereference(namespace, schema): +def _dereference(namespace, base_schema): + # In-place, recursively dereference objects + # This allows a referenced object to itself contain a reference + # A dependency graph could be constructed, but would likely be slower + # to build than to duplicate a couple dereferences for struct in _find(namespace, lambda obj: "$ref" in obj): - target = schema.get(struct["$ref"]) + target = base_schema.get(struct["$ref"]) + if target is None: + raise ValueError(f"Reference {struct['$ref']} not found in schema.") if isinstance(target, Mapping): struct.pop("$ref") - _dereference(target, schema) + _dereference(target, base_schema) struct.update({**target, **struct})