#!/usr/bin/python3 -i # # Copyright 2020-2023 The Khronos Group Inc. # # SPDX-License-Identifier: Apache-2.0 # Description: # ----------- # This script validates a json pipeline file against the schema files. import os,sys import re import argparse import json import jsonschema base_schema_filename = os.path.join("..", "json", "vk.json") vkpcc_schema_filename = os.path.join("..", "json", "vkpcc.json") # Parses input arguments def ParseArgs(): parser = argparse.ArgumentParser() parser.add_argument('json_file', help='The json file to validate') return parser.parse_args() def main(): args = ParseArgs() jsonText = "" baseSchemaText = "" vkSchemaText = "" # Exit with error if json or schema files do not exist if not os.path.exists(args.json_file): print('Error: json file \"%s\" does not exist.' % args.json_file) sys.exit(1) elif not os.path.exists(base_schema_filename): print('Error: json file \"%s\" does not exist.' % base_schema_filename) sys.exit(1) elif not os.path.exists(vkpcc_schema_filename): print('Error: json file \"%s\" does not exist.' % vkpcc_schema_filename) sys.exit(1) # Read the json schemas files in as text with open(base_schema_filename) as baseSchemaFile: baseSchemaText = baseSchemaFile.read() with open(vkpcc_schema_filename) as vkSchemaFile: vkSchemaText = vkSchemaFile.read() with open(args.json_file) as jsonFile: jsonText = jsonFile.read() baseSchema = json.loads(baseSchemaText) vkSchema = json.loads(vkSchemaText) jsonData = json.loads(jsonText) # Ensure that the generated vk.json schema is a valid schema try: jsonschema.Draft4Validator.check_schema(baseSchema) print(base_schema_filename, "is valid") except jsonschema.SchemaError as e: print(base_schema_filename, "error: " + str(e)) # Ensure that vkpcc.json is also a valid schema try: jsonschema.Draft4Validator.check_schema(vkSchema) print(vkpcc_schema_filename, "schema is valid") except jsonschema.exceptions.SchemaError as e: print(vkpcc_schema_filename, "schema error: " + str(e)) # Construct a schema validator object from the two schema files schemaRefStore = { baseSchema["id"] : baseSchema, vkSchema["id"] : vkSchema } resolver = jsonschema.RefResolver.from_schema(baseSchema, store=schemaRefStore) validator = jsonschema.Draft4Validator(vkSchema, resolver=resolver) # Validate the input .json file using the schemas for error in sorted(validator.iter_errors(jsonData), key=str): print(error.message) print(list(error.path)) for suberror in sorted(error.context, key=lambda e: e.schema_path): print(list(suberror.path), suberror.message, sep="\n") print("\n") if __name__ == '__main__': main()