Skip to content

Commit d4d368a

Browse files
committed
some broken code
1 parent 0e7c50c commit d4d368a

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

asdf/_tests/test_schema.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,11 @@ def test_self_reference_resolution(test_data_path):
814814
assert s["anyOf"][1] == s["anyOf"][0]
815815

816816

817+
def test_resolve_references():
818+
s = schema.load_schema("http://stsci.edu/schemas/asdf/core/ndarray-1.0.0", resolve_references=True)
819+
assert "$ref" not in repr(s)
820+
821+
817822
def test_schema_resolved_via_entry_points():
818823
"""Test that entry points mappings to core schema works"""
819824
tag = "tag:stsci.edu:asdf/fits/fits-1.0.0"

asdf/schema.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,28 @@ def _load_schema_cached(url, resolve_references):
432432
schema, url = loader(url)
433433

434434
if resolve_references:
435+
# resolve all "$ref" in tree
436+
# this can result in recursive references so some record of looked-up schemas is required
437+
# however local references can also be recursive so we need to not use walk_and_modify
438+
loaded_schemas = {
439+
url: schema
440+
}
441+
442+
for node in iter_tree(schema):
443+
# FIXME broken code
444+
if isinstance(node, dict) and "$ref" in node:
445+
# poop, we need to modify the parent here right? essentially getting rid of
446+
# node but that doesn't work here as part of iter_tree
447+
# what's actually going on here, why do we need _safe_resolve?
448+
suburl_base, suburl_fragment = _safe_resolve(url, node["$ref"])
449+
if suburl_base == url or suburl_base == schema.get("id"):
450+
# local ref
451+
return reference.resolve_fragment(schema, suburl_fragment)
452+
else:
453+
# other schema... but if that schema references this one, all is lost
454+
# maybe that's already a mess?
455+
subschema = load_schema(suburl_base, True)
456+
return reference.resolve_fragment(subschema, suburl_fragment)
435457

436458
def resolve_refs(node, json_id):
437459
if json_id is None:
@@ -442,11 +464,10 @@ def resolve_refs(node, json_id):
442464

443465
if suburl_base == url or suburl_base == schema.get("id"):
444466
# This is a local ref, which we'll resolve in both cases.
445-
subschema = schema
467+
return treeutil.walk_and_modify(reference.resolve_fragment(schema, suburl_fragment), resolve_refs)
446468
else:
447469
subschema = load_schema(suburl_base, True)
448-
449-
return reference.resolve_fragment(subschema, suburl_fragment)
470+
return reference.resolve_fragment(subschema, suburl_fragment)
450471

451472
return node
452473

0 commit comments

Comments
 (0)