drizzle 0.1.5

A type-safe SQL query builder for Rust
Documentation
name: CI

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

env:
  CARGO_TERM_COLOR: always
  RUST_BACKTRACE: 1

jobs:
  # Skip CI for release-plz PRs (version bumps only, already tested)
  check-skip:
    name: Check Skip
    runs-on: ubuntu-latest
    outputs:
      should_skip: ${{ steps.check.outputs.should_skip }}
    steps:
      - name: Check if release PR
        id: check
        env:
          COMMIT_MSG: ${{ github.event.head_commit.message }}
        run: |
          if [[ "${{ github.actor }}" == "github-actions[bot]" ]] || \
             [[ "$COMMIT_MSG" == chore:\ release* ]]; then
            echo "should_skip=true" >> $GITHUB_OUTPUT
            echo "Skipping CI for release PR/commit"
          else
            echo "should_skip=false" >> $GITHUB_OUTPUT
          fi

  lint:
    name: Lint
    needs: check-skip
    if: needs.check-skip.outputs.should_skip != 'true'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust
        uses: dtolnay/rust-toolchain@nightly
        with:
          components: rustfmt, clippy

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: nightly
          save-if: ${{ github.ref == 'refs/heads/main' }}

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

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

  test:
    name: Test
    runs-on: ubuntu-latest
    needs: [check-skip, lint]
    if: needs.check-skip.outputs.should_skip != 'true'
    steps:
      - uses: actions/checkout@v4

      - name: Get Rust version
        id: rust-version
        run: |
          RUST_VERSION=$(grep '^rust-version = ' Cargo.toml | sed 's/rust-version = "\(.*\)"/\1/')
          echo "version=$RUST_VERSION" >> $GITHUB_OUTPUT

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: ${{ steps.rust-version.outputs.version }}

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: msrv
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Start Postgres
        run: |
          docker compose up -d postgres
          sleep 5

      - name: Run tests
        run: cargo test --workspace --features "rusqlite,libsql,postgres-sync,uuid,serde" -- --test-threads=1

      - name: Run example
        run: cargo run --example rusqlite --features "rusqlite,uuid,serde"

      - name: Stop Postgres
        run: docker compose down

  test-turso:
    name: Test (Turso - Experimental)
    runs-on: ubuntu-latest
    needs: [check-skip, lint]
    if: needs.check-skip.outputs.should_skip != 'true'
    continue-on-error: true
    steps:
      - uses: actions/checkout@v4

      - name: Get Rust version
        id: rust-version
        run: |
          RUST_VERSION=$(grep '^rust-version = ' Cargo.toml | sed 's/rust-version = "\(.*\)"/\1/')
          echo "version=$RUST_VERSION" >> $GITHUB_OUTPUT

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: ${{ steps.rust-version.outputs.version }}

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: msrv
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Run tests
        id: test
        run: |
          mkdir -p test-output
          cargo test --workspace --features "turso,uuid,serde" -- --test-threads=1 2>&1 | tee test-output/output.txt || true

          if grep -q "FAILED" test-output/output.txt; then
            echo "has_failures=true" >> $GITHUB_OUTPUT
            echo "::warning::Turso tests failed (expected - turso is experimental)"
          else
            echo "has_failures=false" >> $GITHUB_OUTPUT
            echo "::notice::Turso tests passed"
          fi

      - name: Upload failure logs
        if: steps.test.outputs.has_failures == 'true'
        uses: actions/upload-artifact@v4
        with:
          name: turso-test-logs
          path: test-output/output.txt
          retention-days: 7

  docs:
    name: Documentation
    runs-on: ubuntu-latest
    needs: [check-skip, lint]
    if: needs.check-skip.outputs.should_skip != 'true'
    steps:
      - uses: actions/checkout@v4

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

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: stable
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Check documentation
        run: cargo doc --all-features --no-deps

  build-matrix:
    name: Build (${{ matrix.rust }})
    runs-on: ubuntu-latest
    needs: [check-skip, lint]
    if: needs.check-skip.outputs.should_skip != 'true'
    strategy:
      matrix:
        rust: [stable, nightly]

    steps:
      - uses: actions/checkout@v4

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

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: ${{ matrix.rust }}
          save-if: ${{ github.ref == 'refs/heads/main' }}

      - name: Build
        run: cargo build --all-features

  msrv:
    name: MSRV Check
    runs-on: ubuntu-latest
    needs: [check-skip, lint]
    if: needs.check-skip.outputs.should_skip != 'true'
    steps:
      - uses: actions/checkout@v4

      - name: Get Rust version
        id: rust-version
        run: |
          RUST_VERSION=$(grep '^rust-version = ' Cargo.toml | sed 's/rust-version = "\(.*\)"/\1/')
          echo "version=$RUST_VERSION" >> $GITHUB_OUTPUT

      - name: Install Rust (MSRV)
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ steps.rust-version.outputs.version }}

      - name: Cache Rust dependencies
        uses: Swatinem/rust-cache@v2
        with:
          shared-key: msrv
          save-if: ${{ github.ref == 'refs/heads/main' }}

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