feat: refactored the hot reload
This commit is contained in:
		| @@ -3,18 +3,19 @@ from watchdog.observers import Observer | ||||
| from watchdog.events import FileSystemEventHandler | ||||
| import time | ||||
| import os | ||||
| import subprocess | ||||
|  | ||||
| from .config import SOURCE_DIRECTORY | ||||
| from .config import SOURCE_DIRECTORY, CODE_DIRECTORY | ||||
|  | ||||
|  | ||||
| logger = logging.getLogger("stsg") | ||||
|  | ||||
|  | ||||
| def build(): | ||||
|     print("building") | ||||
|     print("building changed") | ||||
|  | ||||
|  | ||||
| class CustomFileSystemEventHandler(FileSystemEventHandler): | ||||
| class MarkdownChangeHandler(FileSystemEventHandler): | ||||
|     def on_modified(self, event): | ||||
|         if event.is_directory: | ||||
|             return | ||||
| @@ -25,21 +26,71 @@ class CustomFileSystemEventHandler(FileSystemEventHandler): | ||||
|  | ||||
|         logger.info("%s changed, building", event.src_path) | ||||
|         build() | ||||
|   | ||||
|  | ||||
| class PythonChangeHandler(FileSystemEventHandler): | ||||
|     def __init__(self, command): | ||||
|         self.env = os.environ.copy() | ||||
|         self.env["IS_CHILD"] = "true" | ||||
|  | ||||
|         self.command = command | ||||
|         self.process = self.start_process() | ||||
|  | ||||
|     def start_process(self): | ||||
|         print("[hot reload] Starting process...") | ||||
|         return subprocess.Popen(self.command, env=self.env) | ||||
|  | ||||
|     def restart_process(self): | ||||
|         print("[hot reload] Restarting process...") | ||||
|         self.process.kill() | ||||
|         self.process = self.start_process() | ||||
|  | ||||
|     def on_modified(self, event): | ||||
|         if event.is_directory: | ||||
|             return | ||||
|  | ||||
|         filename = os.path.basename(event.src_path) | ||||
|         if filename.startswith('.') or filename.endswith(('~', '.tmp', '.swp')): | ||||
|             return | ||||
|  | ||||
|         if event.src_path.endswith(".py"): | ||||
|             print(f"[hot reload] Detected change: {event.src_path}") | ||||
|             self.restart_process() | ||||
|  | ||||
|     def stop_process(self): | ||||
|         if self.process: | ||||
|             self.process.terminate() | ||||
|   | ||||
|  | ||||
| def build_on_change(): | ||||
|     print("build on change") | ||||
|     build() | ||||
|  | ||||
|     observer = Observer() | ||||
|     observer.schedule(CustomFileSystemEventHandler(), path=SOURCE_DIRECTORY, recursive=True) | ||||
|     observer.schedule(MarkdownChangeHandler(), path=SOURCE_DIRECTORY, recursive=True) | ||||
|     observer.start() | ||||
|  | ||||
|  | ||||
|     try: | ||||
|         while True: | ||||
|             time.sleep(1)  # Keeps the thread alive | ||||
|     except KeyboardInterrupt: | ||||
|         observer.stop() | ||||
|      | ||||
|     observer.join() | ||||
|  | ||||
|  | ||||
| def hot_reload(): | ||||
|     if os.environ.get("IS_CHILD") == "true": | ||||
|         build_on_change() | ||||
|         return | ||||
|  | ||||
|     observer = Observer() | ||||
|     observer.schedule(PythonChangeHandler(["stsg_build_on_change"]), path=CODE_DIRECTORY, recursive=True) | ||||
|     observer.start() | ||||
|  | ||||
|     try: | ||||
|         while True: | ||||
|             time.sleep(1)  # Keeps the thread alive | ||||
|     except KeyboardInterrupt: | ||||
|         observer.stop() | ||||
|      | ||||
|     observer.join() | ||||
|   | ||||
| @@ -1 +1,5 @@ | ||||
| SOURCE_DIRECTORY = "src" | ||||
| SOURCE_DIRECTORY = "src" | ||||
|  | ||||
| # for development | ||||
|  | ||||
| CODE_DIRECTORY = "stsg" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user