1
0
Fork 0

catalog_linter: use get_apps_repo

This commit is contained in:
Félix Piédallu 2024-09-11 12:07:09 +02:00 committed by Salamandar
parent 7b0e26fc5b
commit cd1f9363d2

View file

@ -1,5 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import argparse
import json import json
import sys import sys
from pathlib import Path from pathlib import Path
@ -7,9 +8,9 @@ from difflib import SequenceMatcher
from typing import Any, Dict, Generator, List, Tuple from typing import Any, Dict, Generator, List, Tuple
import jsonschema import jsonschema
import appslib.get_apps_repo as get_apps_repo
from appslib.utils import ( from appslib.utils import (
REPO_APPS_ROOT, # pylint: disable=import-error get_antifeatures, # pylint: disable=import-error
get_antifeatures,
get_catalog, get_catalog,
get_categories, get_categories,
get_graveyard, get_graveyard,
@ -17,25 +18,24 @@ from appslib.utils import (
) )
def validate_schema(data: dict, schema_path: Path) -> Generator[str, None, None]: def validate_schema(data: dict, schema_path: Path) -> List[str]:
schema = json.load(schema_path.open("r", encoding="utf-8")) schema = json.load(schema_path.open("r", encoding="utf-8"))
validator = jsonschema.Draft202012Validator(schema) validator = jsonschema.Draft202012Validator(schema)
for error in validator.iter_errors(data): return [
yield f"at .{'.'.join(error.path)}: {error.message}" f"at .{'.'.join(error.path)}: {error.message}"
for error in validator.iter_errors(data)
]
def validate_schema_pretty(data: dict, name: str) -> bool: def validate_schema_pretty(apps_path: Path, data: dict, name: str) -> bool:
schema_path = REPO_APPS_ROOT / "schemas" / f"{name}.schema.json" schema_path = apps_path / "schemas" / f"{name}.toml.schema.json"
has_errors = False
schema_errors = list(validate_schema(data, schema_path)) schema_errors = list(validate_schema(data, schema_path))
if schema_errors: if schema_errors:
has_errors = True
print(f"Error while validating {name} against schema:") print(f"Error while validating {name} against schema:")
for error in schema_errors: for error in schema_errors:
print(f" - {error}") print(f" - {error}")
if schema_errors:
print() print()
return has_errors return bool(schema_errors)
def check_app( def check_app(
@ -90,29 +90,35 @@ def check_app(
yield f"unknown subtag {category} / {subtag}", False yield f"unknown subtag {category} / {subtag}", False
def check_all_apps() -> Generator[Tuple[str, List[Tuple[str, bool]]], None, None]: def check_all_apps() -> bool:
has_errors = False
for app, info in get_catalog().items(): for app, info in get_catalog().items():
errors = list(check_app(app, info)) errors = list(check_app(app, info))
if errors: if errors:
yield app, errors print(f"{app}:")
def main() -> None:
has_errors = False
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}:")
for error, is_fatal in errors: for error, is_fatal in errors:
if is_fatal: if is_fatal:
has_errors = True has_errors = True
level = "error" if is_fatal else "warning" level = "error" if is_fatal else "warning"
print(f" - {level}: {error}") print(f" - {level}: {error}")
return has_errors
def main() -> None:
parser = argparse.ArgumentParser()
get_apps_repo.add_args(parser)
args = parser.parse_args()
apps_path = get_apps_repo.from_args(args)
has_errors = False
has_errors |= validate_schema_pretty(apps_path, get_antifeatures(), "antifeatures")
has_errors |= validate_schema_pretty(apps_path, get_catalog(), "apps")
has_errors |= validate_schema_pretty(apps_path, get_categories(), "categories")
has_errors |= validate_schema_pretty(apps_path, get_graveyard(), "graveyard")
has_errors |= validate_schema_pretty(apps_path, get_wishlist(), "wishlist")
has_errors |= check_all_apps()
sys.exit(has_errors) sys.exit(has_errors)