46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
"""
|
|
schemas.py
|
|
-------------
|
|
|
|
Tools for dealing with schemas, particularly JSONschema
|
|
"""
|
|
import json
|
|
|
|
from .util import decode_text
|
|
|
|
|
|
def resolve(item, resolver):
|
|
"""
|
|
Given a JSON Schema containing `$ref` keys recursively
|
|
evaluate to find and replace referenced files with their
|
|
actual values using trimesh.resolvers.Resolver objects.
|
|
|
|
Parameters
|
|
---------------
|
|
item : any
|
|
JSON schema including `$ref` to other files
|
|
resolver : trimesh.visual.resolver.Resolver
|
|
Resolver to fetch referenced assets
|
|
|
|
Returns
|
|
----------
|
|
result : any
|
|
JSONSchema with references replaced
|
|
"""
|
|
if isinstance(item, list):
|
|
# run the resolver on every list item
|
|
return [resolve(i, resolver) for i in item]
|
|
elif isinstance(item, dict):
|
|
if '$ref' in item:
|
|
# if we have a reference to a file pop the key
|
|
# and update the dict with the reference in-place
|
|
raw = decode_text(resolver.get(item.pop('$ref')))
|
|
item.update(json.loads(raw))
|
|
# run the resolver on the dict again
|
|
resolve(item, resolver)
|
|
else:
|
|
# make sure all keys are evaluated
|
|
for i in item.values():
|
|
resolve(i, resolver)
|
|
return item
|