name: Test

on:
  push:
    branches: [ master ]
  pull_request:
  #  branches: [ master ]
  release:
    types: [published]

jobs:
  build-wheel:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.14'

    - name: Build the wheel
      run: |
        python -m pip install --group dev
        python -m build

    - name: Upload wheel
      uses: actions/upload-artifact@v4
      with:
        name: wheel
        path: dist/*.whl

    - name: Run the tests
      run: |
        pytest -v

    - name: Build the docs
      run: |
        make -j 4 -C doc/sphinx SPHINXOPTS="-W --keep-going" html

  # Test the wheel on different platforms
  test:
    runs-on: ${{ matrix.cfg.os }}
    needs: build-wheel

    strategy:
      matrix:
        cfg:
          #- { os: ubuntu-20.04, py: '3.6' }
          - { os: ubuntu-latest, py: '3.10' }
          - { os: ubuntu-latest, py: '3.14', doc: 1 }
          - { os: windows-latest, py: '3.14' }
          - { os: macos-latest, py: '3.14' }
      fail-fast: false

    steps:
    - uses: actions/checkout@v4

    - name: Set up Python ${{ matrix.cfg.py }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.cfg.py }}

    - name: Download the wheel
      uses: actions/download-artifact@v4
      with:
        name: wheel
        path: dist

    - name: Install the wheel
      run: python -m pip install dist/periodictable*.whl
      shell: bash

    # uncertainties and matplotlib are optional packages, but they are needed for mypy tests
    - name: Install test dependencies
      run: |
        python -m pip install --group test

    # Use --pyargs --import-mode=append to target the installed package.
    # Change into the test directory to test the wheel so that the
    # source directory is not on the path. We are running coverage tests
    # because it shows that it is indeed the installed package that is tested.
    # The mypy plugin fails when testing the installed package. Since there is no
    # way to turn the option off, so we instead erase the addopts configuration
    # and put them explicitly on the pytest command line below without --mypy.
    - name: Test wheel with pytest
      run: |
        cd test
        pytest -v --pyargs --import-mode=append periodictable --override-ini addopts= --doctest-modules --doctest-glob=*.rst --cov=periodictable . ../doc/sphinx/guide

  # Upload wheel to PyPI only when a tag is pushed, and its name begins with 'v'
  upload-to-pypi:
    runs-on: ubuntu-latest
    environment: release
    needs: test
    if: startsWith(github.ref, 'refs/tags/v')
    permissions:
      id-token: write
    steps:

    - name: Download wheel
      uses: actions/download-artifact@v4
      with:
        name: wheel
        path: dist

    - name: Publish package distributions to PyPI
      uses: pypa/gh-action-pypi-publish@release/v1
