codriao / fix_imports_and_setup.py
Raiff1982's picture
Create fix_imports_and_setup.py
b0b7b7b verified
import os
import re
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
COMPONENT_DIR = "components"
PY_FILE_REGEX = re.compile(r"from\s+([a-zA-Z0-9_\.]+)\s+import\s+([a-zA-Z0-9_]+)")
def find_py_files(base_path):
py_files = []
for root, dirs, files in os.walk(base_path):
for file in files:
if file.endswith(".py"):
py_files.append(os.path.join(root, file))
return py_files
def ensure_init_files():
"""Add __init__.py to every directory under components/"""
for root, dirs, files in os.walk(os.path.join(PROJECT_ROOT, COMPONENT_DIR)):
if '__init__.py' not in files:
init_path = os.path.join(root, '__init__.py')
open(init_path, 'w').close()
print(f"[INIT ADDED] {init_path}")
def resolve_import_module(symbol):
"""Try to locate the module file matching the symbol name"""
for root, dirs, files in os.walk(os.path.join(PROJECT_ROOT, COMPONENT_DIR)):
for file in files:
if file == f"{symbol}.py":
relative = os.path.relpath(root, PROJECT_ROOT)
return f"{relative.replace(os.sep, '.')}.{symbol}"
return None
def fix_imports_in_file(file_path):
with open(file_path, 'r') as f:
lines = f.readlines()
changed = False
new_lines = []
for line in lines:
match = PY_FILE_REGEX.match(line.strip())
if match:
module_path, symbol = match.groups()
if module_path == symbol.lower():
resolved = resolve_import_module(symbol)
if resolved:
fixed_line = f"from {resolved} import {symbol}"
print(f"[FIX] {file_path} :: {line.strip()} -> {fixed_line}")
new_lines.append(fixed_line + '\n')
changed = True
continue
new_lines.append(line)
if changed:
with open(file_path, 'w') as f:
f.writelines(new_lines)
print(f"[UPDATED] {file_path}")
def run_full_fix():
print("== Starting Full Import Fix and Init Generator ==\n")
ensure_init_files()
py_files = find_py_files(PROJECT_ROOT)
for file in py_files:
if file.endswith("__init__.py") or COMPONENT_DIR not in file:
continue
fix_imports_in_file(file)
print("\n== Done ==")
if __name__ == "__main__":
run_full_fix()