pytest-language-server 0.22.0

A blazingly fast Language Server Protocol implementation for pytest
Documentation
name: CI

on:
  push:
    branches: [master, main]
  pull_request:
    branches: [master, main]

permissions:
  contents: read

env:
  CARGO_TERM_COLOR: always
  RUST_BACKTRACE: 1

jobs:
  test:
    name: Test
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        rust: [stable]
    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          components: rustfmt, clippy

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: "ci-${{ matrix.os }}"

      - name: Check formatting
        run: cargo fmt -- --check

      - name: Run clippy
        run: cargo clippy --all-targets --all-features -- -D warnings

      - name: Build
        run: cargo build --release --verbose

      - name: Build binary for tests
        run: cargo build


      - name: Run tests
        run: cargo test --verbose

  coverage:
    name: Code Coverage
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: "coverage"

      - name: Install tarpaulin
        run: cargo install cargo-tarpaulin

      - name: Build binary for tests
        run: cargo build


      - name: Generate coverage report
        run: cargo tarpaulin --out Xml --skip-clean

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v6
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: cobertura.xml
          fail_ci_if_error: false

  check-msrv:
    name: Check MSRV
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.85.0

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: "msrv"

      - name: Check build
        run: cargo check --all-features

  check-vscode-extension:
    name: Check VSCode Extension
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-node@v6
        with:
          node-version: '20'

      - name: Install dependencies
        run: |
          cd extensions/vscode-extension
          npm install
          npm install -g @vscode/vsce

      - name: Lint
        run: |
          cd extensions/vscode-extension
          npm run lint

      - name: Compile TypeScript
        run: |
          cd extensions/vscode-extension
          npm run compile

      - name: Package extension (dry-run)
        run: |
          cd extensions/vscode-extension
          mkdir -p bin
          touch bin/pytest-language-server-x86_64-unknown-linux-gnu
          vsce package --skip-license

  check-intellij-plugin:
    name: Check IntelliJ Plugin
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-java@v5
        with:
          distribution: 'temurin'
          java-version: '21'

      - name: Cache Gradle
        uses: actions/cache@v5
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: gradle-${{ hashFiles('extensions/intellij-plugin/**/*.gradle*', 'extensions/intellij-plugin/**/gradle-wrapper.properties') }}
          restore-keys: gradle-

      - name: Build plugin
        run: |
          cd extensions/intellij-plugin
          chmod +x gradlew
          ./gradlew buildPlugin --no-daemon

      - name: Verify plugin structure
        run: |
          cd extensions/intellij-plugin
          ls -la build/distributions/
          # Verify ZIP was created
          test -f build/distributions/pytest-language-server-*.zip

  check-zed-extension:
    name: Check Zed Extension
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-wasip1

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: "zed-extension"
          workspaces: "extensions/zed-extension -> target"

      - name: Check Zed extension compiles
        run: |
          cd extensions/zed-extension
          cargo check --target wasm32-wasip1

      - name: Validate extension.toml
        run: |
          cd extensions/zed-extension
          # Basic validation that required fields exist
          grep -q "^id = " extension.toml
          grep -q "^name = " extension.toml
          grep -q "^version = " extension.toml
          grep -q "^schema_version = " extension.toml
          echo "extension.toml validation passed"

  check-homebrew-formula:
    name: Check Homebrew Formula
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v6

      - name: Validate formula syntax
        run: brew style Formula/pytest-language-server.rb

      - name: Verify formula has valid checksums
        run: |
          # Check that formula doesn't have placeholder checksums
          if grep -q "REPLACE_WITH" Formula/pytest-language-server.rb; then
            echo "❌ Formula contains placeholder checksums"
            exit 1
          fi
          echo "✅ Formula checksums look valid"