Source code for pyhf.schema.loader

from pathlib import Path
import sys
import json
import pyhf.exceptions
from pyhf.schema import variables

# importlib.resources.as_file wasn't added until Python 3.9
# c.f. https://docs.python.org/3.9/library/importlib.html#importlib.resources.as_file
if sys.version_info >= (3, 9):
    from importlib import resources
else:
    import importlib_resources as resources


[docs] def load_schema(schema_id: str): """ Get a schema by relative path from cache, or load it into the cache and return. Args: schema_id (str): Relative path to schema from :attr:`pyhf.schema.path` Example: >>> import pyhf >>> schema = pyhf.schema.load_schema("1.0.0/defs.json") >>> type(schema) <class 'dict'> >>> schema.keys() dict_keys(['$schema', '$id', 'definitions']) >>> pyhf.schema.load_schema("0.0.0/defs.json") # doctest: +ELLIPSIS Traceback (most recent call last): ... pyhf.exceptions.SchemaNotFound: ... Returns: schema (dict): The loaded schema. Raises: ~pyhf.exceptions.SchemaNotFound: if the provided ``schema_id`` cannot be found. """ try: return variables.SCHEMA_CACHE[ f'{Path(variables.SCHEMA_BASE).joinpath(schema_id)}' ] except KeyError: pass ref = variables.schemas.joinpath(schema_id) with resources.as_file(ref) as path: if not path.exists(): raise pyhf.exceptions.SchemaNotFound( f'The schema {schema_id} was not found. Do you have the right version or the right path? {path}' ) with path.open(encoding="utf-8") as json_schema: schema = json.load(json_schema) variables.SCHEMA_CACHE[schema['$id']] = schema return variables.SCHEMA_CACHE[schema['$id']]
# pre-populate the cache to avoid network access # on first validation in standard usage # (not in pyhf.schema.variables to avoid circular imports) load_schema(f'{variables.SCHEMA_VERSION}/defs.json')