diff --git a/referencing/jsonschema.py b/referencing/jsonschema.py index 93e77a7..2336212 100644 --- a/referencing/jsonschema.py +++ b/referencing/jsonschema.py @@ -613,6 +613,13 @@ def resolve(self, resolver: _Resolver[Schema]) -> _Resolved[Schema]: continue if isinstance(anchor, DynamicAnchor): last = anchor.resource + try: + anchor = resolver._registry.anchor("", self.name).value + except (exceptions.NoSuchAnchor, exceptions.NoSuchResource): + pass + else: + if isinstance(anchor, DynamicAnchor): + last = anchor.resource return _Resolved( contents=last.contents, resolver=resolver.in_subresource(last), diff --git a/referencing/tests/test_jsonschema.py b/referencing/tests/test_jsonschema.py index c80714d..67f9949 100644 --- a/referencing/tests/test_jsonschema.py +++ b/referencing/tests/test_jsonschema.py @@ -272,6 +272,44 @@ def test_multiple_lookup_dynamic_ref_to_nondynamic_ref(): assert fourth.contents == two.contents +def test_dynamic_ref_with_anonymous_root_schema(): + template = referencing.jsonschema.DRAFT202012.create_resource( + { + "$id": "https://example.com/PaginatedTemplate", + "$defs": { + "itemType": {"$dynamicAnchor": "itemType", "not": {}}, + }, + "type": "object", + "required": ["items"], + "properties": { + "items": { + "type": "array", + "items": {"$dynamicRef": "#itemType"}, + }, + }, + }, + ) + anonymous = referencing.jsonschema.DRAFT202012.create_resource( + { + "$defs": { + "itemType": {"$dynamicAnchor": "itemType", "type": "string"}, + }, + "$ref": "https://example.com/PaginatedTemplate", + }, + ) + registry = Registry().with_resource( + "https://example.com/PaginatedTemplate", + template, + ) + resolver = registry.resolver_with_root(anonymous) + resolved = resolver.lookup("https://example.com/PaginatedTemplate") + item_type = resolved.resolver.lookup("#itemType") + assert item_type.contents == { + "$dynamicAnchor": "itemType", + "type": "string", + } + + def test_lookup_trivial_recursive_ref(): one = referencing.jsonschema.DRAFT201909.create_resource( {"$recursiveAnchor": True},