name: ci

on:
  push:
  pull_request:
    branches:
    - main

defaults:
  run:
    shell: bash

env:
  LANG: en_US.utf-8
  LC_ALL: en_US.utf-8
  PYTHONIOENCODING: UTF-8

jobs:

  quality:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Fetch all tags
      run: git fetch --depth=1 --tags

    - name: Set up PDM
      uses: pdm-project/setup-pdm@v3
      with:
        python-version: "3.8"

    - name: Resolving dependencies
      run: pdm lock -v --no-cross-platform -G ci-quality

    - name: Install dependencies
      run: pdm install -G ci-quality

    - name: Check if the documentation builds correctly
      run: pdm run duty check-docs

    - name: Check the code quality
      run: pdm run duty check-quality

    - name: Check if the code is correctly typed
      run: pdm run duty check-types

    - name: Check for vulnerabilities in dependencies
      run: pdm run duty check-dependencies

    - name: Check for breaking changes in the API
      run: pdm run duty check-api

  exclude-test-jobs:
    runs-on: ubuntu-latest
    outputs:
      jobs: ${{ steps.exclude-jobs.outputs.jobs }}
    steps:
    - id: exclude-jobs
      run: |
        if ${{ github.repository_owner == 'pawamoy-insiders' }}; then
          echo 'jobs=[
            {"os": "macos-latest"},
            {"os": "windows-latest"},
            {"python-version": "3.9"},
            {"python-version": "3.10"},
            {"python-version": "3.11"},
            {"python-version": "3.12"}
          ]' | tr -d '[:space:]' >> $GITHUB_OUTPUT
        else
          echo 'jobs=[]' >> $GITHUB_OUTPUT
        fi

  tests:

    needs: exclude-test-jobs
    strategy:
      max-parallel: 4
      matrix:
        os:
        - ubuntu-latest
        - macos-latest
        - windows-latest
        python-version:
        - "3.8"
        - "3.9"
        - "3.10"
        - "3.11"
        - "3.12"
        exclude: ${{ fromJSON(needs.exclude-test-jobs.outputs.jobs) }}
    runs-on: ${{ matrix.os }}
    continue-on-error: ${{ matrix.python-version == '3.12' }}

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Fetch all tags
      run: git fetch --depth=1 --tags

    - name: Set up PDM
      uses: pdm-project/setup-pdm@v3
      with:
        python-version: ${{ matrix.python-version }}
        allow-python-prereleases: true

    - name: Resolving dependencies
      run: pdm lock -v --no-cross-platform -G ci-tests

    - name: Install dependencies
      run: pdm install --no-editable -G ci-tests

    - name: Run the test suite
      run: pdm run duty test
