← Files VeraARCHIVED FILE
modules/deep-research-validator/scripts/check_dependencies.py
2.92 KB · Oct 2, 2026 · 00:29 UTC
"""Check runtime dependencies for the Deep Research Validator plugin."""
from __future__ import annotations
import argparse
import importlib.util
import re
import sys
from pathlib import Path
__all__ = ["main"]
PACKAGE_IMPORTS: dict[str, str] = {"pymupdf": "fitz"}
def plugin_root() -> Path:
return Path(__file__).resolve().parents[1]
def _requirement_name(line: str) -> str:
cleaned = line.split("#", 1)[0].strip()
if not cleaned or cleaned.startswith(("-", "git+", "http://", "https://")):
return ""
match = re.match(r"([A-Za-z0-9_.-]+)", cleaned)
return match.group(1).lower() if match else ""
def _import_name(package_name: str) -> str:
return PACKAGE_IMPORTS.get(package_name.lower(), package_name.replace("-", "_"))
def _required_modules_from_requirements(path: Path) -> list[str]:
modules: list[str] = []
if not path.exists():
return modules
for line in path.read_text(encoding="utf-8").splitlines():
package = _requirement_name(line)
if package:
modules.append(_import_name(package))
return modules
def _selected_requirement_files(explicit_files: list[str]) -> list[Path]:
root = plugin_root()
if explicit_files:
files = [root / name for name in explicit_files]
else:
files = [root / "requirements.txt"]
return [path for path in files if path.exists()]
def _parse_args(argv: list[str] | None = None) -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Check the Deep Research Validator plugin dependencies."
)
parser.add_argument(
"--requirements",
action="append",
default=[],
help="Specific requirements file under the plugin root. May be passed more than once.",
)
return parser.parse_args(argv)
def main(argv: list[str] | None = None) -> int:
"""Return 0 when required dependencies are importable."""
args = _parse_args(argv)
if sys.version_info[:2] != (3, 12):
print("Python 3.12 is required.", file=sys.stderr)
return 1
requirement_files = _selected_requirement_files(args.requirements)
if args.requirements and not requirement_files:
print("MISSING_REQUIREMENTS_FILE: no requested requirements file found")
return 1
missing: list[str] = []
for requirements_file in requirement_files:
for module_name in _required_modules_from_requirements(requirements_file):
if importlib.util.find_spec(module_name) is None:
missing.append(module_name)
if missing:
print(
"Missing required modules: " + ", ".join(sorted(missing)),
file=sys.stderr,
)
print(
"Install from requirements.txt before running plugin scripts.",
file=sys.stderr,
)
return 1
print("Deep Research Validator dependency check passed.")
return 0
if __name__ == "__main__":
raise SystemExit(main())
SHA-256: 3bff292963b959762c57785c9b7f9a796a0454eb7438880ef672bed13c1ae5d5