Source code for aiidalab.registry.yaml
from pathlib import Path
from urllib.parse import urlsplit
import cachecontrol
import jsonref
import requests
from ruamel.yaml import YAML
REQUESTS = cachecontrol.CacheControl(requests.Session())
class JsonYamlLoader(jsonref.JsonLoader):
safe_yaml = YAML(typ="safe")
def __call__(self, uri, **kwargs):
uri_split = urlsplit(uri)
if Path(uri_split.path).suffix in (".yml", ".yaml"):
if uri_split.scheme == "file":
content = Path(uri_split.path).read_bytes()
else:
response = REQUESTS.get(uri)
response.raise_for_status()
content = response.content
return self.safe_yaml.load(content)
else:
return super().__call__(uri, **kwargs)
json_yaml_loader = JsonYamlLoader()
[docs]def replace_refs(obj):
"""Dereference all references in obj.
References may point to JSON or YAML files.
"""
return jsonref.JsonRef.replace_refs(obj, loader=json_yaml_loader)
[docs]def loads(s):
"""Deserialize YAML string to a Python object and dereference all references."""
return replace_refs(YAML(typ="safe").load(s))
[docs]def load(path):
"""Deserialize YAML file at path to a Python object and dereference all references."""
return loads(Path(path).read_text())
__all__ = [
"load",
"loads",
"replace_refs",
]