name: Test concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true on: push: branches: [main] tags: [v*] pull_request: workflow_dispatch: schedule: - cron: "0 0 * * 0" # run weekly jobs: test: name: ${{ matrix.os }} (${{ matrix.python-version }}) ${{ matrix.add-extra || '' }} ${{ matrix.resolution || ''}} runs-on: ${{ matrix.os }} env: UV_PRERELEASE: ${{ github.event_name == 'schedule' && 'allow' || 'if-necessary-or-explicit' }} UV_NO_SYNC: 1 UV_MANAGED_PYTHON: 1 strategy: fail-fast: false matrix: python-version: ["3.9", "3.13"] os: [ubuntu-latest, macos-latest, windows-latest] add-extra: [pyqt6, pyside6] include: - os: windows-latest python-version: "3.11" resolution: "lowest-direct" add-extra: pyside6 - os: macos-latest python-version: "3.12" resolution: "lowest-direct" add-extra: pyqt6 - python-version: "3.9" os: ubuntu-latest add-extra: pyqt5 - python-version: "3.9" os: ubuntu-latest add-extra: pyside2 - python-version: "3.11" os: windows-latest add-extra: pyqt5 - python-version: "3.10" os: ubuntu-latest add-extra: pyside2 - python-version: "3.12" os: ubuntu-latest add-extra: pyqt6 - python-version: "3.12" os: ubuntu-latest add-extra: pyside6 steps: - uses: actions/checkout@v4 with: fetch-depth: 0 fetch-tags: true - name: ๐Ÿ Set up Python ${{ matrix.python-version }} uses: astral-sh/setup-uv@v7 with: python-version: ${{ matrix.python-version }} enable-cache: true cache-dependency-glob: "**/pyproject.toml" - uses: pyvista/setup-headless-display-action@v4 with: qt: true - name: Install Dependencies run: uv sync --no-dev --group test --extra ${{ matrix.add-extra }} --resolution ${{ matrix.resolution || 'highest'}} - name: ๐Ÿงช Run Tests run: uv run coverage run -p -m pytest -v # If something goes wrong with --pre tests, we can open an issue in the repo - name: ๐Ÿ“ Report --pre Failures if: failure() && github.event_name == 'schedule' uses: JasonEtco/create-an-issue@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PLATFORM: ${{ matrix.os }} PYTHON: ${{ matrix.python-version }} RUN_ID: ${{ github.run_id }} TITLE: "[test-bot] pip install --pre is failing" with: filename: .github/TEST_FAIL_TEMPLATE.md update_existing: true - name: Upload coverage uses: actions/upload-artifact@v4 with: name: covreport-${{ matrix.os }}-py${{ matrix.python-version }}-${{ matrix.add-extra }}-${{ matrix.resolution }} path: ./.coverage* include-hidden-files: true upload_coverage: if: always() needs: [test] uses: pyapp-kit/workflows/.github/workflows/upload-coverage.yml@v2 secrets: inherit test_napari: uses: pyapp-kit/workflows/.github/workflows/test-dependents.yml@v2 with: dependency-repo: napari/napari dependency-extras: "testing" qt: ${{ matrix.qt }} pytest-args: 'src/napari/_qt --import-mode=importlib -k "not async and not qt_dims_2 and not qt_viewer_console_focus and not keybinding_editor and not preferences_dialog_not_dismissed"' python-version: "3.10" # napari hasn't pinned pytest-qt, but still requires pyside2 tests post-install-cmd: "pip install lxml_html_clean pytest-qt==4.4.0" strategy: fail-fast: false matrix: qt: ["pyqt5", "pyside2"] check-manifest: name: Check Manifest runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: pipx run check-manifest build-and-inspect-package: name: Build & inspect package. needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: hynek/build-and-inspect-python-package@v2 upload-to-pypi: if: success() && startsWith(github.ref, 'refs/tags/') && github.event_name != 'schedule' && github.repository == 'pyapp-kit/superqt' name: Upload package to PyPI needs: build-and-inspect-package runs-on: ubuntu-latest permissions: id-token: write contents: write steps: - name: Download built artifact to dist/ uses: actions/download-artifact@v5 with: name: Packages path: dist - name: ๐Ÿšข Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 - uses: softprops/action-gh-release@v2 with: generate_release_notes: true files: "./dist/*"