---
stages:
  - test
  - build
  - release

variables:
  UV_VERSION: 0.4
  UV_CACHE_DIR: .uv-cache
  BASE_LAYER: bookworm-slim

cache:
  - key:
      files:
        - uv.lock
    paths:
      - $UV_CACHE_DIR

before_script:
  - apt update
  - env DEBIAN_FRONTEND=noninteractive apt install --yes --quiet gcc python3-dev libldap2-dev libsasl2-dev libssl-dev slapd ldap-utils git curl
  # Rust is needed to install the zxcvbn dependency
  - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
  - export PATH="$HOME/.cargo/bin:$PATH"

style:
  variables:
    PYTHON_VERSION: "3.13"
  image: ghcr.io/astral-sh/uv:$UV_VERSION-python$PYTHON_VERSION-$BASE_LAYER
  stage: test
  script:
    - uv sync --all-extras
    - uv run pre-commit run --all-files --show-diff-on-failure
    - uv cache prune --ci

coverage:
  variables:
    PYTHON_VERSION: "3.12"
  image: ghcr.io/astral-sh/uv:$UV_VERSION-python$PYTHON_VERSION-$BASE_LAYER
  stage: test
  script:
    - uv sync --all-extras
    - uv pip install coveralls pyyaml tomli
    - uv run pytest --cov --cov-fail-under=100 --cov-report term:skip-covered -n auto
    - uv run coveralls
    - uv cache prune --ci

tests:
  needs: ["coverage", "style"]
  parallel:
    matrix:
      - PYTHON_VERSION: ['3.10', '3.11', '3.12']
  image: ghcr.io/astral-sh/uv:$UV_VERSION-python$PYTHON_VERSION-$BASE_LAYER
  stage: test
  script:
    - uv sync --all-extras
    - uv run pytest
    - uv cache prune --ci

minversions:
  needs: ["tests"]
  variables:
    PYTHON_VERSION: "3.10"
  image: ghcr.io/astral-sh/uv:$UV_VERSION-python$PYTHON_VERSION-$BASE_LAYER
  stage: test
  script:
    - uv sync --all-extras --resolution=lowest-direct
    - uv run pytest
    - uv cache prune --ci

doc:
  variables:
    PYTHON_VERSION: "3.13"
  image: ghcr.io/astral-sh/uv:$UV_VERSION-python$PYTHON_VERSION-$BASE_LAYER
  stage: test
  script:
    - uv sync --group doc
    - uv run sphinx-build doc build/sphinx/html --fail-on-warning
    - uv cache prune --ci