mpatch 1.6.0

A smart, context-aware patch tool that applies diffs using fuzzy matching, ideal for AI-generated code.
Documentation
name: Python CI

on:
  push:
    branches: [ main ]
    paths:
      - 'bindings/python/**'
      - 'src/**'
      - 'Cargo.toml'
      - 'Cargo.lock'
      - '.github/workflows/python-ci.yml'
  pull_request:
    branches: [ main ]
    paths:
      - 'bindings/python/**'
      - 'src/**'
      - 'Cargo.toml'
      - 'Cargo.lock'
      - '.github/workflows/python-ci.yml'

permissions:
  contents: read

env:
  CARGO_TERM_COLOR: always
  RUST_BACKTRACE: 1

jobs:
  lint:
    name: Code Quality (Ruff)
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.12'

      - name: Install Ruff
        run: pip install ruff

      - name: Check formatting
        working-directory: bindings/python
        run: ruff format --check .

      - name: Run linter
        working-directory: bindings/python
        run: ruff check .

  test:
    name: Test (${{ matrix.os }} / Py ${{ matrix.python-version }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        python-version: ['3.8', '3.10', '3.12', '3.13', '3.13t']
        exclude:
          - os: macos-latest
            python-version: '3.8'

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable
          cache: true

      - name: Setup Python ${{ matrix.python-version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}
          cache: 'pip'

      - name: Build Extension and Install Dependencies
        working-directory: bindings/python
        shell: bash
        run: pip install -e ".[test]"

      - name: Run Pytest
        working-directory: bindings/python
        shell: bash
        run: pytest -v --color=yes --junitxml=junit.xml

      - name: Upload Test Results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-results-python-${{ matrix.os }}-${{ matrix.python-version }}
          path: bindings/python/junit.xml
          if-no-files-found: ignore