diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3c3e65ff..af809144 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,6 +16,3 @@ jobs: - name: Check apps.json run: | python -m json.tool apps.json - - name: Check locales - run: | - for i in ./locales/*.json; do python -m json.tool $i || return 1; done diff --git a/tools/README-generator/make_readme.py b/tools/README-generator/make_readme.py index 049aa21c..592f0097 100755 --- a/tools/README-generator/make_readme.py +++ b/tools/README-generator/make_readme.py @@ -3,10 +3,20 @@ import argparse import json import os +import yaml from pathlib import Path from jinja2 import Environment, FileSystemLoader +def value_for_lang(values, lang): + if not isinstance(values, dict): + return values + if lang in values: + return values[lang] + elif "en" in values: + return values["en"] + else: + return list(values.values())[0] def generate_READMEs(app_path: str): @@ -21,6 +31,9 @@ def generate_READMEs(app_path: str): catalog = json.load(open(Path(os.path.abspath(__file__)).parent.parent.parent / "apps.json")) from_catalog = catalog.get(manifest['id'], {}) + antifeatures_list = yaml.load(open(Path(os.path.abspath(__file__)).parent.parent.parent / "antifeatures.yml"), Loader=yaml.SafeLoader) + antifeatures_list = {e['id']: e for e in antifeatures_list} + if not upstream and not (app_path / "doc" / "DISCLAIMER.md").exists(): print( "There's no 'upstream' key in the manifest, and doc/DISCLAIMER.md doesn't exists - therefore assuming that we shall not auto-update the README.md for this app yet." @@ -66,12 +79,22 @@ def generate_READMEs(app_path: str): else: default_branch_version = None # we don't care in that case + # TODO: Add url to the documentation... and actually create that documentation :D + antifeatures = {a: antifeatures_list[a] for a in from_catalog.get('antifeatures', [])} + for k, v in antifeatures.items(): + antifeatures[k]['title'] = value_for_lang(v['title'], lang_suffix) + if manifest.get("antifeatures", {}).get(k, None): + antifeatures[k]['description'] = value_for_lang(manifest.get("antifeatures", {}).get(k, None), lang_suffix) + else: + antifeatures[k]['description'] = value_for_lang(antifeatures[k]['description'], lang_suffix) + out = template.render( lang=lang, upstream=upstream, description=description, screenshots=screenshots, disclaimer=disclaimer, + antifeatures=antifeatures, manifest=manifest, current_branch=current_branch, default_branch=default_branch, diff --git a/tools/README-generator/requirements.txt b/tools/README-generator/requirements.txt index 88cd6e2e..33fe25a7 100644 --- a/tools/README-generator/requirements.txt +++ b/tools/README-generator/requirements.txt @@ -1,2 +1,3 @@ jinja2 sanic +pyyaml diff --git a/tools/README-generator/templates/README.md.j2 b/tools/README-generator/templates/README.md.j2 index ec993915..0c5f9b01 100644 --- a/tools/README-generator/templates/README.md.j2 +++ b/tools/README-generator/templates/README.md.j2 @@ -51,6 +51,15 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in {{ disclaimer }} {% endif -%} +{% if antifeatures -%} +## :red_circle: Antifeatures + +{% for antifeature in antifeatures.values() -%} + - **{{ antifeature.title }}**: {{ antifeature.description }} + +{% endfor -%} +{% endif -%} + ## Documentation and resources {% if upstream.website -%}* Official app website: <{{ upstream.website }}> diff --git a/tools/README-generator/templates/README_fr.md.j2 b/tools/README-generator/templates/README_fr.md.j2 index d616280e..6171d44d 100644 --- a/tools/README-generator/templates/README_fr.md.j2 +++ b/tools/README-generator/templates/README_fr.md.j2 @@ -37,6 +37,16 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour {{ disclaimer }} {% endif -%} +{% if antifeatures -%} +## :red_circle: Fonctions indésirables + +{% for antifeature in antifeatures.values() -%} + - **{{ antifeature.title }}**: {{ antifeature.description }} + +{% endfor -%} +{% endif -%} + + ## Documentations et ressources {% if upstream.website -%}* Site officiel de l'app : <{{ upstream.website }}> diff --git a/tools/packaging_v2/convert_app_to_packaging_v2.py b/tools/packaging_v2/convert_app_to_packaging_v2.py index b2a11c31..ba001531 100644 --- a/tools/packaging_v2/convert_app_to_packaging_v2.py +++ b/tools/packaging_v2/convert_app_to_packaging_v2.py @@ -26,6 +26,8 @@ def _convert_v1_manifest_to_v2(app_path): if "url" in manifest and "website" not in manifest["upstream"]: manifest["upstream"]["website"] = manifest["url"] + manifest["upstream"]["cpe"] = "???" + manifest["integration"] = { "yunohost": manifest.get("requirements", {}).get("yunohost"), "architectures": "all", @@ -158,6 +160,7 @@ def _dump_v2_manifest_as_toml(manifest): upstream = table() for key, value in manifest["upstream"].items(): upstream[key] = value + upstream["cpe"].comment("FIXME: optional but recommended if relevant, this is meant to contain the Common Platform Enumeration, which is sort of a standard id for applications defined by the NIST. In particular, Yunohost may use this is in the future to easily track CVE (=security reports) related to apps. The CPE may be obtained by searching here: https://nvd.nist.gov/products/cpe/search. For example, for Nextcloud, the CPE is 'cpe:2.3:a:nextcloud:nextcloud' (no need to include the version number)") toml_manifest["upstream"] = upstream integration = table()