# 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 .[arrays,test]
    - name: Test source code and docs
      run: |
        cd tests
        python -m pytest --cov=uncertainties --cov=. --cov-report=xml --cov-report=term
    - name: Upload coverage reports to Codecov
      uses: codecov/codecov-action@v4.0.1
      with:
        token: ${{ secrets.CODECOV_TOKEN }}
        slug: lmfit/uncertainties
  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]
    steps:
      - run: exit 1
        if: >-
          ${{
               contains(needs.*.result, 'failure')
            || contains(needs.*.result, 'cancelled')
            || contains(needs.*.result, 'skipped')
          }}
