瀏覽代碼

JSON validation: Support various levels of strictness

Alexander Wilms 2 年之前
父節點
當前提交
2394612e28
共有 2 個文件被更改,包括 36 次插入6 次删除
  1. 35 5
      .github/validate_json.py
  2. 1 1
      .github/workflows/github.yml

+ 35 - 5
.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:")

+ 1 - 1
.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