# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt

name: "Python Nightly Tests"

on:
  push:
    branches:
      - "**/*nightly*"
  schedule:
    # Run at 2:22am early every morning Eastern time (6/7:22 UTC)
    # so that we get tips of CPython development tested.
    # https://crontab.guru/#22_7_%2a_%2a_%2a
    - cron: "22 7 * * *"
  workflow_dispatch:

defaults:
  run:
    shell: bash

env:
  PIP_DISABLE_PIP_VERSION_CHECK: 1
  COVERAGE_IGOR_VERBOSE: 1

permissions:
  contents: read

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

jobs:
  tests:
    name: "${{ matrix.python-version }}${{ matrix.nogil && ' nogil' || '' }} on ${{ matrix.os-short }}"
    runs-on: "${{ matrix.os }}"
    # If it doesn't finish in an hour, it's not going to. Don't spin for six
    # hours needlessly.
    timeout-minutes: 60

    strategy:
      matrix:
        os:
          # Choose a recent Ubuntu that deadsnakes still builds all the versions for.
          # For example, deadsnakes doesn't provide 3.10 nightly for 22.04 (jammy)
          # because jammy ships 3.10, and deadsnakes doesn't want to clobber it.
          # https://launchpad.net/~deadsnakes/+archive/ubuntu/nightly/+packages
          # https://github.com/deadsnakes/issues/issues/234
          # See https://github.com/deadsnakes/nightly for the source of the nightly
          # builds.
          # bionic: 18, focal: 20, jammy: 22, noble: 24
          - "ubuntu-22.04"
        os-short:
          - "ubuntu"
        python-version:
          # When changing this list, be sure to check the [gh] list in
          # tox.ini so that tox will run properly. PYVERSIONS
          # Available versions:
          # https://launchpad.net/~deadsnakes/+archive/ubuntu/nightly/+packages
          - "3.12-dev"
          - "3.13-dev"
          - "3.14-dev"
          # https://github.com/actions/setup-python#available-versions-of-pypy
          - "pypy-3.10-nightly"
        nogil:
          - false
          - true
        include:
          - python-version: "pypy-3.10-nightly"
            os: "windows-latest"
            os-short: "windows"
        exclude:
          - python-version: "3.12-dev"
            nogil: true
          - python-version: "pypy-3.9-nightly"
            nogil: true
          - python-version: "pypy-3.10-nightly"
            nogil: true

      fail-fast: false

    steps:
      - name: "Check out the repo"
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - name: "Install ${{ matrix.python-version }} with deadsnakes"
        uses: deadsnakes/action@e640ac8743173a67cca4d7d77cd837e514bf98e8 # v3.2.0
        if: "!startsWith(matrix.python-version, 'pypy-')"
        with:
          python-version: "${{ matrix.python-version }}"
          nogil: "${{ matrix.nogil || false }}"

      - name: "Install ${{ matrix.python-version }} with setup-python"
        uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
        if: "startsWith(matrix.python-version, 'pypy-')"
        with:
          python-version: "${{ matrix.python-version }}"

      - name: "Show diagnostic info"
        run: |
          set -xe
          python -VV
          python -m site
          python -m sysconfig
          python -c "import sys; print('GIL:', getattr(sys, '_is_gil_enabled', lambda: True)())"
          python -m coverage debug sys
          python -m coverage debug pybehave
          env | sort

      - name: "Check build recency"
        #if: "!startsWith(matrix.python-version, 'pypy-')"
        shell: python
        run: |
          import platform
          from datetime import datetime
          for fmt in ["%b %d %Y %H:%M:%S", "%b %d %Y"]:
              try:
                  built = datetime.strptime(platform.python_build()[1], fmt)
              except ValueError:
                  continue
          now = datetime.now()
          days = (now - built).days
          print(f"Days since Python was built: {days}")
          assert days <= 7

      - name: "Install dependencies"
        run: |
          python -m pip install -r requirements/tox.pip

      - name: "Run tox"
        run: |
          python -m tox -- -rfsEX
