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:
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[

View file

@ -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 <c-c>")
# 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 <c-c>")
# 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()