server now builds to tempdir by default

This commit is contained in:
Daniel Fichtinger 2025-07-12 00:48:22 -04:00
parent 8793284bd6
commit bdd7558999
2 changed files with 65 additions and 65 deletions

View file

@ -59,9 +59,7 @@ def build(
""" """
if draft: if draft:
print("Option override: including drafts.") print("Option override: including drafts.")
builder = ZonaBuilder( builder = ZonaBuilder(cli_root=root, cli_output=output, draft=draft)
cli_root=root, cli_output=output, draft=draft
)
builder.build() builder.build()
@ -75,9 +73,7 @@ def serve(
] = None, ] = None,
host: Annotated[ host: Annotated[
str, str,
typer.Option( typer.Option("--host", help="Hostname for live preview server."),
"--host", help="Hostname for live preview server."
),
] = "localhost", ] = "localhost",
port: Annotated[ port: Annotated[
int, int,
@ -90,7 +86,9 @@ def serve(
output: Annotated[ output: Annotated[
Path | None, Path | None,
typer.Option( typer.Option(
"--output", "-o", help="Location to write built website" "--output",
"-o",
help="Location to write built website. Temporary directory by default.",
), ),
] = None, ] = None,
draft: Annotated[ draft: Annotated[

View file

@ -2,6 +2,7 @@ import io
import os import os
import signal import signal
import sys import sys
import tempfile
import threading import threading
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path from pathlib import Path
@ -173,67 +174,68 @@ def serve(
live_reload: bool = True, live_reload: bool = True,
): ):
"""Serve preview website with live reload and automatic rebuild.""" """Serve preview website with live reload and automatic rebuild."""
builder = ZonaBuilder(root, output, draft) # create temp dir, automatic cleanup
# initial site build with tempfile.TemporaryDirectory() as tmp:
builder.build() builder = ZonaBuilder(root, Path(tmp), draft)
# use discovered paths if none provided # initial site build
if output is None: builder.build()
output = builder.layout.output # use discovered paths if none provided
if root is None: if output is None:
root = builder.layout.root output = builder.layout.output
if root is None:
root = builder.layout.root
# spin up websocket server for live reloading # spin up websocket server for live reloading
if live_reload: if live_reload:
ws_port = port + 1 ws_port = port + 1
ws_server = WebSocketServer(host, ws_port) ws_server = WebSocketServer(host, ws_port)
ws_server.start() ws_server.start()
# generate reload script for injection # generate reload script for injection
reload_script = make_reload_script(host, ws_port) reload_script = make_reload_script(host, ws_port)
# generate handler with reload script as attribute # generate handler with reload script as attribute
handler = make_handler_class(reload_script) handler = make_handler_class(reload_script)
else: else:
handler = QuietHandler handler = QuietHandler
ws_server = None ws_server = None
# serve the output directory # serve the output directory
os.chdir(output) os.chdir(output)
# initialize http server # initialize http server
httpd = ZonaServer( httpd = ZonaServer(
server_address=(host, port), RequestHandlerClass=handler server_address=(host, port), RequestHandlerClass=handler
) )
# link websocket server # link websocket server
if ws_server: if ws_server:
httpd.set_ws_server(ws_server) httpd.set_ws_server(ws_server)
# provide link to user # provide link to user
print(f"Serving {output} at http://{host}:{port}") print(f"Serving {output} at http://{host}:{port}")
print("Exit with <c-c>") print("Exit with <c-c>")
# start server in a thread # start server in a thread
server_thread = threading.Thread( server_thread = threading.Thread(
target=httpd.serve_forever, daemon=True target=httpd.serve_forever, daemon=True
) )
server_thread.start() server_thread.start()
# initialize reload handler # initialize reload handler
event_handler = ZonaReloadHandler(builder, output, ws_server) event_handler = ZonaReloadHandler(builder, output, ws_server)
observer = Observer() observer = Observer()
observer.schedule( observer.schedule(
event_handler, path=str(root / "content"), recursive=True event_handler, path=str(root / "content"), recursive=True
) )
observer.schedule( observer.schedule(
event_handler, path=str(root / "templates"), recursive=True event_handler, path=str(root / "templates"), recursive=True
) )
observer.start() observer.start()
# function to shut down gracefully # function to shut down gracefully
def shutdown_handler(_a: int, _b: FrameType | None): def shutdown_handler(_a: int, _b: FrameType | None):
logger.info("Shutting down...") print("Shutting down...")
observer.stop() observer.stop()
httpd.shutdown() httpd.shutdown()
sys.exit(0)
# register shutdown handler # register shutdown handler
signal.signal(signal.SIGINT, shutdown_handler) signal.signal(signal.SIGINT, shutdown_handler)
signal.signal(signal.SIGTERM, shutdown_handler) signal.signal(signal.SIGTERM, shutdown_handler)
# start file change watcher # start file change watcher
observer.join() observer.join()