name: CI on: push: branches: ["master", "patch"] pull_request: branches: ["master", "patch"] workflow_dispatch: # to allow manual re-runs env: UV_VERSION: 0.4.16 jobs: linting: name: "Perform linting checks" runs-on: ubuntu-latest strategy: matrix: python-version: ["3.12"] steps: - name: "Checkout source files" uses: "actions/checkout@v4" - name: Setup environment uses: ./.github/actions/setup with: python-version: ${{ matrix.python-version }} cache-pre-commit: true uv-version: ${{ env.UV_VERSION }} uv-install-options: "--all-extras" - name: "Run pre-commit checks" run: | uv run pre-commit run --all-files --verbose tests: name: Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} needs: linting runs-on: ${{ matrix.os }} continue-on-error: ${{ startsWith(matrix.python-version, 'pypy') }} strategy: matrix: python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "pypy-3.9", "pypy-3.10"] os: [ubuntu-latest, macos-latest, windows-latest] extras: [false, true] exclude: - os: macos-latest extras: true - os: windows-latest extras: true - os: ubuntu-latest python-version: "pypy-3.9" extras: true - os: ubuntu-latest python-version: "pypy-3.10" extras: true - os: ubuntu-latest python-version: "3.9" extras: true - os: ubuntu-latest python-version: "3.10" extras: true # Exclude pypy on windows due to significant performance issues # running pytest requires ~12 min instead of 2 min on other platforms - os: windows-latest python-version: "pypy-3.9" - os: windows-latest python-version: "pypy-3.10" steps: - uses: "actions/checkout@v4" - name: Setup environment uses: ./.github/actions/setup with: python-version: ${{ matrix.python-version }} uv-version: ${{ env.UV_VERSION }} uv-install-options: ${{ matrix.extras == true && '--all-extras' || '' }} - name: "Run tests (no coverage)" if: ${{ startsWith(matrix.python-version, 'pypy') }} run: | uv run pytest -n auto - name: "Run tests (with coverage)" if: ${{ !startsWith(matrix.python-version, 'pypy') }} run: | uv run pytest -n auto --cov kasa --cov-report xml - name: "Upload coverage to Codecov" if: ${{ !startsWith(matrix.python-version, 'pypy') }} uses: "codecov/codecov-action@v4" with: token: ${{ secrets.CODECOV_TOKEN }}