name: Continuous Integration

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

env:
  PYTHON_DEFAULT_VERSION: "3.12"

jobs:
  lint:
    timeout-minutes: 30
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: codespell-project/actions-codespell@2391250ab05295bddd51e36a8c6295edb6343b0e
        with:
          ignore_words_list: datas re-use
      - name: Set up Python ${{ env.PYTHON_DEFAULT_VERSION }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ env.PYTHON_DEFAULT_VERSION }}
          cache: "pip"
      - name: Install dependencies
        run: python -m pip install --upgrade nox pdm
      - name: Run linters
        run: nox -vs lint
      - name: Validate new changelog entries
        if: (contains(github.event.pull_request.labels.*.name, '-changelog') == false) && (github.event.pull_request.base.ref != '')
        run: if [ -z "$(git diff --diff-filter=A --name-only origin/${{ github.event.pull_request.base.ref }} changelog.d)" ];
          then echo no changelog item added; exit 1; fi
      - name: Changelog validation
        run: nox -vs towncrier_check
  build:
    timeout-minutes: 30
    needs: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Set up Python ${{ env.PYTHON_DEFAULT_VERSION }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ env.PYTHON_DEFAULT_VERSION }}
          cache: "pip"
      - name: Install dependencies
        run: python -m pip install --upgrade nox pdm
      - name: Build the distribution
        run: nox -vs build
  cleanup_buckets:
    timeout-minutes: 30
    needs: lint
    env:
      B2_TEST_APPLICATION_KEY: ${{ secrets.B2_TEST_APPLICATION_KEY }}
      B2_TEST_APPLICATION_KEY_ID: ${{ secrets.B2_TEST_APPLICATION_KEY_ID }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        if: ${{ env.B2_TEST_APPLICATION_KEY != '' && env.B2_TEST_APPLICATION_KEY_ID != '' }}  # TODO: skip this whole job instead
        with:
          fetch-depth: 0
      - name: Set up Python ${{ env.PYTHON_DEFAULT_VERSION }}
        if: ${{ env.B2_TEST_APPLICATION_KEY != '' && env.B2_TEST_APPLICATION_KEY_ID != '' }}  # TODO: skip this whole job instead
        uses: actions/setup-python@v6
        with:
          python-version: ${{ env.PYTHON_DEFAULT_VERSION }}
          cache: "pip"
      - name: Install dependencies
        if: ${{ env.B2_TEST_APPLICATION_KEY != '' && env.B2_TEST_APPLICATION_KEY_ID != '' }}  # TODO: skip this whole job instead
        run: python -m pip install --upgrade nox pdm
      - name: Find and remove old buckets
        if: ${{ env.B2_TEST_APPLICATION_KEY != '' && env.B2_TEST_APPLICATION_KEY_ID != '' }}  # TODO: skip this whole job instead
        run: nox -vs cleanup_old_buckets
  test:
    timeout-minutes: 90
    needs: cleanup_buckets
    env:
      B2_TEST_APPLICATION_KEY: ${{ secrets.B2_TEST_APPLICATION_KEY }}
      B2_TEST_APPLICATION_KEY_ID: ${{ secrets.B2_TEST_APPLICATION_KEY_ID }}
      NOX_EXTRAS: ${{ matrix.extras }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: ["ubuntu-latest", "macos-latest", "windows-latest"]
        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "pypy3.9", "pypy3.10"]
        extras: [ "" ]
        exclude:
          - os: "macos-latest"
            python-version: "pypy3.10"
          - os: "windows-latest"
            python-version: "pypy3.10"
        include:
          - python-version: "3.12"
            extras: "full"
            os: "ubuntu-latest"
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}
          cache: "pip"
      - name: Install dependencies
        run: python -m pip install --upgrade nox pdm
      - name: Run unit tests
        run: nox -vs unit -- -v
      - name: Run integration tests
        if: ${{ env.B2_TEST_APPLICATION_KEY != '' && env.B2_TEST_APPLICATION_KEY_ID != '' }}
        run: nox -vs integration -- --dont-cleanup-old-buckets -v
  doc:
    timeout-minutes: 30
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Set up Python ${{ env.PYTHON_DEFAULT_VERSION }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ env.PYTHON_DEFAULT_VERSION }}
          cache: "pip"
      - name: Install dependencies
        env:
          DEBIAN_FRONTEND: noninteractive
        run: |
          sudo apt-get update -y
          sudo apt-get install -y graphviz plantuml
          python -m pip install --upgrade nox pdm
      - name: Build the docs
        run: nox --non-interactive -vs doc
