1
0
Fork 0

appstore: add fuzzy-matching check between catalog and wishlist

This commit is contained in:
Alexandre Aubin 2023-09-25 15:41:07 +02:00
parent 14d690324d
commit 04782b12a6

View file

@ -5,6 +5,7 @@ import sys
from functools import cache from functools import cache
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Generator, List, Tuple from typing import Any, Dict, Generator, List, Tuple
from difflib import SequenceMatcher
import jsonschema import jsonschema
import toml import toml
@ -30,6 +31,12 @@ def get_antifeatures() -> Dict[str, Any]:
return toml.load(antifeatures_path) return toml.load(antifeatures_path)
@cache
def get_wishlist() -> Dict[str, Dict[str, str]]:
wishlist_path = APPS_ROOT / "wishlist.toml"
return toml.load(wishlist_path)
def validate_schema() -> Generator[str, None, None]: def validate_schema() -> Generator[str, None, None]:
with open(APPS_ROOT / "schemas" / "apps.toml.schema.json", encoding="utf-8") as file: with open(APPS_ROOT / "schemas" / "apps.toml.schema.json", encoding="utf-8") as file:
apps_catalog_schema = json.load(file) apps_catalog_schema = json.load(file)
@ -46,6 +53,19 @@ def check_app(app: str, infos: Dict[str, Any]) -> Generator[Tuple[str, bool], No
if infos["state"] != "working": if infos["state"] != "working":
return return
# validate that the app is not (anymore?) in the wishlist
# we use fuzzy matching because the id in catalog may not be the same exact id as in the wishlist
# some entries are ignore-hard-coded, because e.g. radarr an readarr are really different apps...
ignored_wishlist_entries = ["readarr"]
wishlist_matches = [
wish
for wish in get_wishlist()
if wish not in ignored_wishlist_entries
and SequenceMatcher(None, app, wish).ratio() > 0.9
]
if wishlist_matches:
yield f"app seems to be listed in wishlist: {wishlist_matches}", True
repo_name = infos.get("url", "").split("/")[-1] repo_name = infos.get("url", "").split("/")[-1]
if repo_name != f"{app}_ynh": if repo_name != f"{app}_ynh":
yield f"repo name should be {app}_ynh, not in {repo_name}", True yield f"repo name should be {app}_ynh, not in {repo_name}", True