Source code for data_model.format_checkers
"""Custom format checkers for jsonschema validation."""
import re
import astropy.units as u
import jsonschema
from simtools.utils import names
format_checker = jsonschema.FormatChecker()
[docs]
@format_checker.checks("astropy_unit")
def check_astropy_unit(unit_string):
"""Validate astropy units (including dimensionless) for jsonschema."""
try:
u.Unit(unit_string)
except (ValueError, TypeError) as exc:
if unit_string != "dimensionless":
raise ValueError(f"'{unit_string}' is not a valid Unit") from exc
return True
[docs]
@format_checker.checks("astropy_unit_of_time")
def check_astropy_unit_of_time(unit_string):
"""Validate astropy units that this is an astropy unit of time."""
u.Unit(unit_string).to("s")
return True
[docs]
@format_checker.checks("astropy_unit_of_length)")
def check_astropy_unit_of_length(unit_string):
"""Validate astropy units that this is an astropy unit of length."""
u.Unit(unit_string).to("m")
return True
[docs]
@format_checker.checks("array_element")
def check_array_element(element):
"""Validate array elements for jsonschema."""
names.validate_array_element_name(element)
return True
[docs]
@format_checker.checks("array_triggers_name")
def check_array_triggers_name(name):
"""Validate array trigger names for jsonschema."""
pattern = r"(.*)(?=_single_telescope|_array)"
if not re.match(pattern, name):
raise ValueError(f"Array trigger name '{name}' does not match pattern '{pattern}'")
names.validate_array_element_type(re.match(pattern, name).group(1))
return True