From 88aa6490c53926b0d9f4c7d4d676b1a440b75148 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= <felix.piedallu@non.se.com>
Date: Wed, 13 Mar 2024 11:34:07 +0100
Subject: [PATCH] In catalog_linter, lint all toml files (graveyard wishlist
 etc). This is actually done in CI.

---
 catalog_linter.py | 42 +++++++++++++++++++++++++-----------------
 1 file changed, 25 insertions(+), 17 deletions(-)

diff --git a/catalog_linter.py b/catalog_linter.py
index 261a030..b4438f9 100755
--- a/catalog_linter.py
+++ b/catalog_linter.py
@@ -2,6 +2,7 @@
 
 import json
 import sys
+from pathlib import Path
 from difflib import SequenceMatcher
 from typing import Any, Dict, Generator, List, Tuple
 
@@ -16,16 +17,27 @@ from appslib.utils import (
 )
 
 
-def validate_schema() -> Generator[str, None, None]:
-    with open(
-        REPO_APPS_ROOT / "schemas" / "apps.toml.schema.json", encoding="utf-8"
-    ) as file:
-        apps_catalog_schema = json.load(file)
-    validator = jsonschema.Draft202012Validator(apps_catalog_schema)
-    for error in validator.iter_errors(get_catalog()):
+def validate_schema(data: dict, schema_path: Path) -> Generator[str, None, None]:
+    schema = json.load(schema_path.open("r", encoding="utf-8"))
+    validator = jsonschema.Draft202012Validator(schema)
+    for error in validator.iter_errors(data):
         yield f"at .{'.'.join(error.path)}: {error.message}"
 
 
+def validate_schema_pretty(data: dict, name: str) -> bool:
+    schema_path = REPO_APPS_ROOT / "schemas" / f"{name}.schema.json"
+    has_errors = False
+    schema_errors = list(validate_schema(data, schema_path))
+    if schema_errors:
+        has_errors = True
+        print(f"Error while validating {name} against schema:")
+    for error in schema_errors:
+        print(f"  - {error}")
+    if schema_errors:
+        print()
+    return has_errors
+
+
 def check_app(
     app: str, infos: Dict[str, Any]
 ) -> Generator[Tuple[str, bool], None, None]:
@@ -88,14 +100,11 @@ def check_all_apps() -> Generator[Tuple[str, List[Tuple[str, bool]]], None, None
 def main() -> None:
     has_errors = False
 
-    schema_errors = list(validate_schema())
-    if schema_errors:
-        has_errors = True
-        print("Error while validating catalog against schema:")
-    for error in schema_errors:
-        print(f"  - {error}")
-    if schema_errors:
-        print()
+    has_errors |= validate_schema_pretty(get_antifeatures(), "antifeatures.toml")
+    has_errors |= validate_schema_pretty(get_catalog(), "apps.toml")
+    has_errors |= validate_schema_pretty(get_categories(), "categories.toml")
+    has_errors |= validate_schema_pretty(get_graveyard(), "graveyard.toml")
+    has_errors |= validate_schema_pretty(get_wishlist(), "wishlist.toml")
 
     for app, errors in check_all_apps():
         print(f"{app}:")
@@ -105,8 +114,7 @@ def main() -> None:
             level = "error" if is_fatal else "warning"
             print(f"  - {level}: {error}")
 
-    if has_errors:
-        sys.exit(1)
+    sys.exit(has_errors)
 
 
 if __name__ == "__main__":