Private
Public Access
0
0

feat(hot-reload): Complete deep OOP gutting of gui_2.py and perfect 1-space refactor

This commit is contained in:
2026-05-16 04:36:00 -04:00
parent 4e153fb436
commit 430754c1e5
6 changed files with 219 additions and 382 deletions
+25 -23
View File
@@ -4,18 +4,20 @@ import sys
import re
def transform_file(file_path: str) -> None:
"""Refactors App._render_xxx methods to module-level functions."""
with open(file_path, "r", encoding="utf-8") as f:
lines = f.read().splitlines()
tree = ast.parse("\n".join(lines))
content = "\n".join(lines)
tree = ast.parse(content)
app_class = next((n for n in tree.body if isinstance(n, ast.ClassDef) and n.name == "App"), None)
if not app_class: return
render_methods = [
m for m in app_class.body
if isinstance(m, ast.FunctionDef) and m.name.startswith("_render_") and m.name != "_render_window_if_open"
]
render_names = {m.name for m in render_methods}
render_methods.sort(key=lambda x: x.lineno, reverse=True)
extracted = []
for m in render_methods:
s_idx = m.lineno - 1
@@ -23,41 +25,41 @@ def transform_file(file_path: str) -> None:
if m.decorator_list: s_idx = m.decorator_list[0].lineno - 1
m_lines = lines[s_idx:e_idx]
func_name = m.name.lstrip("_")
processed = []
for l in m_lines:
processed.append(l[1:] if l.startswith(" ") else l)
# 1. Out-dent
processed = [l[1:] if l.startswith(" ") else l for l in m_lines]
def_line_idx = next((i for i, l in enumerate(processed) if l.strip().startswith("def ")), -1)
if def_line_idx != -1:
l = processed[def_line_idx]
l = l.replace(f"def {m.name}(", f"def {func_name}(", 1)
l = re.sub(r"\bself\b", "app: App", l, count=1)
processed[def_line_idx] = l
# 2. Redirect internal calls in this function's body
for i in range(def_line_idx + 1, len(processed)):
for m_name in render_names:
t_func = m_name.lstrip("_")
# Replace self._render_xxx( with render_xxx(app,
# then fix up (app, ) if it was empty.
processed[i] = processed[i].replace(f"self.{m_name}(", f"{t_func}(app, ")
processed[i] = processed[i].replace(f"(app, )", "(app)")
processed[i] = processed[i].replace("(app, )", "(app)")
processed[i] = re.sub(r"(?<![a-zA-Z0-9_])self\.", "app.", processed[i])
processed[i] = re.sub(r"(?<![a-zA-Z0-9_])self(?![a-zA-Z0-9_:])", "app", processed[i])
extracted.append("\n".join(processed))
arg_names = [a.arg for a in m.args.args if a.arg != "self"]
kw_names = [a.arg for a in m.args.kwonlyargs]
call_args = ["self"] + arg_names + [f"{k}={k}" for k in kw_names]
orig_def_line = m_lines[0]
if m.decorator_list:
for l in m_lines:
if l.strip().startswith("def "):
orig_def_line = l
break
wrapper = [orig_def_line, f" {func_name}({', '.join(call_args)})"]
lines[s_idx:e_idx] = wrapper
# REMOVE from class
del lines[s_idx:e_idx]
# 3. Redirect calls in remaining class methods
for i in range(len(lines)):
for m_name in render_names:
t_func = m_name.lstrip("_")
lines[i] = lines[i].replace(f"self.{m_name}(", f"{t_func}(self, ")
lines[i] = lines[i].replace("(self, )", "(self)")
extracted.reverse()
final = "\n".join(lines) + "\n\n" + "\n\n".join(extracted) + "\n"
final_content = "\n".join(lines) + "\n\n" + "\n\n".join(extracted) + "\n"
with open(file_path, "w", encoding="utf-8") as f:
f.write(final)
print(f"Transformed {file_path}")
f.write(final_content)
print(f"Successfully GUTTED {file_path}")
if __name__ == "__main__":
if len(sys.argv) > 1: transform_file(sys.argv[1])
transform_file(sys.argv[1])