STSG/stsg/__main__.py

100 lines
2.5 KiB
Python

import logging
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import os
import subprocess
from .config import SOURCE_DIRECTORY, CODE_DIRECTORY
from .build import build as complete_build
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("stsg")
def build():
complete_build()
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=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()