---
name: CI

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]
  workflow_dispatch:

env:
  FORCE_COLOR: "1"  # Make tools pretty.
  TOX_TESTENV_PASSENV: FORCE_COLOR
  PYTHON_LATEST: "3.10"


jobs:
  tests:
    name: tox on ${{ matrix.python-version }}
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        python-version: ["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "pypy-2.7", "pypy-3.7", "pypy-3.8"]

    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}

      - name: "Install dependencies"
        run: |
          python -VV
          python -m site
          python -m pip install --upgrade pip setuptools wheel
          python -m pip install --upgrade virtualenv tox tox-gh-actions

      - run: "python -m tox"

      - name: Upload coverage data
        uses: "actions/upload-artifact@v2"
        with:
          name: coverage-data
          path: ".coverage.*"
          if-no-files-found: ignore


  coverage:
    runs-on: ubuntu-latest
    needs: tests

    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          # Use latest Python, so it understands all syntax.
          python-version: ${{env.PYTHON_LATEST}}

      - run: python -m pip install --upgrade coverage[toml]

      - name: Download coverage data
        uses: actions/download-artifact@v2
        with:
          name: coverage-data

      - name: Combine coverage and fail if it's <100%.
        run: |
          python -m coverage combine
          python -m coverage html --skip-covered --skip-empty
          python -m coverage report --fail-under=100

      - name: Upload HTML report if check failed.
        uses: actions/upload-artifact@v2
        with:
          name: html-report
          path: htmlcov
        if: ${{ failure() }}


  package:
    name: Build & verify package
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: ${{env.PYTHON_LATEST}}

      - run: python -m pip install build twine check-wheel-contents
      - run: python -m build --sdist --wheel .
      - run: ls -l dist
      - run: check-wheel-contents dist/*.whl
      - name: Check long_description
        run: python -m twine check dist/*


  install-dev:
    name: Verify dev env
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: ["ubuntu-latest", "windows-latest"]

    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: ${{env.PYTHON_LATEST}}
      - run: python -m pip install -e .[dev]
      - run: python -c 'import attr; print(attr.__version__)'
