name: Test invoke.py pip
on:
  push:
    branches:
      - 'main'
  pull_request:
    types:
      - 'ready_for_review'
      - 'opened'
      - 'synchronize'
  merge_group:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  matrix:
    if: github.event.pull_request.draft == false
    strategy:
      matrix:
        python-version:
          # - '3.9'
          - '3.10'
        pytorch:
          - linux-cuda-11_7
          - linux-rocm-5_2
          - linux-cpu
          - macos-default
          - windows-cpu
        include:
          - pytorch: linux-cuda-11_7
            os: ubuntu-22.04
            github-env: $GITHUB_ENV
          - pytorch: linux-rocm-5_2
            os: ubuntu-22.04
            extra-index-url: 'https://download.pytorch.org/whl/rocm5.2'
            github-env: $GITHUB_ENV
          - pytorch: linux-cpu
            os: ubuntu-22.04
            extra-index-url: 'https://download.pytorch.org/whl/cpu'
            github-env: $GITHUB_ENV
          - pytorch: macos-default
            os: macOS-12
            github-env: $GITHUB_ENV
          - pytorch: windows-cpu
            os: windows-2022
            github-env: $env:GITHUB_ENV
    name: ${{ matrix.pytorch }} on ${{ matrix.python-version }}
    runs-on: ${{ matrix.os }}
    env:
      PIP_USE_PEP517: '1'
    steps:
      - name: Checkout sources
        id: checkout-sources
        uses: actions/checkout@v3

      - name: Check for changed python files
        id: changed-files
        uses: tj-actions/changed-files@v37
        with:
          files_yaml: |
            python:
              - 'pyproject.toml'
              - 'invokeai/**'
              - '!invokeai/frontend/web/**'
              - 'tests/**'

      - name: set test prompt to main branch validation
        if: steps.changed-files.outputs.python_any_changed == 'true'
        run: echo "TEST_PROMPTS=tests/validate_pr_prompt.txt" >> ${{ matrix.github-env }}

      - name: setup python
        if: steps.changed-files.outputs.python_any_changed == 'true'
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
          cache: pip
          cache-dependency-path: pyproject.toml

      - name: install invokeai
        if: steps.changed-files.outputs.python_any_changed == 'true'
        env:
          PIP_EXTRA_INDEX_URL: ${{ matrix.extra-index-url }}
        run: >
          pip3 install
          --editable=".[test]"

      - name: run pytest
        if: steps.changed-files.outputs.python_any_changed == 'true'
        id: run-pytest
        run: pytest

      # - name: run invokeai-configure
      #   env:
      #     HUGGING_FACE_HUB_TOKEN: ${{ secrets.HUGGINGFACE_TOKEN }}
      #   run: >
      #     invokeai-configure
      #     --yes
      #     --default_only
      #     --full-precision
      #   # can't use fp16 weights without a GPU

      # - name: run invokeai
      #   id: run-invokeai
      #   env:
      #     # Set offline mode to make sure configure preloaded successfully.
      #     HF_HUB_OFFLINE: 1
      #     HF_DATASETS_OFFLINE: 1
      #     TRANSFORMERS_OFFLINE: 1
      #     INVOKEAI_OUTDIR: ${{ github.workspace }}/results
      #   run: >
      #     invokeai
      #     --no-patchmatch
      #     --no-nsfw_checker
      #     --precision=float32
      #     --always_use_cpu
      #     --use_memory_db
      #     --outdir ${{ env.INVOKEAI_OUTDIR }}/${{ matrix.python-version }}/${{ matrix.pytorch }}
      #     --from_file ${{ env.TEST_PROMPTS }}

      # - name: Archive results
      #   env:
      #     INVOKEAI_OUTDIR: ${{ github.workspace }}/results
      #   uses: actions/upload-artifact@v3
      #   with:
      #     name: results
      #     path: ${{ env.INVOKEAI_OUTDIR }}