name: lint

on:
  workflow_call:
    inputs:
      working-directory:
        required: true
        type: string
        description: "From which folder this pipeline executes"

permissions:
  contents: read

env:
  # This env var allows us to get inline annotations when ruff has complaints.
  RUFF_OUTPUT_FORMAT: github

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        # Only lint on the min and max supported Python versions.
        # It's extremely unlikely that there's a lint issue on any version in between
        # that doesn't show up on the min or max versions.
        #
        # GitHub rate-limits how many jobs can be running at any one time.
        # Starting new jobs is also relatively slow,
        # so linting on fewer versions makes CI faster.
        python-version:
          - "3.12"
    name: "lint #${{ matrix.python-version }}"
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Get changed files
        id: changed-files
        if: github.event_name != 'workflow_dispatch'
        uses: Ana06/get-changed-files@25f79e676e7ea1868813e21465014798211fad8c # v2.3.0
        with:
          filter: "${{ inputs.working-directory }}/**"
      - name: Set up Python ${{ matrix.python-version }}
        if: steps.changed-files.outputs.all || github.event_name == 'workflow_dispatch'
        uses: ./.github/actions/uv_setup
        with:
          python-version: ${{ matrix.python-version }}
          cache-suffix: lint-${{ inputs.working-directory }}
          working-directory: ${{ inputs.working-directory }}

      - name: Install dependencies
        if: steps.changed-files.outputs.all || github.event_name == 'workflow_dispatch'
        working-directory: ${{ inputs.working-directory }}
        run: uv sync --frozen --group lint

      - name: Analysing package code with our lint
        if: steps.changed-files.outputs.all || github.event_name == 'workflow_dispatch'
        working-directory: ${{ inputs.working-directory }}
        run: |
          if make lint_package > /dev/null 2>&1; then
            make lint_package
          else
            echo "lint_package command not found, using lint instead"
            make lint
          fi

      - name: Install test dependencies
        if: steps.changed-files.outputs.all || github.event_name == 'workflow_dispatch'
        working-directory: ${{ inputs.working-directory }}
        run: uv sync --group lint

      - name: Analysing tests with our lint
        if: steps.changed-files.outputs.all || github.event_name == 'workflow_dispatch'
        working-directory: ${{ inputs.working-directory }}
        run: |
          if make lint_tests > /dev/null 2>&1; then
            make lint_tests
          else
            echo "lint_tests command not found, skipping step"
          fi
