# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

name: Bindings Python CI

on:
  push:
    branches:
      - main
  pull_request:
    paths:
      - '**'                                       # Include all files and directories in the repository by default.
      - '!.github/ISSUE_TEMPLATE/**'               # Exclude files and directories that don't impact tests or code like templates, metadata, and documentation.
      - '!scripts/**'
      - '!website/**'
      - '!.asf.yml'
      - '!.gitattributes'
      - '!.gitignore'
      - '!CONTRIBUTING.md'
      - '!CHANGELOG.md'
      - '!LICENSE'
      - '!NOTICE'
      - '!README.md'

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  check-rust:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        with:
          persist-credentials: false
      - name: Check format
        working-directory: "bindings/python"
        run: cargo fmt --all -- --check
      - name: Check clippy
        working-directory: "bindings/python"
        run: cargo clippy --all-targets --all-features -- -D warnings

  check-python:
    runs-on: ubuntu-slim
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        with:
          persist-credentials: false
      - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1
        with:
          version: "0.9.3"
          enable-cache: true
      - name: Install tools
        run: |
          uv tool install ruff
      - name: Check format
        working-directory: "bindings/python"
        run: |
          uvx ruff format . --diff
      - name: Check style
        working-directory: "bindings/python"
        run: |
          uvx ruff check .

  test:
    runs-on: ${{ matrix.os }}
    strategy:
      max-parallel: 15
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          - windows-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        with:
          persist-credentials: false
      - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
        with:
          python-version: 3.12
      - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1
        with:
          working-directory: "bindings/python"
          command: build
          args: --out dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one
      - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1
        with:
          version: "0.9.3"
          enable-cache: true
      - name: Sync dependencies
        working-directory: "bindings/python"
        shell: bash
        run: |
          make install
      - name: Install built wheel
        working-directory: "bindings/python"
        shell: bash
        run: |
          uv pip install --reinstall dist/pyiceberg_core-*.whl
      - name: Run tests
        working-directory: "bindings/python"
        shell: bash
        run: |
          make test
