name: Code Checks

on:
  push:
    branches:
      - main
      - 3.0.x
  pull_request:
    branches:
      - main
      - 3.0.x

env:
  ENV_FILE: environment.yml
  PANDAS_CI: 1

permissions: {}

# pre-commit run by https://pre-commit.ci/
jobs:
  docstring_typing_manual_hooks:
    name: Docstring validation, typing, and other manual pre-commit hooks
    runs-on: ubuntu-24.04
    permissions:
      contents: read
    defaults:
      run:
        shell: bash -el {0}

    concurrency:
      # https://github.community/t/concurrecy-not-work-for-push/183068/7
      group: ${{ github.event_name == 'push' && github.run_number || github.ref }}-code-checks
      cancel-in-progress: true

    steps:
    - name: Checkout
      uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      with:
        fetch-depth: 0

    - name: Set up Conda
      uses: ./.github/actions/setup-conda

    - name: Build Pandas
      id: build
      uses: ./.github/actions/build_pandas
      with:
        editable: false

    # The following checks are independent of each other and should still be run if one fails

    # TODO: The doctests have to be run first right now, since the Cython doctests only work
    # with pandas installed in non-editable mode
    # This can be removed once pytest-cython doesn't require C extensions to be installed inplace

    - name: Extra installs
      # https://pytest-qt.readthedocs.io/en/latest/troubleshooting.html#github-actions-azure-pipelines-travis-ci-and-gitlab-ci-cd
      run: sudo apt-get update && sudo apt-get install -y libegl1 libopengl0

    - name: Run doctests
      run: cd ci && ./code_checks.sh doctests
      if: ${{ steps.build.outcome == 'success' && always() }}

    - name: Install pandas in editable mode
      id: build-editable
      if: ${{ steps.build.outcome == 'success' && always() }}
      uses: ./.github/actions/build_pandas
      with:
        editable: true

    - name: Check for no warnings when building single-page docs
      run: ci/code_checks.sh single-docs
      if: ${{ steps.build.outcome == 'success' && always() }}

    - name: Run checks on imported code
      run: ci/code_checks.sh code
      if: ${{ steps.build.outcome == 'success' && always() }}

    - name: Run docstring validation
      run: ci/code_checks.sh docstrings
      if: ${{ steps.build.outcome == 'success' && always() }}

    - name: Run check of documentation notebooks
      run: ci/code_checks.sh notebooks
      if: ${{ steps.build.outcome == 'success' && always() }}

    - name: Use existing environment for type checking
      run: |
        echo $PATH >> $GITHUB_PATH
        echo "PYTHONHOME=$PYTHONHOME" >> $GITHUB_ENV
        echo "PYTHONPATH=$PYTHONPATH" >> $GITHUB_ENV
      if: ${{ steps.build.outcome == 'success' && always() }}

    - name: Typing
      uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
      with:
        extra_args: --verbose --hook-stage manual --all-files
      if: ${{ steps.build.outcome == 'success' && always() }}

    - name: Run docstring validation script tests
      run: pytest scripts
      if: ${{ steps.build.outcome == 'success' && always() }}

  asv-benchmarks:
    name: ASV Benchmarks
    runs-on: ubuntu-24.04
    permissions:
      contents: read
    defaults:
      run:
        shell: bash -el {0}

    concurrency:
      # https://github.community/t/concurrecy-not-work-for-push/183068/7
      group: ${{ github.event_name == 'push' && github.run_number || github.ref }}-asv-benchmarks
      cancel-in-progress: true

    steps:
    - name: Checkout
      uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      with:
        fetch-depth: 0

    - name: Set up Conda
      uses: ./.github/actions/setup-conda

    - name: Build Pandas
      id: build
      uses: ./.github/actions/build_pandas

    - name: Run ASV benchmarks
      run: |
        cd asv_bench
        asv machine --yes
        asv run --quick --dry-run --durations=30 --python=same --show-stderr

  requirements-dev-text-installable:
    name: Test install requirements-dev.txt
    runs-on: ubuntu-24.04
    permissions:
      contents: read

    concurrency:
      # https://github.community/t/concurrecy-not-work-for-push/183068/7
      group: ${{ github.event_name == 'push' && github.run_number || github.ref }}-requirements-dev-text-installable
      cancel-in-progress: true

    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        with:
          fetch-depth: 0

      - name: Setup Python
        id: setup_python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
        with:
          python-version: '3.11'
          cache: 'pip'
          cache-dependency-path: 'requirements-dev.txt'

      - name: Install requirements-dev.txt
        run: pip install -r requirements-dev.txt

      - name: Check Pip Cache Hit
        run: echo ${{ steps.setup_python.outputs.cache-hit }}
