name: Run tests

on:
  push:
    branches:
      - main
      - '*.x'
  pull_request:
  # Run weekly on Monday at 1:23 UTC
  schedule:
  - cron:  '23 1 * * 1'
  workflow_dispatch:


jobs:
  test:
    runs-on: ${{ matrix.os }}
    # Disable scheduled CI runs on forks
    if: github.event_name != 'schedule' || github.repository_owner == 'ipython'
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest]
        python-version: ["3.10", "3.11", "3.12","3.13"]
        deps: [test_extra]
        # Test all on ubuntu, test ends on macos
        include:
          - os: macos-latest
            python-version: "3.10"
            deps: test_extra
          - os: macos-latest
            python-version: "3.11"
            deps: test_extra
          # Tests minimal dependencies set
          - os: ubuntu-latest
            python-version: "3.11"
            deps: test
          # Tests latest development Python version
          - os: ubuntu-latest
            python-version: "3.13"
            deps: test
          # Installing optional dependencies stuff takes ages on PyPy
          - os: ubuntu-latest
            python-version: "pypy-3.10"
            deps: test
          - os: windows-latest
            python-version: "pypy-3.10"
            deps: test
          - os: macos-latest
            python-version: "pypy-3.10"
            deps: test
          # Temporary CI run to use entry point compatible code in matplotlib-inline.
          - os: ubuntu-latest
            python-version: "3.12"
            deps: test_extra
            want-latest-entry-point-code: true

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
        cache: pip
        cache-dependency-path: |
          pyproject.toml
    - name: Install latex
      if: runner.os == 'Linux' && matrix.deps == 'test_extra'
      run: echo "disable latex for now, issues in mirros" #sudo apt-get -yq -o Acquire::Retries=3 --no-install-suggests --no-install-recommends install texlive dvipng
    - name: Install and update Python dependencies (binary only)
      if: ${{ ! contains( matrix.python-version, 'dev' ) }}
      run: |
        python -m pip install --only-binary ':all:' --upgrade pip setuptools wheel build
        python -m pip install --only-binary ':all:' --no-binary curio --upgrade -e .[${{ matrix.deps }}]
        python -m pip install --only-binary ':all:' --upgrade check-manifest pytest-cov  'pytest<8'
    - name: Install and update Python dependencies (dev?)
      if: ${{ contains( matrix.python-version, 'dev' ) }}
      run: |
        python -m pip install --pre --upgrade pip setuptools wheel build
        python -m pip install --pre --extra-index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple --no-binary curio --upgrade -e .[${{ matrix.deps }}]
        python -m pip install --pre --extra-index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple --upgrade check-manifest pytest-cov
    - name: Try building with Python build
      if: runner.os != 'Windows'  # setup.py does not support sdist on Windows
      run: |
        python -m build
        shasum -a 256 dist/*
    - name: Check manifest
      if: runner.os != 'Windows'  # setup.py does not support sdist on Windows
      run: check-manifest

    - name: Install entry point compatible code (TEMPORARY)
      if: matrix.want-latest-entry-point-code
      run: |
        python -m pip list
        # Not installing matplotlib's entry point code as building matplotlib from source is complex.
        # Rely upon matplotlib to test all the latest entry point branches together.
        python -m pip install --upgrade git+https://github.com/ipython/matplotlib-inline.git@main
        python -m pip list

    - name: pytest
      env:
        COLUMNS: 120
      run: |
        pytest --color=yes -raXxs ${{ startsWith(matrix.python-version, 'pypy') && ' ' || '--cov --cov-report=xml' }} --maxfail=15
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v5
      with:
         name: Test
         files: /home/runner/work/ipython/ipython/coverage.xml
