From bdd7558999d4fd28a2eb3aaeee149d5d2d05bb7b Mon Sep 17 00:00:00 2001 From: Daniel Fichtinger Date: Sat, 12 Jul 2025 00:48:22 -0400 Subject: [PATCH] server now builds to tempdir by default --- src/zona/cli.py | 12 ++--- src/zona/server.py | 118 +++++++++++++++++++++++---------------------- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/src/zona/cli.py b/src/zona/cli.py index c1017ab..f6f40af 100644 --- a/src/zona/cli.py +++ b/src/zona/cli.py @@ -59,9 +59,7 @@ def build( """ if draft: print("Option override: including drafts.") - builder = ZonaBuilder( - cli_root=root, cli_output=output, draft=draft - ) + builder = ZonaBuilder(cli_root=root, cli_output=output, draft=draft) builder.build() @@ -75,9 +73,7 @@ def serve( ] = None, host: Annotated[ str, - typer.Option( - "--host", help="Hostname for live preview server." - ), + typer.Option("--host", help="Hostname for live preview server."), ] = "localhost", port: Annotated[ int, @@ -90,7 +86,9 @@ def serve( output: Annotated[ Path | None, typer.Option( - "--output", "-o", help="Location to write built website" + "--output", + "-o", + help="Location to write built website. Temporary directory by default.", ), ] = None, draft: Annotated[ diff --git a/src/zona/server.py b/src/zona/server.py index 8e08b0c..c18f3a8 100644 --- a/src/zona/server.py +++ b/src/zona/server.py @@ -2,6 +2,7 @@ import io import os import signal import sys +import tempfile import threading from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path @@ -173,67 +174,68 @@ def serve( live_reload: bool = True, ): """Serve preview website with live reload and automatic rebuild.""" - builder = ZonaBuilder(root, output, draft) - # initial site build - builder.build() - # use discovered paths if none provided - if output is None: - output = builder.layout.output - if root is None: - root = builder.layout.root + # create temp dir, automatic cleanup + with tempfile.TemporaryDirectory() as tmp: + builder = ZonaBuilder(root, Path(tmp), draft) + # initial site build + builder.build() + # use discovered paths if none provided + if output is None: + output = builder.layout.output + if root is None: + root = builder.layout.root - # spin up websocket server for live reloading - if live_reload: - ws_port = port + 1 - ws_server = WebSocketServer(host, ws_port) - ws_server.start() - # generate reload script for injection - reload_script = make_reload_script(host, ws_port) - # generate handler with reload script as attribute - handler = make_handler_class(reload_script) - else: - handler = QuietHandler - ws_server = None - # serve the output directory - os.chdir(output) - # initialize http server - httpd = ZonaServer( - server_address=(host, port), RequestHandlerClass=handler - ) - # link websocket server - if ws_server: - httpd.set_ws_server(ws_server) - # provide link to user - print(f"Serving {output} at http://{host}:{port}") - print("Exit with ") + # spin up websocket server for live reloading + if live_reload: + ws_port = port + 1 + ws_server = WebSocketServer(host, ws_port) + ws_server.start() + # generate reload script for injection + reload_script = make_reload_script(host, ws_port) + # generate handler with reload script as attribute + handler = make_handler_class(reload_script) + else: + handler = QuietHandler + ws_server = None + # serve the output directory + os.chdir(output) + # initialize http server + httpd = ZonaServer( + server_address=(host, port), RequestHandlerClass=handler + ) + # link websocket server + if ws_server: + httpd.set_ws_server(ws_server) + # provide link to user + print(f"Serving {output} at http://{host}:{port}") + print("Exit with ") - # start server in a thread - server_thread = threading.Thread( - target=httpd.serve_forever, daemon=True - ) - server_thread.start() + # start server in a thread + server_thread = threading.Thread( + target=httpd.serve_forever, daemon=True + ) + server_thread.start() - # initialize reload handler - event_handler = ZonaReloadHandler(builder, output, ws_server) - observer = Observer() - observer.schedule( - event_handler, path=str(root / "content"), recursive=True - ) - observer.schedule( - event_handler, path=str(root / "templates"), recursive=True - ) - observer.start() + # initialize reload handler + event_handler = ZonaReloadHandler(builder, output, ws_server) + observer = Observer() + observer.schedule( + event_handler, path=str(root / "content"), recursive=True + ) + observer.schedule( + event_handler, path=str(root / "templates"), recursive=True + ) + observer.start() - # function to shut down gracefully - def shutdown_handler(_a: int, _b: FrameType | None): - logger.info("Shutting down...") - observer.stop() - httpd.shutdown() - sys.exit(0) + # function to shut down gracefully + def shutdown_handler(_a: int, _b: FrameType | None): + print("Shutting down...") + observer.stop() + httpd.shutdown() - # register shutdown handler - signal.signal(signal.SIGINT, shutdown_handler) - signal.signal(signal.SIGTERM, shutdown_handler) + # register shutdown handler + signal.signal(signal.SIGINT, shutdown_handler) + signal.signal(signal.SIGTERM, shutdown_handler) - # start file change watcher - observer.join() + # start file change watcher + observer.join()