dotb_ai-platform/Makefile
hungtran24 d5e096b952 chore: simplify dev port lookup and isolate settings tests
Resolve the shared backend port once for make dev and reuse it in the child make. Keep pure configuration tests independent of local credentials and URLs without altering integration database settings.
2026-10-02 11:58:19 +07:00

57 lines
2.6 KiB
Makefile

SHELL := /bin/sh
.DEFAULT_GOAL := help
# Parse only the shared port; importing .env as Make syntax would misread secrets and JSON.
BACKEND_PORT ?= $(shell uv run --no-sync python -c 'from dotenv import dotenv_values; print(dotenv_values(".env").get("BACKEND_PORT") or "8000")')
.PHONY: help install dev db-up db-down migrate backend-dev web-dev contract check-fast check test build
help: ## List repository commands
@grep -E '^[a-zA-Z_-]+:.*## ' $(MAKEFILE_LIST) | sort | awk -F ':.*## ' '{printf "%-16s %s\n", $$1, $$2}'
install: ## Sync project-local dependencies from both lockfiles
uv sync --locked --all-groups
cd apps/web && bun install --frozen-lockfile
dev: ## Start PostgreSQL and run the native backend and web together
$(MAKE) --jobs=2 backend-dev web-dev BACKEND_PORT=$(BACKEND_PORT)
db-up: ## Start local PostgreSQL and wait until ready
docker compose up -d --wait postgres
db-down: ## Stop local services without deleting the database
docker compose down
migrate: ## Apply migrations to the configured database
uv run --no-sync alembic upgrade head
backend-dev: db-up ## Ensure PostgreSQL is ready, then run backend on the shared port
uv run --no-sync uvicorn ai_platform.main:app --reload --host 127.0.0.1 --port $(BACKEND_PORT)
web-dev: ## Run SvelteKit with the shared backend address
cd apps/web && BACKEND_INTERNAL_URL=http://127.0.0.1:$(BACKEND_PORT) bun run dev -- --host 127.0.0.1
contract: ## Generate the backend OpenAPI consumed by Admin Web
uv run --no-sync ai-platform export-openapi contracts/lead-scoring/v2/openapi.json
uv run --no-sync python scripts/export_contract_fixtures.py
check-fast: ## Check staged/all tracked source with opt-in pre-commit rules
uv run --no-sync pre-commit run --all-files
test: ## Run backend tests only on the isolated test database
@set -a; if [ -f .env.test ] && [ -z "$$CI" ]; then . ./.env.test; fi; set +a; \
python -c 'from urllib.parse import urlsplit; import os,sys; url=os.environ.get("AI_PLATFORM_DATABASE_URL", ""); sys.exit(urlsplit(url).path.rstrip("/").split("/")[-1] != "ai_platform_test")' || { echo "Test URL must end in /ai_platform_test." >&2; exit 2; }; \
uv run --no-sync pytest
check: check-fast contract ## Run backend and web checks used by CI
uv run --no-sync ruff check src tests
uv run --no-sync ruff format --check src tests
uv run --no-sync pyright
uv run --no-sync lint-imports
$(MAKE) test
cd apps/web && bun run format:check && bun run check && bun run test && bun run build
build: ## Build both images; does not deploy them
docker build -f Dockerfile.backend -t ai-platform-backend:local .
docker build -f apps/web/Dockerfile -t ai-platform-web:local .