TNCSC_Odoo/scripts/check_manifests.py
Alaguraj0361 0f462ad21a
Some checks failed
CI / Brand-leak check (push) Has been cancelled
CI / flake8 / pylint-odoo / manifest completeness (push) Has been cancelled
CI / Install all modules with --test-enable (push) Has been cancelled
add TNCSC deployment module, community add-ons, role guides, and website navigation overrides
2026-09-28 19:43:48 +05:30

63 lines
2.3 KiB
Python

#!/usr/bin/env python3
"""Validate that every product module manifest is App-Store-ready.
Checks community_* modules for the required keys (license, version, author,
summary, category, website, depends). *_deployment modules are exempt from
price/currency/images since they are never sold independently.
"""
import ast
import sys
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parent.parent if Path(__file__).name != '<stdin>' else Path('/mnt/extra-addons').parent
ADDONS_DIR = Path('/mnt/extra-addons') if Path('/mnt/extra-addons').exists() else (REPO_ROOT / "addons")
REQUIRED_KEYS = ["name", "version", "author", "website", "license", "category", "summary", "depends"]
PRODUCT_ONLY_KEYS = ["price", "currency", "images"]
def load_manifest(path: Path) -> dict:
return ast.literal_eval(path.read_text(encoding="utf-8"))
def main() -> int:
if not ADDONS_DIR.exists():
print(f"No addons/ directory found at {ADDONS_DIR}; nothing to check.")
return 0
errors = []
for module_dir in sorted(ADDONS_DIR.iterdir()):
manifest_path = module_dir / "__manifest__.py"
if not manifest_path.exists():
continue
manifest = load_manifest(manifest_path)
is_deployment = module_dir.name.endswith("_deployment")
required = REQUIRED_KEYS + ([] if is_deployment else PRODUCT_ONLY_KEYS)
for key in required:
if key not in manifest or manifest[key] in (None, "", []):
errors.append(f"{module_dir.name}: missing or empty required manifest key '{key}'")
if not is_deployment and manifest.get("license") not in ("LGPL-3", "OPL-1"):
errors.append(
f"{module_dir.name}: license must be 'LGPL-3' (or 'OPL-1' for an "
f"intentionally paid-closed module), got {manifest.get('license')!r}"
)
if manifest.get("version") and not str(manifest["version"]).startswith("19.0."):
errors.append(f"{module_dir.name}: version should start with '19.0.', got {manifest.get('version')!r}")
if errors:
print("Manifest completeness check FAILED:\n")
for error in errors:
print(f" - {error}")
return 1
print("Manifest completeness check passed.")
return 0
if __name__ == "__main__":
sys.exit(main())