From 2394612e284f1924fafd43187fc255b6d06e3be0 Mon Sep 17 00:00:00 2001 From: Alexander Wilms Date: Fri, 15 Sep 2023 23:31:43 +0000 Subject: [PATCH] JSON validation: Support various levels of strictness --- .github/validate_json.py | 40 +++++++++++++++++++++++++++++++----- .github/workflows/github.yml | 2 +- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/.github/validate_json.py b/.github/validate_json.py index 0c95557bc..8152c838f 100644 --- a/.github/validate_json.py +++ b/.github/validate_json.py @@ -1,6 +1,15 @@ import jstyleson from pathlib import Path from pprint import pprint +import yaml +import json5 +import re + +# 'json', 'json5' or 'yaml' +# json: strict, but doesn't preserve line numbers necessarily, since it strips comments before parsing +# json5: strict and preserves line numbers even for files will with line comments +# yaml: less strict, allows e.g. leading zeros +VALIDATION_TYPE = 'json5' errors = [] for path in sorted(Path('.').glob('**/*.json')): @@ -8,16 +17,37 @@ for path in sorted(Path('.').glob('**/*.json')): path_str = str(path) try: with open(path_str, 'r') as file: - jstyleson.load(file) + if VALIDATION_TYPE == 'json': + jstyleson.load(file) + if VALIDATION_TYPE == 'json5': + + json5.load(file) + elif VALIDATION_TYPE == 'yaml': + + file = file.read().replace("\t", " ") + file = file.replace("//", "#") + yaml.safe_load(file) print(f"Validation of {path_str} succeeded") except Exception as exc: print(f"Validation of {path_str} failed") pprint(exc) - # https://stackoverflow.com/a/72850269/2278742 + + error_pos = path_str + if hasattr(exc, 'pos'): - position_msg = f"{path_str}:{exc.lineno}:{exc.colno}" - print(position_msg) - errors.append({"position": position_msg, "exception": exc}) + # https://stackoverflow.com/a/72850269/2278742 + error_pos = f"{path_str}:{exc.lineno}:{exc.colno}" + print(error_pos) + # error_msg = "position": position_msg, "exception": exc + if hasattr(exc, 'problem_mark'): + mark = exc.problem_mark + error_pos = f"{path_str}:{mark.line+1}:{mark.column+1}" + print(error_pos) + if VALIDATION_TYPE == 'json5': + pos = re.findall(r'\d+', str(exc)) + error_pos = f"{path_str}:{pos[0]}:{pos[-1]}" + + errors.append({"error_pos": error_pos, "error_msg": exc}) if errors: print("Summary of errors:") diff --git a/.github/workflows/github.yml b/.github/workflows/github.yml index 321e715c8..03bb4c0a1 100644 --- a/.github/workflows/github.yml +++ b/.github/workflows/github.yml @@ -147,7 +147,7 @@ jobs: - name: Validate JSON run: | - pip install jstyleson + pip3 install json5 jstyleson python3 .github/validate_json.py - name: Dependencies