Spaces:
Runtime error
Runtime error
from __future__ import annotations | |
from copy import deepcopy | |
from typing import Any, List, Optional, Sequence | |
def _retrieve_ref(path: str, schema: dict) -> dict: | |
components = path.split("/") | |
if components[0] != "#": | |
raise ValueError( | |
"ref paths are expected to be URI fragments, meaning they should start " | |
"with #." | |
) | |
out = schema | |
for component in components[1:]: | |
out = out[component] | |
return deepcopy(out) | |
def _dereference_refs_helper( | |
obj: Any, full_schema: dict, skip_keys: Sequence[str] | |
) -> Any: | |
if isinstance(obj, dict): | |
obj_out = {} | |
for k, v in obj.items(): | |
if k in skip_keys: | |
obj_out[k] = v | |
elif k == "$ref": | |
ref = _retrieve_ref(v, full_schema) | |
return _dereference_refs_helper(ref, full_schema, skip_keys) | |
elif isinstance(v, (list, dict)): | |
obj_out[k] = _dereference_refs_helper(v, full_schema, skip_keys) | |
else: | |
obj_out[k] = v | |
return obj_out | |
elif isinstance(obj, list): | |
return [_dereference_refs_helper(el, full_schema, skip_keys) for el in obj] | |
else: | |
return obj | |
def _infer_skip_keys(obj: Any, full_schema: dict) -> List[str]: | |
keys = [] | |
if isinstance(obj, dict): | |
for k, v in obj.items(): | |
if k == "$ref": | |
ref = _retrieve_ref(v, full_schema) | |
keys.append(v.split("/")[1]) | |
keys += _infer_skip_keys(ref, full_schema) | |
elif isinstance(v, (list, dict)): | |
keys += _infer_skip_keys(v, full_schema) | |
elif isinstance(obj, list): | |
for el in obj: | |
keys += _infer_skip_keys(el, full_schema) | |
return keys | |
def dereference_refs( | |
schema_obj: dict, | |
*, | |
full_schema: Optional[dict] = None, | |
skip_keys: Optional[Sequence[str]] = None, | |
) -> dict: | |
"""Try to substitute $refs in JSON Schema.""" | |
full_schema = full_schema or schema_obj | |
skip_keys = ( | |
skip_keys | |
if skip_keys is not None | |
else _infer_skip_keys(schema_obj, full_schema) | |
) | |
return _dereference_refs_helper(schema_obj, full_schema, skip_keys) | |