name: CI

on:
  push:
    branches:
      - main
      - "0.3"
      - "0.4"
      - "0.5"
      - "1.0"
      - "2.0"
  pull_request:
  merge_group:

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

permissions: {}

jobs:
  test:
    name: test
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        python-version:
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
        os:
          - ubuntu-latest
          - windows-latest
          - macos-latest
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
      - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
        with:
          python-version: ${{ matrix.python-version }}
      - name: Sync
        run: uv sync --all-extras
      - name: Lint
        if: runner.os != 'Windows'
        run: uv run pre-commit run --all-files
      - name: Test on windows
        if: runner.os == 'Windows'
        shell: bash
        env:
          TMPDIR: 'D:\\a\\_temp'
        run: uv run pytest tests
      - name: Test
        if: runner.os != 'Windows'
        run: uv run pytest tests --block-network --record-mode=none

  coverage:
    name: coverage
    runs-on: ubuntu-latest
    permissions:
      id-token: write
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
      - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
      - name: Install with dependencies
        run: uv sync --all-extras
      - name: Run coverage with orjson
        run: uv run pytest tests --cov
      - name: Uninstall orjson
        run: uv pip uninstall orjson
      - name: Run coverage without orjson, appending results
        run: uv run pytest tests --cov --cov-append
      - name: Prepare ./coverage.xml
        # Ignore the configured fail-under to ensure we upload the coverage report. We
        # will trigger a failure for coverage drops in a later job
        run: uv run coverage xml --fail-under 0
      - name: Upload All coverage to Codecov
        uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
        if: ${{ env.GITHUB_REPOSITORY == 'stac-utils/pystac' }}
        with:
          files: ./coverage.xml
          fail_ci_if_error: false
          use_oidc: true
      - name: Check for coverage drop
        # This will use the configured fail-under, causing this job to fail if the
        # coverage drops.
        run: uv run coverage report

  without-orjson:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
      - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
      - name: Sync
        run: uv sync
      - name: Uninstall orjson
        run: uv pip uninstall orjson
      - name: Run tests
        run: uv run pytest tests

  check-benchmarks:
    # This checks to make sure any API changes haven't broken any of the
    # benchmarks. It doesn't do any actual benchmarking, since (IMO) that's not
    # appropriate for CI on GitHub actions.
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
      - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
        with:
          python-version: "3.10"
      - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
        with:
          enable-cache: true
      - name: Sync
        run: uv sync
      - name: Set asv machine
        run: uv run asv machine --yes
      - name: Check benchmarks
        run: uv run asv run -a repeat=1 -a rounds=1 HEAD

  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
      - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
      - name: Install pandoc
        run: sudo apt-get install pandoc
      - name: Sync
        run: uv sync --group docs
      - name: Check docs
        run: uv run make -C docs html SPHINXOPTS="-W --keep-going -n"
