scripts/scan_imports.py
Rama master · réplica de lectura del repositorio original.
#!/usr/bin/env python3
"""Scan all rex/ modules for import errors."""
import importlib
import importlib.util
import os
import sys
import traceback
# Add repo root to path
repo_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, repo_root)
# Set testing env var to avoid side effects
os.environ["REX_TESTING"] = "true"
SKIP_MODULES = {
# These trigger heavy side-effect imports or hardware access
"rex.computers.agent_server",
}
def find_modules(base_dir):
modules = []
for root, dirs, files in os.walk(base_dir):
# Skip __pycache__
dirs[:] = [d for d in dirs if d != "__pycache__"]
for fname in files:
if not fname.endswith(".py"):
continue
fpath = os.path.join(root, fname)
# Convert to module path
rel = os.path.relpath(fpath, repo_root)
module = rel.replace(os.sep, ".").removesuffix(".py")
modules.append(module)
return sorted(modules)
def try_import(module_name):
try:
importlib.import_module(module_name)
return None
except Exception as e:
return (type(e).__name__, str(e), traceback.format_exc())
def main():
rex_dir = os.path.join(repo_root, "rex")
modules = find_modules(rex_dir)
failures = []
successes = []
for mod in modules:
if mod in SKIP_MODULES:
print(f" SKIP {mod}")
continue
err = try_import(mod)
if err:
failures.append((mod, err))
print(f" FAIL {mod}: {err[0]}: {err[1][:80]}")
else:
successes.append(mod)
print(f" OK {mod}")
print("\n\n=== SUMMARY ===")
print(f"Total modules: {len(modules)}")
print(f"OK: {len(successes)}")
print(f"FAILED: {len(failures)}")
if failures:
print("\n=== FAILURES ===")
for mod, (etype, emsg, etb) in failures:
print(f"\n--- {mod} ---")
print(f" {etype}: {emsg}")
print(etb)
return len(failures)
if __name__ == "__main__":
sys.exit(main())