forked from s_ranjbar/city_retrofit
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
|