← Files VeraARCHIVED FILE
modules/archive-organization/scripts/check_dependencies.py
2.66 KB · Oct 2, 2026 · 00:29 UTC
#!/usr/bin/env python3
"""Check the archive-organization runtime contract."""
from __future__ import annotations
import argparse
import importlib.util
import re
from pathlib import Path
__all__ = ["main"]
PACKAGE_IMPORTS = {
"google-api-core": "google.api_core",
"google-api-python-client": "googleapiclient",
"google-auth": "google.auth",
"google-auth-oauthlib": "google_auth_oauthlib",
"protobuf": "google.protobuf",
}
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 main() -> int:
"""Confirm required package files and Google Drive dependencies are present."""
parser = argparse.ArgumentParser(
description="Check archive-organization package files and requirements."
)
parser.add_argument(
"--requirements",
action="append",
default=[],
help="Requirements file under the plugin root; may be repeated.",
)
args = parser.parse_args()
root = Path(__file__).resolve().parents[1]
required = (
root / "requirements.txt",
root / "references" / "default-archive-policy.json",
root / "scripts" / "archive_organization.py",
)
missing = [path.name for path in required if not path.is_file()]
if missing:
raise SystemExit(f"Missing required plugin files: {', '.join(missing)}")
missing_dependencies: list[tuple[str, str]] = []
for relative in args.requirements or ["requirements.txt"]:
candidate = Path(relative)
if candidate.is_absolute() or ".." in candidate.parts:
raise SystemExit("Requirements paths must stay inside the plugin root.")
if not (root / candidate).is_file():
raise SystemExit(f"Missing requirements file: {relative}")
for line in (root / candidate).read_text(encoding="utf-8").splitlines():
package = _requirement_name(line)
if not package:
continue
module = PACKAGE_IMPORTS.get(package, package.replace("-", "_"))
if importlib.util.find_spec(module) is None:
missing_dependencies.append((package, module))
if missing_dependencies:
details = ", ".join(
f"{package} (import {module})"
for package, module in sorted(set(missing_dependencies))
)
raise SystemExit(f"Missing dependencies: {details}")
print("OK: archive-organization dependencies are available")
return 0
if __name__ == "__main__":
raise SystemExit(main())
SHA-256: 0b2213807528cda8f6ab9979b75a69debb00cdb7c15f69972237982c3aca622d