@@ -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