# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python

name: Python package

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

jobs:
  build:
    name: Tests
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
        os: ["ubuntu-latest", "windows-latest", "macos-latest"]
    runs-on: ${{ matrix.os }}

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install .[all]
    - name: Test source code and docs
      run: |
        python -m pytest tests/ doc/ uncertainties/ --cov=uncertainties --cov-report=xml --cov-report=term --doctest-modules --doctest-glob="*.rst"
    - name: Upload coverage reports to Codecov
      uses: codecov/codecov-action@v4.6.0
      with:
        flags: ${{ matrix.os }}-${{ matrix.python-version }}
      env:
        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
    - name: Benchmarking upload to Codspeed
      if: matrix.python-version == '3.12' && matrix.os == 'ubuntu-latest'
      uses: CodSpeedHQ/action@v3
      with:
        run: |
          cd tests
          python -m pytest --codspeed
        token: ${{ secrets.CODSPEED_TOKEN }}
  test_without_numpy:
    name: Test without numpy
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: 3.12
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        python -m pip install .[test]
    - name: Test source code and docs
      run:
        cd tests;
        python -m pytest --ignore=test_unumpy.py --ignore=test_ulinalg.py -k "not test_monte_carlo_comparison"
          --cov=uncertainties --cov=. --cov-report=xml --cov-report=term
    - name: Upload coverage reports to Codecov
      uses: codecov/codecov-action@v4.6.0
      with:
        flags: no-numpy
      env:
        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
  results:
    # This step aggregates the results from all the tests and allows us to
    # require only this single job to pass for a PR to be merged rather than
    # requiring each job in the matrix separately.
    # See https://github.com/orgs/community/discussions/26822?sort=old#discussioncomment-8285141
    if: ${{ always() }}
    runs-on: ubuntu-latest
    name: Final Results
    needs: [build,test_without_numpy]
    steps:
      - run: exit 1
        if: >-
          ${{
               contains(needs.*.result, 'failure')
            || contains(needs.*.result, 'cancelled')
            || contains(needs.*.result, 'skipped')
          }}
