|
1 | 1 | VENV_DIR ?= .venv |
2 | 2 | VENV_RUN = . $(VENV_DIR)/bin/activate |
3 | 3 | PIP_CMD ?= pip |
| 4 | +PYTHON_CMD ?= python |
| 5 | +TEST_DEPS ?= pytest pytest-timeout |
| 6 | +LINT_DEPS ?= ruff |
| 7 | + |
| 8 | +PG_TEST_CONTAINER ?= pg-proxy-local-tests |
| 9 | +PG_TEST_IMAGE ?= postgres:16 |
| 10 | +PG_TEST_PORT ?= 55432 |
| 11 | +PG_TEST_USER ?= postgres |
| 12 | +PG_TEST_PASSWORD ?= postgres |
| 13 | +PG_TEST_DB ?= postgres |
| 14 | +ACT_CMD ?= act |
| 15 | +ACT_WORKFLOW ?= .github/workflows/tests.yml |
| 16 | +ACT_JOB ?= tests |
| 17 | +ACT_PULL ?= false |
| 18 | +ACT_CONTAINER_ARCH ?= linux/arm64 |
4 | 19 |
|
5 | 20 | usage: ## Show this help |
6 | 21 | @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//' |
7 | 22 |
|
8 | 23 | install: ## Install dependencies in local virtualenv folder |
9 | | - (test `which virtualenv` || $(PIP_CMD) install --user virtualenv) && \ |
| 24 | + (test `which virtualenv` || $(PIP_CMD) install virtualenv) && \ |
10 | 25 | (test -e $(VENV_DIR) || virtualenv $(VENV_OPTS) $(VENV_DIR)) && \ |
11 | 26 | ($(VENV_RUN) && $(PIP_CMD) install --upgrade pip) && \ |
12 | 27 | (test ! -e requirements.txt || ($(VENV_RUN); $(PIP_CMD) install -r requirements.txt)) |
13 | 28 |
|
14 | 29 | publish: ## Publish the library to the central PyPi repository |
15 | 30 | ($(VENV_RUN); pip install twine; python ./setup.py sdist && twine upload dist/*) |
16 | 31 |
|
17 | | -.PHONY: usage install clean publish test lint |
| 32 | +install-test: install ## Install test dependencies in local virtualenv |
| 33 | + ($(VENV_RUN); $(PIP_CMD) install $(TEST_DEPS)) |
| 34 | + |
| 35 | +install-lint: install ## Install lint dependencies in local virtualenv |
| 36 | + ($(VENV_RUN); $(PIP_CMD) install $(LINT_DEPS)) |
| 37 | + |
| 38 | +lint: install-lint ## Format code with ruff |
| 39 | + $(VENV_DIR)/bin/ruff format postgresql_proxy tests plugins |
| 40 | + |
| 41 | +test: ## Start local PostgreSQL container and run all tests |
| 42 | + @set -euo pipefail; \ |
| 43 | + cleanup() { docker rm -f $(PG_TEST_CONTAINER) >/dev/null 2>&1 || true; }; \ |
| 44 | + trap cleanup EXIT INT TERM; \ |
| 45 | + docker rm -f $(PG_TEST_CONTAINER) >/dev/null 2>&1 || true; \ |
| 46 | + docker run --name $(PG_TEST_CONTAINER) \ |
| 47 | + -e POSTGRES_USER=$(PG_TEST_USER) \ |
| 48 | + -e POSTGRES_PASSWORD=$(PG_TEST_PASSWORD) \ |
| 49 | + -e POSTGRES_DB=$(PG_TEST_DB) \ |
| 50 | + -p $(PG_TEST_PORT):5432 \ |
| 51 | + -d $(PG_TEST_IMAGE) >/dev/null; \ |
| 52 | + for i in $$(seq 1 45); do \ |
| 53 | + if docker exec $(PG_TEST_CONTAINER) pg_isready -U $(PG_TEST_USER) >/dev/null 2>&1; then \ |
| 54 | + echo "PostgreSQL ready on 127.0.0.1:$(PG_TEST_PORT)"; \ |
| 55 | + break; \ |
| 56 | + fi; \ |
| 57 | + sleep 1; \ |
| 58 | + done; \ |
| 59 | + if ! docker exec $(PG_TEST_CONTAINER) pg_isready -U $(PG_TEST_USER) >/dev/null 2>&1; then \ |
| 60 | + echo "PostgreSQL did not become ready in time"; \ |
| 61 | + exit 1; \ |
| 62 | + fi; \ |
| 63 | + E2E_PG_HOST=127.0.0.1 \ |
| 64 | + E2E_PG_PORT=$(PG_TEST_PORT) \ |
| 65 | + E2E_PG_USER=$(PG_TEST_USER) \ |
| 66 | + E2E_PG_PASSWORD=$(PG_TEST_PASSWORD) \ |
| 67 | + E2E_PG_DB=$(PG_TEST_DB) \ |
| 68 | + $(VENV_DIR)/bin/$(PYTHON_CMD) -m pytest -vv |
| 69 | + |
| 70 | +test-act: ## Run the CI test workflow locally with act |
| 71 | + $(ACT_CMD) -W $(ACT_WORKFLOW) -j $(ACT_JOB) --pull=$(ACT_PULL) --container-architecture $(ACT_CONTAINER_ARCH) |
| 72 | + |
| 73 | +.PHONY: usage install install-test install-lint clean publish test test-act lint |
0 commit comments