← Files VeraARCHIVED FILE
modules/comunicazione-professionale/scripts/check_dependencies.py
2.63 KB · Oct 2, 2026 · 00:29 UTC
#!/usr/bin/env python3
"""Check dependencies and bundled assets for professional communications."""
from __future__ import annotations
import argparse
import importlib.util
import logging
from pathlib import Path
__all__ = ["main"]
LOGGER = logging.getLogger(__name__)
PLUGIN_ROOT = Path(__file__).resolve().parents[1]
REQUIRED_IMPORTS = {
"jsonschema": "jsonschema",
"Pillow": "PIL",
"reportlab": "reportlab",
"pypdf": "pypdf",
"fonttools": "fontTools",
}
REQUIRED_FONTS = (
"InstrumentSans-Regular.ttf",
"InstrumentSans-SemiBold.ttf",
"InstrumentSans-Bold.ttf",
)
def main(argv: list[str] | None = None) -> int:
"""Return non-zero when a declared dependency or asset is unavailable."""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"--requirements",
type=Path,
default=PLUGIN_ROOT / "requirements.txt",
)
args = parser.parse_args(argv)
if not args.requirements.is_file():
LOGGER.error("MISSING_REQUIREMENTS_FILE: %s", args.requirements)
return 1
missing = [
package
for package, module in REQUIRED_IMPORTS.items()
if importlib.util.find_spec(module) is None
]
font_root = PLUGIN_ROOT / "assets" / "fonts"
missing_fonts = [
name for name in REQUIRED_FONTS if not (font_root / name).is_file()
]
invalid_fonts: list[str] = []
if "fonttools" not in missing:
from fontTools.ttLib import TTFont
required_characters = (
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàèéìòù€→"
)
for name in REQUIRED_FONTS:
path = font_root / name
if not path.is_file():
continue
try:
font = TTFont(path, lazy=True)
cmap = font.getBestCmap() or {}
if any(ord(character) not in cmap for character in required_characters):
invalid_fonts.append(name)
font.close()
except (OSError, ValueError):
invalid_fonts.append(name)
if missing or missing_fonts or invalid_fonts:
for package in missing:
LOGGER.error("MISSING_DEPENDENCY: %s", package)
for font in missing_fonts:
LOGGER.error("MISSING_ASSET: assets/fonts/%s", font)
for font in invalid_fonts:
LOGGER.error("INVALID_FONT_ASSET: assets/fonts/%s", font)
return 1
LOGGER.info("OK: dependencies and bundled visual assets are available")
return 0
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, format="%(message)s")
raise SystemExit(main())
SHA-256: 580ea4e20a04f097f3b21bd4fb8279b594b5dccda2880344aee66bbb1a1c071d