name: CI

on:
  push:
    branches: [master, v0.*]
  pull_request:
    branches: master
  schedule:
    - cron:  '0 6 * * 1,4' # Each Monday and Thursday at 06:00 UTC
  workflow_dispatch:

permissions:
  contents: read

env:
  NB_KERNEL: python
  MPLBACKEND: Agg
  SEABORN_DATA: ${{ github.workspace }}/seaborn-data
  PYDEVD_DISABLE_FILE_VALIDATION: 1

jobs:
  build-docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - name: Setup Python 3.11
        uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0
        with:
          python-version: "3.11"

      - name: Install seaborn
        run: |
          pip install --upgrade pip
          pip install .[stats,docs]

      - name: Install pandoc
        run: |
          wget https://github.com/jgm/pandoc/releases/download/3.1.11/pandoc-3.1.11-1-amd64.deb
          sudo dpkg -i pandoc-3.1.11-1-amd64.deb

      - name: Cache datasets
        run: |
          git clone https://github.com/mwaskom/seaborn-data.git
          ls $SEABORN_DATA

      - name: Build docs
        env:
          SPHINXOPTS: -j `nproc`
        run: |
          cd doc
          make -j `nproc` notebooks
          make html


  run-tests:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
        install: [full]
        deps: [latest]

        include:
          - python: "3.10"
            install: full
            deps: pinned
          - python: "3.13"
            install: light
            deps: latest

    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - name: Setup Python ${{ matrix.python }}
        uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0
        with:
          python-version: ${{ matrix.python }}
          allow-prereleases: true

      - name: Install seaborn
        run: |
          pip install --upgrade pip wheel
          if [[ ${{matrix.install}} == 'full' ]]; then EXTRAS=',stats'; fi
          if [[ ${{matrix.deps }} == 'pinned' ]]; then DEPS='-r ci/deps_pinned.txt'; fi
          pip install .[dev$EXTRAS] $DEPS

      - name: Run tests
        run: make test

      - name: Upload coverage
        uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4
        if: ${{ success() }}

  lint:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
    steps:

      - name: Checkout
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1

      - name: Setup Python
        uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0

      - name: Install tools
        run: pip install mypy~=1.10.0 flake8

      - name: Flake8
        run: make lint

      - name: Type checking
        run: make typecheck
