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