name: CI
on:
  push:
    branches:
      - main
  pull_request:
  schedule:
    - cron: "17 3 * * 0"

defaults:
  run:
    # required by https://github.com/snok/install-poetry#windows
    shell: bash

jobs:
  lint:
    name: Lint and typecheck Python
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.x'
      - name: Install Poetry
        uses: snok/install-poetry@v1.3.4
        with:
          version: "1.8.2"
          virtualenvs-create: true

      #- name: Cache python dependencies
      #  uses: actions/cache@v2
      #  id: cache
      #  with:
      #    path: ~/.cache/pypoetry
      #    key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }}
      #    restore-keys: |
      #      poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }}
      - name: Install Dependencies
        run: poetry install
      #  if: steps.cache.outputs.cache-hit != 'true'
      - name: "Ruff"
        run: |
          poetry run ruff check
      - name: "Mypy"
        run: poetry run mypy relate course
      - name: "Safety"
        run: bash ./.ci/run-safety.sh
      - name: "Sphinx"
        run: |
            cp local_settings_example.py local_settings.py
            (cd doc; poetry run make html SPHINXOPTS="-W --keep-going -n")

  frontend:
    name: Lint JS/build frontend (Node ${{ matrix.node-version }})
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: ['16', '18', '20']
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
          node-version: ${{ matrix.node-version }}
    - name: Install
      run: npm install

    - name: ESLint
      run: npx eslint relate/static/js/*.js

    - name: Rollup build
      run: npm run build

  pytest:
    name: Python ${{ matrix.python-version }} - ${{ matrix.suite }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.8', '3.9', '3.x']
        suite: ['base', 'postgres', 'expensive']
    services:
        postgres:
          image: postgres
          env:
              POSTGRES_PASSWORD: relatepgpass
              POSTGRES_DB: test_relate
          options: >-
              --health-cmd pg_isready
              --health-interval 10s
              --health-timeout 5s
              --health-retries 5
          ports:
              - 5432:5432
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install Poetry
        uses: snok/install-poetry@v1.3.4
        with:
          version: "1.8.2"
          virtualenvs-create: true

      #- name: Cache python dependencies
      #  uses: actions/cache@v2
      #  id: cache
      #  with:
      #    path: ~/.cache/pypoetry
      #    key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }}
      #    restore-keys: |
      #      poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }}
      - name: Install Dependencies
        run: poetry install
      #  if: steps.cache.outputs.cache-hit != 'true'
      - name: Install OS dependencies
        env:
          DEBIAN_FRONTEND: noninteractive
        run: |
          sudo apt-get install gettext
      - name: Run test suite
        env:
          RL_CI_TEST: ${{ matrix.suite }}
        run: |
          bash ./.ci/run-tests-for-ci.sh
      - name: Test command line tool
        if: matrix.suite == 'base'
        run: |
          git clone https://github.com/inducer/relate-sample
          cd relate-sample

          poetry run relate validate .
          poetry run relate test-code questions/autograded-python-example.yml
          poetry run relate expand-yaml flows/quiz-test.yml > /dev/null

  pytest-windows:
    name: Python - Windows
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          # Pinned to 3.11 because of poetry issues with missing setuptools
          # https://github.com/python-poetry/poetry/issues/7611#issuecomment-1793850783
          python-version: '3.11'
      - name: Install Poetry
        uses: snok/install-poetry@v1.3.4
        with:
          version: "1.8.2"
          virtualenvs-create: true
      - name: Configure Poetry
        run: |
          poetry config virtualenvs.in-project true
      - name: Install Dependencies
        env:
          SETUPTOOLS_USE_DISTUTILS: stdlib
        run: |
          # work around
          # https://github.com/python-poetry/poetry/issues/7611#issuecomment-1747836233
          # can be removed when
          # https://github.com/python-poetry/poetry/pull/8517
          # is merged and released
          poetry config installer.max-workers 1
          poetry install
      - name: Run test suite
        env:
          RELATE_LOCAL_TEST_SETTINGS: "local_settings_example.py"
        run: |
          poetry run pytest -rxsw --cov-config=setup.cfg --cov-report=xml --cov=. --tb=native

# vim: sw=2
