1e5c31af7Sopenharmony_ci#!/usr/bin/python3 -i 2e5c31af7Sopenharmony_ci# 3e5c31af7Sopenharmony_ci# Copyright 2020-2024 The Khronos Group Inc. 4e5c31af7Sopenharmony_ci# 5e5c31af7Sopenharmony_ci# SPDX-License-Identifier: Apache-2.0 6e5c31af7Sopenharmony_ci 7e5c31af7Sopenharmony_ci# Description: 8e5c31af7Sopenharmony_ci# ----------- 9e5c31af7Sopenharmony_ci# This script validates a json pipeline file against the schema files. 10e5c31af7Sopenharmony_ci 11e5c31af7Sopenharmony_ciimport os,sys 12e5c31af7Sopenharmony_ciimport re 13e5c31af7Sopenharmony_ciimport argparse 14e5c31af7Sopenharmony_ciimport json 15e5c31af7Sopenharmony_ciimport jsonschema 16e5c31af7Sopenharmony_ci 17e5c31af7Sopenharmony_cibase_schema_filename = os.path.join("..", "json", "vk.json") 18e5c31af7Sopenharmony_civkpcc_schema_filename = os.path.join("..", "json", "vkpcc.json") 19e5c31af7Sopenharmony_ci 20e5c31af7Sopenharmony_ci# Parses input arguments 21e5c31af7Sopenharmony_cidef ParseArgs(): 22e5c31af7Sopenharmony_ci parser = argparse.ArgumentParser() 23e5c31af7Sopenharmony_ci parser.add_argument('json_file', help='The json file to validate') 24e5c31af7Sopenharmony_ci return parser.parse_args() 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_cidef main(): 27e5c31af7Sopenharmony_ci args = ParseArgs() 28e5c31af7Sopenharmony_ci jsonText = "" 29e5c31af7Sopenharmony_ci baseSchemaText = "" 30e5c31af7Sopenharmony_ci vkSchemaText = "" 31e5c31af7Sopenharmony_ci 32e5c31af7Sopenharmony_ci # Exit with error if json or schema files do not exist 33e5c31af7Sopenharmony_ci if not os.path.exists(args.json_file): 34e5c31af7Sopenharmony_ci print('Error: json file \"%s\" does not exist.' % args.json_file) 35e5c31af7Sopenharmony_ci sys.exit(1) 36e5c31af7Sopenharmony_ci elif not os.path.exists(base_schema_filename): 37e5c31af7Sopenharmony_ci print('Error: json file \"%s\" does not exist.' % base_schema_filename) 38e5c31af7Sopenharmony_ci sys.exit(1) 39e5c31af7Sopenharmony_ci elif not os.path.exists(vkpcc_schema_filename): 40e5c31af7Sopenharmony_ci print('Error: json file \"%s\" does not exist.' % vkpcc_schema_filename) 41e5c31af7Sopenharmony_ci sys.exit(1) 42e5c31af7Sopenharmony_ci 43e5c31af7Sopenharmony_ci # Read the json schemas files in as text 44e5c31af7Sopenharmony_ci with open(base_schema_filename) as baseSchemaFile: 45e5c31af7Sopenharmony_ci baseSchemaText = baseSchemaFile.read() 46e5c31af7Sopenharmony_ci with open(vkpcc_schema_filename) as vkSchemaFile: 47e5c31af7Sopenharmony_ci vkSchemaText = vkSchemaFile.read() 48e5c31af7Sopenharmony_ci with open(args.json_file) as jsonFile: 49e5c31af7Sopenharmony_ci jsonText = jsonFile.read() 50e5c31af7Sopenharmony_ci baseSchema = json.loads(baseSchemaText) 51e5c31af7Sopenharmony_ci vkSchema = json.loads(vkSchemaText) 52e5c31af7Sopenharmony_ci jsonData = json.loads(jsonText) 53e5c31af7Sopenharmony_ci 54e5c31af7Sopenharmony_ci # Ensure that the generated vk.json schema is a valid schema 55e5c31af7Sopenharmony_ci try: 56e5c31af7Sopenharmony_ci jsonschema.Draft4Validator.check_schema(baseSchema) 57e5c31af7Sopenharmony_ci print(base_schema_filename, "is valid") 58e5c31af7Sopenharmony_ci except jsonschema.SchemaError as e: 59e5c31af7Sopenharmony_ci print(base_schema_filename, "error: " + str(e)) 60e5c31af7Sopenharmony_ci 61e5c31af7Sopenharmony_ci # Ensure that vkpcc.json is also a valid schema 62e5c31af7Sopenharmony_ci try: 63e5c31af7Sopenharmony_ci jsonschema.Draft4Validator.check_schema(vkSchema) 64e5c31af7Sopenharmony_ci print(vkpcc_schema_filename, "schema is valid") 65e5c31af7Sopenharmony_ci except jsonschema.exceptions.SchemaError as e: 66e5c31af7Sopenharmony_ci print(vkpcc_schema_filename, "schema error: " + str(e)) 67e5c31af7Sopenharmony_ci 68e5c31af7Sopenharmony_ci # Construct a schema validator object from the two schema files 69e5c31af7Sopenharmony_ci schemaRefStore = { 70e5c31af7Sopenharmony_ci baseSchema["id"] : baseSchema, 71e5c31af7Sopenharmony_ci vkSchema["id"] : vkSchema 72e5c31af7Sopenharmony_ci } 73e5c31af7Sopenharmony_ci resolver = jsonschema.RefResolver.from_schema(baseSchema, store=schemaRefStore) 74e5c31af7Sopenharmony_ci validator = jsonschema.Draft4Validator(vkSchema, resolver=resolver) 75e5c31af7Sopenharmony_ci 76e5c31af7Sopenharmony_ci # Validate the input .json file using the schemas 77e5c31af7Sopenharmony_ci for error in sorted(validator.iter_errors(jsonData), key=str): 78e5c31af7Sopenharmony_ci print(error.message) 79e5c31af7Sopenharmony_ci print(list(error.path)) 80e5c31af7Sopenharmony_ci for suberror in sorted(error.context, key=lambda e: e.schema_path): 81e5c31af7Sopenharmony_ci print(list(suberror.path), suberror.message, sep="\n") 82e5c31af7Sopenharmony_ci print("\n") 83e5c31af7Sopenharmony_ci 84e5c31af7Sopenharmony_ciif __name__ == '__main__': 85e5c31af7Sopenharmony_ci main() 86