catalog_linter: use get_apps_repo
This commit is contained in:
parent
7b0e26fc5b
commit
cd1f9363d2
1 changed files with 34 additions and 28 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue