Skip to content

Commit a9ef9de

Browse files
committed
Pull in the implementation of recursiveRef.
1 parent 7371ba7 commit a9ef9de

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

referencing/_core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,4 +284,5 @@ def evolve(self, **kwargs):
284284
def dynamic_scope(self):
285285
for uri in self._previous:
286286
resource, _ = self._registry.resource_at(uri)
287-
yield resource, self._registry.anchors_at(uri)
287+
anchors = self._registry.anchors_at(uri)
288+
yield uri, resource, anchors

referencing/jsonschema.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
from __future__ import annotations
66

7+
from urllib.parse import urljoin
8+
79
from referencing._attrs import frozen
8-
from referencing._core import Anchor, IdentifiedResource
9-
from referencing.typing import Specification
10+
from referencing._core import Anchor, IdentifiedResource, Resolver
11+
from referencing.typing import Schema, Specification
1012

1113

1214
class Draft202012:
@@ -61,7 +63,7 @@ class DynamicAnchor:
6163

6264
def resolve(self, resolver, uri):
6365
last = self.resource
64-
for resource, anchors in resolver.dynamic_scope():
66+
for uri, resource, anchors in resolver.dynamic_scope():
6567
anchor = anchors.get(self.name)
6668
if isinstance(anchor, DynamicAnchor):
6769
last = anchor.resource
@@ -289,6 +291,21 @@ def subresources_of(self, resource):
289291
yield items
290292

291293

294+
def lookup_recursive_ref(
295+
resolver: Resolver,
296+
recursiveRef: str,
297+
) -> tuple[Schema, Resolver]:
298+
subschema, resolver = resolver.lookup(recursiveRef)
299+
if subschema.get("$recursiveAnchor"):
300+
for uri, _, _ in resolver.dynamic_scope():
301+
ref = urljoin(uri, recursiveRef)
302+
next_subschema, next_resolver = resolver.lookup(ref)
303+
if not next_subschema.get("$recursiveAnchor"):
304+
break
305+
subschema, resolver = next_subschema, next_resolver
306+
return subschema, resolver
307+
308+
292309
BY_ID: dict[str, Specification] = {
293310
"https://json-schema.org/draft/2020-12/schema": Draft202012(),
294311
"https://json-schema.org/draft/2019-09/schema": Draft201909(),

0 commit comments

Comments
 (0)