123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- import json
- from jsonschema import Draft7Validator
- from json_source_map import calculate
- from json_source_map.errors import InvalidInputError
- import os
- import sys
- errors = []
- def main():
- if len(sys.argv) < 2:
- print("JSON path required.")
- return 1
- for filename in sys.argv[1:]:
- prep(filename)
- try:
- with open('validation_errors.json', 'w') as outfile:
- json.dump(errors, outfile)
- except OSError as e:
- print(f'Failed to write validation output to file: {e}')
- return 1
- if errors:
- return 1
- return 0
- def prep(filename):
- try:
- with open(filename) as json_file:
- json_string = json_file.read()
- json_data = json.loads(json_string)
- except OSError as e:
- print(f'Failed to load file "{filename}": {e}')
- return
- schema_filename = json_data.get('$schema')
- if not schema_filename:
- print('File has no schema:', filename)
- return
- file_path = os.path.split(filename)[0]
- schema_file = os.path.join(file_path, schema_filename)
- try:
- with open(schema_file) as json_file:
- schema = json.load(json_file)
- except OSError as e:
- print(f'Failed to load schema file "{schema_file}": {e}')
- return
- validate(filename, json_data, json_string, schema)
- def validate(filename, json_data, json_string, schema):
- try:
- servicesPaths = calculate(json_string)
- except InvalidInputError as e:
- print("Error with file:", e)
- return
- cls = Draft7Validator(schema)
- for e in sorted(cls.iter_errors(json_data), key=str):
- print(f'{e}\nIn "{filename}"\n\n')
- errorPath = '/'.join(str(v) for v in e.absolute_path)
- errorEntry = servicesPaths['/' + errorPath]
- errors.append({
- "file": filename,
- "start_line": errorEntry.value_start.line + 1,
- "end_line": errorEntry.value_end.line + 1,
- "title": "Validation Error",
- "message": e.message,
- "annotation_level": "failure"
- })
- if __name__ == '__main__':
- sys.exit(main())
|