Source code for mac_maker.profile.spec_file.spec_file_validator

"""A provisioning spec file validator."""

import logging
import os
import pprint
from pathlib import Path
from typing import Any, List

from jsonschema.validators import validator_for
from mac_maker import config
from mac_maker.profile.spec_file.exceptions import SpecFileValidationError
from mac_maker.utilities.mixins.json_file import JSONFileReader


[docs]class SpecFileValidator(JSONFileReader): """Validator for spec file json content. :param spec_file_json_content: The spec file content to validate. """ class Messages: spec_invalid = 'SpecFileValidator: The loaded spec file is invalid!' schema_definition = ( Path(os.path.dirname(__file__)).parent.parent / "schemas" / "spec_file_v1.json" ) def __init__(self, spec_file_json_content: Any) -> None: self.log = logging.getLogger(config.LOGGER_NAME) self.schema = self.load_json_file(self.schema_definition) self.spec_file_json_content = spec_file_json_content
[docs] def validate(self) -> None: """Validate the loaded spec file. :raises: :class:`SpecFileValidationError` """ errors = self._validate_with_schema(self.schema) if errors: self.log.error(self.Messages.spec_invalid) formatted_errors = pprint.pformat(errors) raise SpecFileValidationError(formatted_errors)
def _validate_with_schema( self, schema: Any, ) -> List[str]: validator_class = validator_for(schema) validator = validator_class(schema) errors = [] for error in validator.iter_errors(self.spec_file_json_content): errors.append(error.message) return sorted(errors)