import logging from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import time import os import subprocess from . import config from .build import build as complete_build CODE_DIRECTORY = "stsg" logging.basicConfig(level=logging.INFO) logger = logging.getLogger("stsg") def build(): build_wiki() # complete_build() def build_wiki(): pass class MarkdownChangeHandler(FileSystemEventHandler): 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 logger.info("%s changed, building", event.src_path) build() class PythonChangeHandler(FileSystemEventHandler): def __init__(self, command): self.logger = logging.getLogger("stsg.hot_reload") self.env = os.environ.copy() self.env["IS_CHILD"] = "true" self.command = command self.process = self.start_process() def start_process(self): self.logger.info("Starting process...") return subprocess.Popen(self.command, env=self.env) def restart_process(self): self.logger.info("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"): self.logger.info(f"Detected change: {event.src_path}") self.restart_process() def stop_process(self): if self.process: self.process.terminate() def build_on_change(): build() observer = Observer() observer.schedule(MarkdownChangeHandler(), path=config.setup.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_dev"]), path=CODE_DIRECTORY, recursive=True) observer.start() try: while True: time.sleep(1) # Keeps the thread alive except KeyboardInterrupt: observer.stop() observer.join()