From 3503d1d42f578199b8876477927b1b58c51d2d58 Mon Sep 17 00:00:00 2001 From: Lars Noack Date: Thu, 10 Apr 2025 13:32:42 +0200 Subject: [PATCH] feat: refactored the hot reload --- pyproject.toml | 4 +-- src/example_page_1/de-DE.md | 1 + src/example_page_2/de-DE.md | 1 + stsg/__main__.py | 63 +++++++++++++++++++++++++++++++++---- stsg/config.py | 6 +++- 5 files changed, 66 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 03478e6..d00c0a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,8 +11,8 @@ classifiers = [] version = "0.0.0" [project.scripts] -stsg_build = "stsg.__main__:build" -stsg_build_on_change = "stsg.__main__:build_on_change" +stsg = "stsg.__main__:build" +stsg_dev = "stsg.__main__:hot_reload" [build-system] diff --git a/src/example_page_1/de-DE.md b/src/example_page_1/de-DE.md index e69de29..0519ecb 100644 --- a/src/example_page_1/de-DE.md +++ b/src/example_page_1/de-DE.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/example_page_2/de-DE.md b/src/example_page_2/de-DE.md index e69de29..0519ecb 100644 --- a/src/example_page_2/de-DE.md +++ b/src/example_page_2/de-DE.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stsg/__main__.py b/stsg/__main__.py index 2e11d8d..322cc62 100644 --- a/stsg/__main__.py +++ b/stsg/__main__.py @@ -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() diff --git a/stsg/config.py b/stsg/config.py index 354b909..1fcc883 100644 --- a/stsg/config.py +++ b/stsg/config.py @@ -1 +1,5 @@ -SOURCE_DIRECTORY = "src" \ No newline at end of file +SOURCE_DIRECTORY = "src" + +# for development + +CODE_DIRECTORY = "stsg"