name: Benchmark

on:
  push:
    branches:
      - "**"
    paths-ignore: &paths-ignore
      - ".github/workflows/docs.yml"
      - ".github/workflows/wheels*"
      - ".gitmodules"
      - "docs/**"
      - "wheels/**"
  pull_request:
    paths-ignore: *paths-ignore
  workflow_dispatch:

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  FORCE_COLOR: 1
  PIP_DISABLE_PIP_VERSION_CHECK: 1

jobs:
  benchmark:

    strategy:
      fail-fast: false
      matrix:
        python-version: [
          # NB: Codspeed doesn't seem to support multiple runs of the same benchmark:
          #     > At least one benchmark was run multiple times in your benchmarking workflow.
          #     > This could be because you used a matrix that runs your benchmarks multiple times.
          #     Hence, this list should only ever have exactly one version.
          "3.14",
        ]

    runs-on: ubuntu-latest
    name: Benchmark Python ${{ matrix.python-version }}

    steps:
    - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
      with:
        persist-credentials: false

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
      with:
        python-version: ${{ matrix.python-version }}
        allow-prereleases: true
        cache: pip
        cache-dependency-path: |
          ".ci/*.sh"
          "pyproject.toml"

    - name: Cache libavif
      uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
      id: cache-libavif
      with:
        path: ~/cache-libavif
        key: ${{ runner.os }}-libavif-${{ hashFiles('depends/install_libavif.sh') }}

    - name: Cache libimagequant
      uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
      id: cache-libimagequant
      with:
        path: ~/cache-libimagequant
        key: ${{ runner.os }}-libimagequant-${{ hashFiles('depends/install_imagequant.sh') }}

    - name: Cache libwebp
      uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
      id: cache-libwebp
      with:
        path: ~/cache-libwebp
        key: ${{ runner.os }}-libwebp-${{ hashFiles('depends/install_webp.sh') }}

    - name: Install Linux dependencies
      run: |
        .ci/install.sh
      env:
        GHA_PYTHON_VERSION: ${{ matrix.python-version }}
        GHA_LIBAVIF_CACHE_HIT: ${{ steps.cache-libavif.outputs.cache-hit }}
        GHA_LIBIMAGEQUANT_CACHE_HIT: ${{ steps.cache-libimagequant.outputs.cache-hit }}
        GHA_LIBWEBP_CACHE_HIT: ${{ steps.cache-libwebp.outputs.cache-hit }}

    - name: Run CodSpeed benchmarks
      uses: CodSpeedHQ/action@f22792bfac16f3e14eb9fbea76f4a48e9cc22b93 # v4.19.1
      with:
        mode: simulation
        run: |
          python3 -m pip install -e . pytest-codspeed
          pytest -vv --codspeed Tests/benchmarks.py
