Source code for testing.output_validation.runner
"""Orchestration of integration-test output validation."""
from simtools.application.model_reader import create_model_reader_from_configuration
from simtools.testing.output_validation.artifacts import OutputArtifact
from simtools.testing.output_validation.registry import run_validator
[docs]
def versions_match(from_command_line, from_config_file):
"""Return whether configured output validations apply to model versions."""
if from_command_line is None:
return True
command_versions = (
from_command_line if isinstance(from_command_line, list) else [from_command_line]
)
config_versions = from_config_file if isinstance(from_config_file, list) else [from_config_file]
return bool(set(command_versions) & set(config_versions))
[docs]
def validate_application_output(
config, from_command_line=None, from_config_file=None, model_reader=None
):
"""Validate all explicitly declared output artifacts.
Parameters
----------
model_reader : object, optional
Reader to reuse for model-parameter validations.
"""
if not versions_match(from_command_line, from_config_file):
return
configuration = config.get("configuration")
if configuration is None:
return
active_versions = from_command_line or from_config_file
context = {
"configuration": configuration,
"model_reader": model_reader,
}
for integration_test in config.get("integration_tests", []):
for descriptor in integration_test.get("test_outputs", []):
_validate_descriptor(descriptor, configuration, active_versions, context)
def _validate_descriptor(descriptor, configuration, active_versions, context):
"""Validate one output descriptor when its model version applies."""
descriptor_versions = descriptor.get("model_versions")
if descriptor_versions and not versions_match(active_versions, descriptor_versions):
return
artifact = OutputArtifact.from_descriptor(configuration, descriptor)
artifact.assert_exists()
for rule in descriptor.get("validations", []):
_validate_rule(artifact, rule, configuration, context)
def _validate_rule(artifact, rule, configuration, context):
"""Run one validation rule, creating a shared model reader if needed."""
if rule["type"] == "model_parameter" and context["model_reader"] is None:
context["model_reader"] = _create_model_reader(configuration)
run_validator(artifact, rule, context)
def _create_model_reader(configuration):
"""Create a reader for model-parameter output validation."""
return create_model_reader_from_configuration(configuration)