from pathlib import Path import re import sys PROJECT_ROOT = Path(__file__).resolve().parents[1] MODEL_ROOT = PROJECT_ROOT / "model" SCRIPT_ROOT = PROJECT_ROOT / "scripts" def _python_files(root: Path): return [path for path in root.rglob("*.py") if "__pycache__" not in path.parts] def _check_no_onescience_models_imports(): offenders = [] for path in _python_files(MODEL_ROOT): text = path.read_text(encoding="utf-8") if "onescience.models." in text: offenders.append(str(path.relative_to(PROJECT_ROOT))) return offenders def _check_no_legacy_imports(): pattern = re.compile( r"^\s*(from\s+(esm|openfold)(\.|\s)|import\s+(esm|openfold)(\.|\s|$))", re.MULTILINE, ) offenders = [] for root in (MODEL_ROOT, SCRIPT_ROOT): for path in _python_files(root): text = path.read_text(encoding="utf-8") if pattern.search(text): offenders.append(str(path.relative_to(PROJECT_ROOT))) return offenders def _check_script_bootstrap(): offenders = [] for path in _python_files(SCRIPT_ROOT): text = path.read_text(encoding="utf-8") if "model.esm" in text and '_PROJECT_ROOT / "model"' not in text: offenders.append(str(path.relative_to(PROJECT_ROOT))) return offenders def main(): checks = { "onescience.models imports": _check_no_onescience_models_imports(), "legacy esm/openfold imports": _check_no_legacy_imports(), "script project-root bootstrap": _check_script_bootstrap(), } failed = {name: offenders for name, offenders in checks.items() if offenders} if failed: for name, offenders in failed.items(): print(f"{name}:") for offender in offenders: print(f" {offender}") return 1 print("Import boundary checks passed") return 0 if __name__ == "__main__": sys.exit(main())