Files
unredact/Makefile
T

161 lines
5.0 KiB
Makefile

.PHONY: build build-solver run stop restart solver app logs status clean dev kill build-associates build-emails check-api-key
SOLVER_BIN = solver_rs/target/release/unredact-solver
SOLVER_PORT ?= 3100
APP_PORT ?= 8000
DATA_DIR = $(CURDIR)/unredact/data
PID_DIR = .pids
VENV = .venv/bin
PYTHON = $(VENV)/python
UVICORN = $(VENV)/uvicorn
# Load .env if it exists
-include .env
export ANTHROPIC_API_KEY
$(PID_DIR):
mkdir -p $(PID_DIR)
# ── Build ──
build-solver:
cd solver_rs && cargo build --release
build: build-solver
# ── API key ──
check-api-key:
@if [ -z "$(ANTHROPIC_API_KEY)" ]; then \
printf "Enter your Anthropic API key (from console.anthropic.com): "; \
read key; \
echo "ANTHROPIC_API_KEY=$$key" > .env; \
echo "Saved to .env — run make again."; \
exit 1; \
fi
# ── Run (background, use `make logs` to see output) ──
solver: $(PID_DIR) build-solver
@if [ -f $(PID_DIR)/solver.pid ] && kill -0 $$(cat $(PID_DIR)/solver.pid) 2>/dev/null; then \
echo "Solver already running (pid $$(cat $(PID_DIR)/solver.pid))"; \
else \
SOLVER_PORT=$(SOLVER_PORT) DATA_DIR=$(DATA_DIR) $(SOLVER_BIN) > $(PID_DIR)/solver.log 2>&1 & \
echo $$! > $(PID_DIR)/solver.pid; \
sleep 0.5; \
if kill -0 $$(cat $(PID_DIR)/solver.pid) 2>/dev/null; then \
echo "Solver started on :$(SOLVER_PORT) (pid $$(cat $(PID_DIR)/solver.pid))"; \
else \
echo "Solver failed to start. Check $(PID_DIR)/solver.log"; \
cat $(PID_DIR)/solver.log; \
exit 1; \
fi \
fi
app: check-api-key $(PID_DIR) solver
@if [ -f $(PID_DIR)/app.pid ] && kill -0 $$(cat $(PID_DIR)/app.pid) 2>/dev/null; then \
echo "App already running (pid $$(cat $(PID_DIR)/app.pid))"; \
else \
SOLVER_URL=http://127.0.0.1:$(SOLVER_PORT) \
$(UVICORN) unredact.app:app --host 0.0.0.0 --port $(APP_PORT) > $(PID_DIR)/app.log 2>&1 & \
echo $$! > $(PID_DIR)/app.pid; \
sleep 1; \
if kill -0 $$(cat $(PID_DIR)/app.pid) 2>/dev/null; then \
echo "App started on :$(APP_PORT) (pid $$(cat $(PID_DIR)/app.pid))"; \
else \
echo "App failed to start. Check $(PID_DIR)/app.log"; \
cat $(PID_DIR)/app.log; \
exit 1; \
fi \
fi
# ── Run with live logs (foreground, Ctrl-C stops everything) ──
run: check-api-key $(PID_DIR) build-solver
@SOLVER_PORT=$(SOLVER_PORT) DATA_DIR=$(DATA_DIR) $(SOLVER_BIN) > $(PID_DIR)/solver.log 2>&1 & \
echo $$! > $(PID_DIR)/solver.pid; \
sleep 0.5; \
if ! kill -0 $$(cat $(PID_DIR)/solver.pid) 2>/dev/null; then \
echo "Solver failed to start:"; cat $(PID_DIR)/solver.log; exit 1; \
fi; \
echo "Solver started on :$(SOLVER_PORT) (pid $$(cat $(PID_DIR)/solver.pid))"; \
SOLVER_URL=http://127.0.0.1:$(SOLVER_PORT) \
$(UVICORN) unredact.app:app --host 0.0.0.0 --port $(APP_PORT) > $(PID_DIR)/app.log 2>&1 & \
echo $$! > $(PID_DIR)/app.pid; \
sleep 1; \
if ! kill -0 $$(cat $(PID_DIR)/app.pid) 2>/dev/null; then \
echo "App failed to start:"; cat $(PID_DIR)/app.log; exit 1; \
fi; \
echo "App started on :$(APP_PORT) (pid $$(cat $(PID_DIR)/app.pid))"; \
echo "Running at http://localhost:$(APP_PORT) (Ctrl-C to stop)"; \
echo ""; \
trap 'echo ""; echo "Shutting down..."; \
kill $$(cat $(PID_DIR)/solver.pid) $$(cat $(PID_DIR)/app.pid) 2>/dev/null; \
rm -f $(PID_DIR)/solver.pid $(PID_DIR)/app.pid; \
echo "Stopped."; exit 0' INT TERM; \
tail -f $(PID_DIR)/solver.log $(PID_DIR)/app.log
# ── Stop ──
stop-solver:
@if [ -f $(PID_DIR)/solver.pid ]; then \
kill $$(cat $(PID_DIR)/solver.pid) 2>/dev/null && echo "Solver stopped" || echo "Solver not running"; \
rm -f $(PID_DIR)/solver.pid; \
else \
echo "No solver pid file"; \
fi
stop-app:
@if [ -f $(PID_DIR)/app.pid ]; then \
kill $$(cat $(PID_DIR)/app.pid) 2>/dev/null && echo "App stopped" || echo "App not running"; \
rm -f $(PID_DIR)/app.pid; \
else \
echo "No app pid file"; \
fi
stop: stop-app stop-solver
kill:
@echo "Killing processes on ports $(APP_PORT) and $(SOLVER_PORT)..."
@fuser -k $(APP_PORT)/tcp 2>/dev/null && echo "Killed port $(APP_PORT)" || echo "Port $(APP_PORT) free"
@fuser -k $(SOLVER_PORT)/tcp 2>/dev/null && echo "Killed port $(SOLVER_PORT)" || echo "Port $(SOLVER_PORT) free"
@rm -f $(PID_DIR)/solver.pid $(PID_DIR)/app.pid
restart: stop run
# ── Status / Logs ──
status:
@echo "── Solver ──"
@if [ -f $(PID_DIR)/solver.pid ] && kill -0 $$(cat $(PID_DIR)/solver.pid) 2>/dev/null; then \
echo " Running (pid $$(cat $(PID_DIR)/solver.pid))"; \
else \
echo " Stopped"; \
fi
@echo "── App ──"
@if [ -f $(PID_DIR)/app.pid ] && kill -0 $$(cat $(PID_DIR)/app.pid) 2>/dev/null; then \
echo " Running (pid $$(cat $(PID_DIR)/app.pid))"; \
else \
echo " Stopped"; \
fi
logs:
@tail -f $(PID_DIR)/solver.log $(PID_DIR)/app.log 2>/dev/null
# ── Clean ──
clean: stop
rm -rf $(PID_DIR)
cd solver_rs && cargo clean
# ── Test ──
build-associates:
$(PYTHON) scripts/build_associates.py
build-emails:
$(PYTHON) scripts/build_emails.py
test: solver
$(PYTHON) -m pytest tests/ --ignore=tests/test_alignment.py -v