name: Python package

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432
      mysql:
        image: mysql
        env:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: root
        options: >-
          --health-cmd "mysqladmin -uroot -proot ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 3306:3306
    env:
      PYTHONDEVMODE: 1
      DJANGO_DATABASE_HOST_POSTGRES: localhost
      DJANGO_DATABASE_USER_POSTGRES: postgres
      DJANGO_DATABASE_NAME_POSTGRES: postgres
      DJANGO_DATABASE_PASSWORD_POSTGRES: postgres
      DJANGO_DATABASE_HOST_MYSQL: 127.0.0.1
      DJANGO_DATABASE_USER_MYSQL: root
      DJANGO_DATABASE_NAME_MYSQL: root
      DJANGO_DATABASE_PASSWORD_MYSQL: root
    strategy:
      matrix:
        python-version: [3.6, 3.7, 3.8, 3.9, '3.10']
        django-version:
          - '>=4.0a1,<4.1'
          - '>=3.2,<4.0'
          - '>=3.1,<3.2'
          - '>=3.0,<3.1'
          - '>=2.2,<3.0'
          - '>=2.1,<2.2'
          - '>=2.0,<2.1'
        exclude:
          - python-version: 3.6
            django-version: '>=4.0a1,<4.1'
          - python-version: 3.7
            django-version: '>=4.0a1,<4.1'
          - python-version: '3.10'
            django-version: '>=3.2,<4.0'
          - python-version: '3.10'
            django-version: '>=3.1,<3.2'
          - python-version: '3.10'
            django-version: '>=3.0,<3.1'
          - python-version: '3.10'
            django-version: '>=2.2,<3.0'
          - python-version: '3.10'
            django-version: '>=2.1,<2.2'
          - python-version: '3.10'
            django-version: '>=2.0,<2.1'
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies (Django ${{ matrix.django-version }})
      run: |
        python -m pip install --upgrade pip
        python -m pip install --pre django'${{ matrix.django-version }}'
        python -m pip install flake8 coverage sphinx sphinx_rtd_theme 'psycopg2<2.9' mysqlclient -e .
    - name: Lint with flake8
      run: |
        flake8
    - name: Test with unittest
      run: |
        coverage run tests/manage.py test tests
        coverage report
    - name: Build docs
      run: |
        (cd docs && sphinx-build -n -W . _build)
