vendor: actions/setup-python@v5
e2e-cache freethread / Test pip (Python 3.13.0t, macos-13) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, macos-13) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, macos-13) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, macos-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, macos-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, macos-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, windows-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, windows-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, windows-latest) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, macos-13) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, macos-13) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, macos-13) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, macos-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.1, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.2, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.0, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.1, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.2, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.0, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.1, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.2, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.0, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.1, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.2, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.0, windows-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.1, windows-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.2, windows-latest) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, macos-13, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, macos-13, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, macos-13, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, macos-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, macos-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, macos-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, macos-latest) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, macos-latest) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, ubuntu-latest) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, windows-latest) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, windows-latest) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, windows-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.0, macos-13) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.1, macos-13) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.2, macos-13) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.0, macos-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.1, macos-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.2, macos-latest) (push) Waiting to run
e2e-cache freethread / Test poetry (Python 3.13.0, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test poetry (Python 3.11, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test poetry (Python 3.12, ubuntu-22.04) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.0t, windows-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.1t, windows-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pip (Python 3.13.2t, windows-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, macos-13, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, macos-13, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, macos-13, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, macos-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, macos-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, macos-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.0t, windows-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.1t, windows-latest, caching path) (push) Waiting to run
e2e-cache freethread / Test pipenv (Python 3.13.2t, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, macos-13) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, macos-13) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, macos-13) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, macos-13) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, macos-13) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, macos-13) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, macos-13) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, macos-13) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, macos-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, macos-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, macos-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, macos-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, macos-latest) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, macos-latest) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, macos-latest) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, macos-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, windows-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, windows-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, windows-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, windows-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, windows-latest) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, windows-latest) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, windows-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, macos-13) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, macos-13) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, macos-13) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, macos-13) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, macos-13) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.11-v7.x, macos-13) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, macos-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, macos-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, macos-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, macos-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, macos-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.11-v7.x, macos-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.11-v7.x, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.11-v7.x, ubuntu-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, windows-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, windows-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, windows-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, windows-latest) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, windows-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.10, macos-13) (push) Waiting to run
e2e-cache / Test poetry (Python 3.11, macos-13) (push) Waiting to run
e2e-cache / Test poetry (Python 3.12, macos-13) (push) Waiting to run
e2e-cache / Test poetry (Python 3.13, macos-13) (push) Waiting to run
e2e-cache / Test poetry (Python 3.9, macos-13) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.10-v7.x, macos-13) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.11-v7.x, macos-13) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.9-v7.x, macos-13) (push) Waiting to run
e2e-cache / Test poetry (Python 3.10, macos-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.11, macos-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.12, macos-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.13, macos-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.9, macos-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.10-v7.x, macos-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.11-v7.x, macos-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.9-v7.x, macos-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.10, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test poetry (Python 3.9, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.10-v7.x, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.11-v7.x, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.9-v7.x, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.10, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.11, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.12, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.13, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.9, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.10-v7.x, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.11-v7.x, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.9-v7.x, ubuntu-24.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.10, ubuntu-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.11, ubuntu-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.13, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test poetry (Python 3.9, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.10-v7.x, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.11-v7.x, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.9-v7.x, ubuntu-22.04) (push) Waiting to run
e2e-cache / Test poetry (Python 3.10, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.11, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.12, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.13, ubuntu-22.04-arm) (push) Waiting to run
e2e-cache / Test poetry (Python 3.12, ubuntu-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.13, ubuntu-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.9, ubuntu-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.10-v7.x, ubuntu-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.11-v7.x, ubuntu-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.9-v7.x, ubuntu-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.10, windows-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.11, windows-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.12, windows-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.13, windows-latest) (push) Waiting to run
e2e-cache / Test poetry (Python 3.9, windows-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.10-v7.x, windows-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.11-v7.x, windows-latest) (push) Waiting to run
e2e-cache / Test poetry (Python pypy-3.9-v7.x, windows-latest) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.11-v7.x, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.10, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.11, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.12, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.13, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python 3.9, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.10-v7.x, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pip (Python pypy-3.9-v7.x, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.11-v7.x, macos-13, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.11-v7.x, macos-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, ubuntu-22.04, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, ubuntu-22.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.11-v7.x, ubuntu-24.04-arm, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.11-v7.x, ubuntu-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.10, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.11, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.12, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python 3.13, windows-latest, caching path) (push) Waiting to run
e2e-cache / Test pipenv (Python pypy-3.10-v7.x, windows-latest, caching path) (push) Waiting to run
e2e tests / Test setup-python (ubuntu-22.04-arm) (push) Waiting to run
e2e tests / Test setup-python (macos-13) (push) Waiting to run
e2e tests / Test setup-python (macos-latest) (push) Waiting to run
e2e tests / Test setup-python (ubuntu-22.04) (push) Waiting to run
e2e tests / Test setup-python (ubuntu-24.04-arm) (push) Waiting to run
e2e tests / Test setup-python (ubuntu-latest) (push) Waiting to run
e2e tests / Test setup-python (windows-latest) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-22.3 macos-13 (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-22.3 macos-latest (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-22.3 ubuntu-22.04 (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-22.3 ubuntu-22.04-arm (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-22.3 ubuntu-24.04-arm (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-22.3 ubuntu-latest (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.0 macos-13 (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.0 macos-latest (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.0 ubuntu-22.04 (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.0 ubuntu-22.04-arm (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.0 ubuntu-24.04-arm (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.0 ubuntu-latest (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.1 macos-13 (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.1 macos-latest (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.1 ubuntu-22.04 (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.1 ubuntu-22.04-arm (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.1 ubuntu-24.04-arm (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-23.1 ubuntu-latest (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-24.1 macos-13 (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-24.1 macos-latest (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-24.1 ubuntu-22.04 (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-24.1 ubuntu-22.04-arm (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-24.1 ubuntu-24.04-arm (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy-24.1 ubuntu-latest (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy22.3 macos-13 (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy22.3 macos-latest (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy22.3 ubuntu-22.04 (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy22.3 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy22.3 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy22.3 ubuntu-latest (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.0 macos-13 (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.0 macos-latest (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.0 ubuntu-22.04 (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.0 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.0 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.0 ubuntu-latest (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.1 macos-13 (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.1 macos-latest (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.1 ubuntu-22.04 (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.1 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.1 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy23.1 ubuntu-latest (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy24.1 macos-13 (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy24.1 macos-latest (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy24.1 ubuntu-22.04 (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy24.1 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy24.1 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate GraalPy e2e / Setup GraalPy graalpy24.1 ubuntu-latest (noenv) (push) Waiting to run
Validate GraalPy e2e / check-latest (macos-13) (push) Waiting to run
Validate GraalPy e2e / check-latest (macos-latest) (push) Waiting to run
Validate GraalPy e2e / check-latest (ubuntu-latest) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.12rc1 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.17 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-nightly macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.16 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.17 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.x macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.x macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-v7.3.17 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11-v7.3.19 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 macos-13 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.12rc1 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.17 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-nightly macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.16 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.17 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.x macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.x macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-v7.3.17 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11-v7.3.19 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 macos-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.12rc1 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.17 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-nightly ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.16 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.17 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.x ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.x ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-v7.3.17 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11-v7.3.19 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.12rc1 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.17 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-nightly ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.16 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.17 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.x ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.x ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-v7.3.17 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11-v7.3.19 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.12rc1 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.17 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-nightly ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.16 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.17 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.x ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.x ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-v7.3.17 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11-v7.3.19 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.12rc1 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.17 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-nightly ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.16 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.17 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.x ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.x ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-v7.3.17 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11-v7.3.19 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 ubuntu-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7 windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.12rc1 windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-2.7-v7.3.17 windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10 windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-nightly windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.16 windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.17 windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.3.x windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy-3.10-v7.x windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-v7.3.17 windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11-v7.3.19 windows-latest (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 windows-latest (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on macos-13 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on macos-13 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on macos-13 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on macos-14 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on macos-14 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on macos-14 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on macos-15 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on macos-15 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on macos-15 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on ubuntu-22.04 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on ubuntu-22.04-arm (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on ubuntu-24.04 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on ubuntu-24.04 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on ubuntu-24.04 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on ubuntu-24.04-arm (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on windows-2019 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on windows-2019 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on windows-2019 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on windows-2022 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on windows-2022 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on windows-2022 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-2.7 on windows-2025 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.10 on windows-2025 (push) Waiting to run
Validate PyPy e2e / Check non-eol pypy-3.11 on windows-2025 (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy2.7 macos-13 (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-nightly macos-13 (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11 macos-13 (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 macos-13 (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy2.7 macos-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-nightly macos-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11 macos-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 macos-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy2.7 ubuntu-22.04 (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-nightly ubuntu-22.04 (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11 ubuntu-22.04 (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 ubuntu-22.04 (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy2.7 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-nightly ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy2.7 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-nightly ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy2.7 ubuntu-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-nightly ubuntu-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11 ubuntu-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 ubuntu-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy2.7 windows-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.10-nightly windows-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.11 windows-latest (noenv) (push) Waiting to run
Validate PyPy e2e / Setup PyPy pypy3.9 windows-latest (noenv) (push) Waiting to run
Validate PyPy e2e / check-latest (macos-13) (push) Waiting to run
Validate PyPy e2e / check-latest (macos-latest) (push) Waiting to run
Validate PyPy e2e / check-latest (ubuntu-22.04) (push) Waiting to run
Validate PyPy e2e / check-latest (ubuntu-22.04-arm) (push) Waiting to run
Validate PyPy e2e / check-latest (ubuntu-24.04-arm) (push) Waiting to run
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Waiting to run
Validate PyPy e2e / check-latest (windows-latest) (push) Waiting to run
Validate PyPy e2e / setup-pypy-multiple-versions (macos-13) (push) Waiting to run
Validate PyPy e2e / setup-pypy-multiple-versions (macos-latest) (push) Waiting to run
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-22.04) (push) Waiting to run
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-22.04-arm) (push) Waiting to run
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-24.04-arm) (push) Waiting to run
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Waiting to run
Validate PyPy e2e / setup-pypy-multiple-versions (windows-latest) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-13 (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-13 (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-13 (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04 (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04 (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04 (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t windows-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t windows-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t windows-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-13 version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-13 version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-13 version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-latest version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-latest version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-13 .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-latest version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04 version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04 version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04 version file (push) Waiting to run
Validate Python e2e freethread / check-latest (ubuntu-24.04-arm, 3.14t-dev) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04-arm version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04-arm version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04-arm version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-24.04-arm version file (push) Waiting to run
Validate Python e2e freethread / check-latest (ubuntu-latest, 3.13t) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-24.04-arm version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-24.04-arm version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-latest version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-latest version file (push) Waiting to run
Validate Python e2e freethread / check-latest (ubuntu-latest, 3.14t-dev) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-latest version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t windows-latest version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t windows-latest version file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t windows-latest version file (push) Waiting to run
Validate Python e2e freethread / check-latest (windows-latest, 3.13t) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-13 version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-13 version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-13 version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev macos-13 .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04 version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04 version file without parameter (push) Waiting to run
Validate Python e2e freethread / check-latest (ubuntu-22.04, 3.14t-dev) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04 version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04-arm version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04-arm version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04-arm version file without parameter (push) Waiting to run
Validate Python e2e freethread / check-latest (ubuntu-22.04-arm, 3.13t) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-24.04-arm version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-24.04-arm version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-24.04-arm version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / check-latest (ubuntu-22.04-arm, 3.14t-dev) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t windows-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t windows-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / check-latest (ubuntu-24.04-arm, 3.13t) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t windows-latest version file without parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 macos-13 standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 macos-13 standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 macos-13 standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 macos-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 macos-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 macos-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 ubuntu-22.04 standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-22.04 standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-22.04 standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 ubuntu-22.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-22.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-22.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 ubuntu-24.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-24.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-24.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 ubuntu-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 windows-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 windows-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 windows-latest standard pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 macos-13 poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 macos-13 poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 macos-13 poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 macos-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 macos-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 macos-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 ubuntu-22.04 poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-22.04 poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-22.04 poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 ubuntu-22.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-22.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-22.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 ubuntu-24.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-24.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-24.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 ubuntu-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0 windows-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 windows-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 windows-latest poetry pyproject file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-13 .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-13 .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev macos-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04 .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04 .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev ubuntu-22.04 .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04 .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev ubuntu-22.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-24.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-24.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-24.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev ubuntu-24.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev ubuntu-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t windows-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t windows-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t windows-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev windows-latest .tool-versions file (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 macos-13 (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 macos-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 ubuntu-22.04 (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 ubuntu-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 windows-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev macos-13 (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev macos-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev ubuntu-22.04 (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-13 (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev ubuntu-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t-dev windows-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t macos-13 (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t macos-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t ubuntu-22.04 (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t ubuntu-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.14t windows-latest (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-13 (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-13 (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-13 (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t macos-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t macos-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t macos-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04 (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04 (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04 (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t ubuntu-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t ubuntu-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t ubuntu-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.0t windows-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1t windows-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2t windows-latest (noenv) (push) Waiting to run
Validate Python e2e freethread / check-latest (macos-13, 3.13t) (push) Waiting to run
Validate Python e2e freethread / check-latest (macos-13, 3.14t-dev) (push) Waiting to run
Validate Python e2e freethread / check-latest (macos-latest, 3.13t) (push) Waiting to run
Validate Python e2e freethread / check-latest (macos-latest, 3.14t-dev) (push) Waiting to run
Validate Python e2e freethread / check-latest (ubuntu-22.04, 3.13t) (push) Waiting to run
Validate Python e2e freethread / check-latest (windows-latest, 3.14t-dev) (push) Waiting to run
Validate Python e2e freethread / setup-python-multiple-python-versions (macos-13) (push) Waiting to run
Validate Python e2e freethread / setup-python-multiple-python-versions (macos-latest) (push) Waiting to run
Validate Python e2e freethread / setup-python-multiple-python-versions (ubuntu-22.04) (push) Waiting to run
Validate Python e2e freethread / setup-python-multiple-python-versions (ubuntu-22.04-arm) (push) Waiting to run
Validate Python e2e freethread / setup-python-multiple-python-versions (ubuntu-24.04-arm) (push) Waiting to run
Validate Python e2e freethread / setup-python-multiple-python-versions (ubuntu-latest) (push) Waiting to run
Validate Python e2e freethread / setup-python-multiple-python-versions (windows-latest) (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 macos-13 using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 macos-13 using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14-dev macos-13 using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 macos-13 using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 macos-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 macos-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14-dev macos-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 macos-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-22.04 using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-22.04 using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14-dev ubuntu-22.04 using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 ubuntu-22.04 using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-22.04-arm using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-22.04-arm using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14-dev ubuntu-22.04-arm using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 ubuntu-22.04-arm using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-24.04-arm using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-24.04-arm using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14-dev ubuntu-24.04-arm using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 ubuntu-24.04-arm using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 ubuntu-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 ubuntu-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14-dev ubuntu-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 ubuntu-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.1 windows-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.13.2 windows-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14-dev windows-latest using freethread input parameter (push) Waiting to run
Validate Python e2e freethread / Setup 3.14.0-alpha.6 windows-latest using freethread input parameter (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-13 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 macos-13 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-13 (push) Waiting to run
Validate Python e2e / Setup 3.12.3 macos-13 (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-13 (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-13 (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-latest (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-latest (push) Waiting to run
Validate Python e2e / Setup 3.12.3 macos-latest (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-latest (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-latest (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04 (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04 (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-22.04 (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04 (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04 (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-latest (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-latest (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-latest (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-latest (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-latest (push) Waiting to run
Validate Python e2e / Setup 3.10.11 windows-latest (push) Waiting to run
Validate Python e2e / Setup 3.11.9 windows-latest (push) Waiting to run
Validate Python e2e / Setup 3.12.3 windows-latest (push) Waiting to run
Validate Python e2e / Setup 3.13.2 windows-latest (push) Waiting to run
Validate Python e2e / Setup 3.9.13 windows-latest (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-13 version file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-13 version file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 macos-13 version file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-13 version file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-13 version file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 macos-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04 version file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04 version file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-22.04 version file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04 version file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04 version file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-22.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-24.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-24.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-24.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-24.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-24.04-arm version file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 windows-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 windows-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 windows-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 windows-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 windows-latest version file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-13 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-13 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.12.3 macos-13 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-13 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-13 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.12.3 macos-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-22.04 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04 version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-22.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-24.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-24.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-24.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-24.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-24.04-arm version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.10.11 windows-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.11.9 windows-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.12.3 windows-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.13.2 windows-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.9.13 windows-latest version file without parameter (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-13 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-13 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-13 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-13 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup ==3.12.3 macos-13 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup ==3.12.3 macos-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup ==3.12.3 ubuntu-22.04 standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup ==3.12.3 ubuntu-22.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-24.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-24.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-24.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-24.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup ==3.12.3 ubuntu-24.04-arm standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup ==3.12.3 ubuntu-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 windows-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 windows-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 windows-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 windows-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup ==3.12.3 windows-latest standard pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-13 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-13 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-13 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 macos-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 macos-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 macos-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 macos-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-22.04 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04 poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-22.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-22.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-22.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-22.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-24.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-24.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-24.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-24.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-24.04-arm poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 ubuntu-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 ubuntu-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 ubuntu-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 ubuntu-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.10.11 windows-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.11.9 windows-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.12.3 windows-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 windows-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.9.13 windows-latest poetry pyproject file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-13 .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.14-dev macos-13 .tool-versions file (push) Waiting to run
Validate Python e2e / Setup graalpy-24.1.2 macos-13 .tool-versions file (push) Waiting to run
Validate Python e2e / Setup pypy3.11-7.3.18 macos-13 .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 macos-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.14-dev macos-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup graalpy-24.1.2 macos-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup pypy3.11-7.3.18 macos-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04 .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.14-dev ubuntu-22.04 .tool-versions file (push) Waiting to run
Validate Python e2e / Setup graalpy-24.1.2 ubuntu-22.04 .tool-versions file (push) Waiting to run
Validate Python e2e / Setup pypy3.11-7.3.18 ubuntu-22.04 .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-22.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.14-dev ubuntu-22.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e / Setup graalpy-24.1.2 ubuntu-22.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e / Setup pypy3.11-7.3.18 ubuntu-22.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-24.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.14-dev ubuntu-24.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e / Setup graalpy-24.1.2 ubuntu-24.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e / Setup pypy3.11-7.3.18 ubuntu-24.04-arm .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 ubuntu-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.14-dev ubuntu-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup graalpy-24.1.2 ubuntu-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup pypy3.11-7.3.18 ubuntu-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.13.2 windows-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.14-dev windows-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup pypy3.11-7.3.18 windows-latest .tool-versions file (push) Waiting to run
Validate Python e2e / Setup 3.14.0-alpha.6 macos-13 (push) Waiting to run
Validate Python e2e / Setup 3.14.0-alpha.6 macos-latest (push) Waiting to run
Validate Python e2e / Setup 3.14.0-alpha.6 ubuntu-22.04 (push) Waiting to run
Validate Python e2e / Setup 3.14.0-alpha.6 ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.14.0-alpha.6 ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.14.0-alpha.6 ubuntu-latest (push) Waiting to run
Validate Python e2e / Setup 3.14.0-alpha.6 windows-latest (push) Waiting to run
Validate Python e2e / Setup 3.14-dev macos-13 (push) Waiting to run
Validate Python e2e / Setup 3.14-dev macos-latest (push) Waiting to run
Validate Python e2e / Setup 3.14-dev ubuntu-22.04 (push) Waiting to run
Validate Python e2e / Setup 3.14-dev ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.14-dev ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.14-dev ubuntu-latest (push) Waiting to run
Validate Python e2e / Setup 3.14-dev windows-latest (push) Waiting to run
Validate Python e2e / Setup 3.14 macos-13 (push) Waiting to run
Validate Python e2e / Setup 3.14 macos-latest (push) Waiting to run
Validate Python e2e / Setup 3.14 ubuntu-22.04 (push) Waiting to run
Validate Python e2e / Setup 3.14 ubuntu-22.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.14 ubuntu-24.04-arm (push) Waiting to run
Validate Python e2e / Setup 3.14 ubuntu-latest (push) Waiting to run
Validate Python e2e / Setup 3.14 windows-latest (push) Waiting to run
Validate Python e2e / Setup 3.10 macos-13 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.11 macos-13 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.12 macos-13 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.13 macos-13 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.9 macos-13 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.10 macos-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.11 macos-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.12 macos-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.13 macos-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.9 macos-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.10 ubuntu-22.04 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.11 ubuntu-22.04 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.12 ubuntu-22.04 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.13 ubuntu-22.04 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.9 ubuntu-22.04 (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.10 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.11 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.12 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.13 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.9 ubuntu-22.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.10 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.11 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.12 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.13 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.9 ubuntu-24.04-arm (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.10 ubuntu-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.11 ubuntu-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.12 ubuntu-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.13 ubuntu-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.9 ubuntu-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.10 windows-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.11 windows-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.12 windows-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.13 windows-latest (noenv) (push) Waiting to run
Validate Python e2e / Setup 3.9 windows-latest (noenv) (push) Waiting to run
Validate Python e2e / check-latest (macos-13, 3.10) (push) Waiting to run
Validate Python e2e / check-latest (macos-13, 3.11) (push) Waiting to run
Validate Python e2e / check-latest (macos-13, 3.12) (push) Waiting to run
Validate Python e2e / check-latest (macos-13, 3.13) (push) Waiting to run
Validate Python e2e / check-latest (macos-13, 3.9) (push) Waiting to run
Validate Python e2e / check-latest (macos-latest, 3.10) (push) Waiting to run
Validate Python e2e / check-latest (macos-latest, 3.11) (push) Waiting to run
Validate Python e2e / check-latest (macos-latest, 3.12) (push) Waiting to run
Validate Python e2e / check-latest (macos-latest, 3.13) (push) Waiting to run
Validate Python e2e / check-latest (macos-latest, 3.9) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04, 3.10) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04, 3.11) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04, 3.12) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04, 3.13) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04, 3.9) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04-arm, 3.10) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04-arm, 3.11) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04-arm, 3.12) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04-arm, 3.13) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-22.04-arm, 3.9) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-24.04-arm, 3.10) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-24.04-arm, 3.11) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-24.04-arm, 3.12) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-24.04-arm, 3.13) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-24.04-arm, 3.9) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-latest, 3.10) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-latest, 3.11) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-latest, 3.12) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-latest, 3.13) (push) Waiting to run
Validate Python e2e / check-latest (ubuntu-latest, 3.9) (push) Waiting to run
Validate Python e2e / check-latest (windows-latest, 3.10) (push) Waiting to run
Validate Python e2e / check-latest (windows-latest, 3.11) (push) Waiting to run
Validate Python e2e / check-latest (windows-latest, 3.12) (push) Waiting to run
Validate Python e2e / check-latest (windows-latest, 3.13) (push) Waiting to run
Validate Python e2e / check-latest (windows-latest, 3.9) (push) Waiting to run
Validate Python e2e / setup-python-multiple-python-versions (macos-13) (push) Waiting to run
Validate Python e2e / setup-python-multiple-python-versions (macos-latest) (push) Waiting to run
Validate Python e2e / setup-python-multiple-python-versions (ubuntu-22.04) (push) Waiting to run
Validate Python e2e / setup-python-multiple-python-versions (ubuntu-22.04-arm) (push) Waiting to run
Validate Python e2e / setup-python-multiple-python-versions (ubuntu-24.04-arm) (push) Waiting to run
Validate Python e2e / setup-python-multiple-python-versions (ubuntu-latest) (push) Waiting to run
Validate Python e2e / setup-python-multiple-python-versions (windows-latest) (push) Waiting to run

This commit is contained in:
Compass Migration Bot
2026-07-22 18:53:46 +08:00
commit 051cce3f75
141 changed files with 212389 additions and 0 deletions
+360
View File
@@ -0,0 +1,360 @@
import * as path from 'path';
import * as core from '@actions/core';
import * as cache from '@actions/cache';
import * as exec from '@actions/exec';
import * as io from '@actions/io';
import {getCacheDistributor} from '../src/cache-distributions/cache-factory';
import {State} from '../src/cache-distributions/cache-distributor';
describe('restore-cache', () => {
const pipFileLockHash =
'f8428d7cf00ea53a5c3702f0a9cb3cc467f76cd86a34723009350c4e4b32751a';
const requirementsHash =
'd8110e0006d7fb5ee76365d565eef9d37df1d11598b912d3eb66d398d57a1121';
const requirementsLinuxHash =
'2d0ff7f46b0e120e3d3294db65768b474934242637b9899b873e6283dfd16d7c';
const poetryLockHash =
'f24ea1ad73968e6c8d80c16a093ade72d9332c433aeef979a0dd943e6a99b2ab';
const poetryConfigOutput = `
cache-dir = "/Users/patrick/Library/Caches/pypoetry"
experimental.new-installer = false
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.path = "{cache-dir}/virtualenvs" # /Users/patrick/Library/Caches/pypoetry/virtualenvs
`;
// core spy
let infoSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let saveStateSpy: jest.SpyInstance;
let getStateSpy: jest.SpyInstance;
let setOutputSpy: jest.SpyInstance;
// cache spy
let restoreCacheSpy: jest.SpyInstance;
// exec spy
let getExecOutputSpy: jest.SpyInstance;
// io spy
let whichSpy: jest.SpyInstance;
beforeEach(() => {
process.env['RUNNER_OS'] = process.env['RUNNER_OS'] ?? 'linux';
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(input => undefined);
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(input => undefined);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(input => undefined);
saveStateSpy = jest.spyOn(core, 'saveState');
saveStateSpy.mockImplementation(input => undefined);
getStateSpy = jest.spyOn(core, 'getState');
getStateSpy.mockImplementation(input => undefined);
getExecOutputSpy = jest.spyOn(exec, 'getExecOutput');
getExecOutputSpy.mockImplementation((input: string) => {
if (input.includes('pip')) {
return {stdout: 'pip', stderr: '', exitCode: 0};
}
if (input.includes('poetry')) {
return {stdout: poetryConfigOutput, stderr: '', exitCode: 0};
}
if (input.includes('lsb_release')) {
return {stdout: 'Ubuntu\n20.04', stderr: '', exitCode: 0};
}
return {stdout: '', stderr: 'Error occured', exitCode: 2};
});
setOutputSpy = jest.spyOn(core, 'setOutput');
setOutputSpy.mockImplementation(input => undefined);
restoreCacheSpy = jest.spyOn(cache, 'restoreCache');
restoreCacheSpy.mockImplementation(
(cachePaths: string[], primaryKey: string, restoreKey?: string) => {
return primaryKey;
}
);
whichSpy = jest.spyOn(io, 'which');
whichSpy.mockImplementation(() => '/path/to/python');
});
describe('Validate provided package manager', () => {
it.each(['npm', 'pip2', 'pip21', 'pip21.3', 'pipenv32'])(
'Throw an error because %s is not supported',
async packageManager => {
expect(() =>
getCacheDistributor(packageManager, '3.8.12', undefined)
).toThrow(`Caching for '${packageManager}' is not supported`);
}
);
});
describe('Restore dependencies', () => {
it.each([
[
'pip',
'3.8.12',
'__tests__/data/**/requirements.txt',
requirementsHash,
undefined
],
[
'pip',
'3.8.12',
'__tests__/data/**/requirements-linux.txt',
requirementsLinuxHash,
undefined
],
[
'pip',
'3.8.12',
'__tests__/data/requirements-linux.txt',
requirementsLinuxHash,
undefined
],
[
'pip',
'3.8.12',
'__tests__/data/requirements.txt',
requirementsHash,
undefined
],
[
'pipenv',
'3.9.1',
'__tests__/data/**/Pipfile.lock',
pipFileLockHash,
undefined
],
[
'pipenv',
'3.9.12',
'__tests__/data/requirements.txt',
requirementsHash,
undefined
],
[
'poetry',
'3.9.1',
'__tests__/data/**/poetry.lock',
poetryLockHash,
[
'/Users/patrick/Library/Caches/pypoetry/virtualenvs',
path.join(__dirname, 'data', 'inner', '.venv'),
path.join(__dirname, 'data', '.venv')
]
]
])(
'restored dependencies for %s by primaryKey',
async (
packageManager,
pythonVersion,
dependencyFile,
fileHash,
cachePaths
) => {
restoreCacheSpy.mockImplementation(
(cachePaths: string[], primaryKey: string, restoreKey?: string) => {
return primaryKey.includes(fileHash) ? primaryKey : '';
}
);
const cacheDistributor = getCacheDistributor(
packageManager,
pythonVersion,
dependencyFile
);
await cacheDistributor.restoreCache();
if (cachePaths !== undefined) {
expect(saveStateSpy).toHaveBeenCalledWith(
State.CACHE_PATHS,
cachePaths
);
}
const restoredKeys = restoreCacheSpy.mock.results.map(
result => result.value
);
restoredKeys.forEach(restoredKey => {
if (restoredKey) {
if (process.platform === 'linux' && packageManager === 'pip') {
expect(infoSpy).toHaveBeenCalledWith(
`Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-20.04-Ubuntu-python-${pythonVersion}-${packageManager}-${fileHash}`
);
} else if (packageManager === 'poetry') {
expect(infoSpy).toHaveBeenCalledWith(
`Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-python-${pythonVersion}-${packageManager}-v2-${fileHash}`
);
} else {
expect(infoSpy).toHaveBeenCalledWith(
`Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-python-${pythonVersion}-${packageManager}-${fileHash}`
);
}
} else {
expect(infoSpy).toHaveBeenCalledWith(
`${packageManager} cache is not found`
);
}
});
},
30000
);
it.each([['pipenv', '3.9.12', 'requirements.txt', 'requirements.txt']])(
'Should throw an error because dependency file is not found',
async (
packageManager,
pythonVersion,
dependencyFile,
cacheDependencyPath
) => {
const cacheDistributor = getCacheDistributor(
packageManager,
pythonVersion,
dependencyFile
);
await expect(cacheDistributor.restoreCache()).rejects.toThrow(
`No file in ${process.cwd()} matched to [${cacheDependencyPath
.split('\n')
.join(',')}], make sure you have checked out the target repository`
);
}
);
it.each([
['pip', '3.8.12', 'requirements-linux.txt'],
['pip', '3.8.12', 'requirements.txt']
])(
'Shouldn`t throw an error as there is a default file `pyproject.toml` to use when requirements.txt is not specified',
async (packageManager, pythonVersion, dependencyFile) => {
const cacheDistributor = getCacheDistributor(
packageManager,
pythonVersion,
dependencyFile
);
await expect(cacheDistributor.restoreCache()).resolves.not.toThrow();
}
);
it.each([
['pip', '3.8.12', 'requirements-linux.txt'],
['pip', '3.8.12', 'requirements.txt']
])(
'Should throw an error as there is no default file `pyproject.toml` to use when requirements.txt is not specified',
async (packageManager, pythonVersion, dependencyFile) => {
const cacheDistributor = getCacheDistributor(
packageManager,
pythonVersion,
dependencyFile
) as any; // Widening PipCache | PipenvCache | PoetryCache type to any allow us to change private property on the cacheDistributor to test value: "**/pyprojecttest.toml"
cacheDistributor.cacheDependencyBackupPath = '**/pyprojecttest.toml';
await expect(cacheDistributor.restoreCache()).rejects.toThrow();
}
);
});
describe('Dependencies changed', () => {
it.each([
['pip', '3.8.12', '__tests__/data/**/requirements.txt', pipFileLockHash],
[
'pip',
'3.8.12',
'__tests__/data/**/requirements-linux.txt',
pipFileLockHash
],
[
'pip',
'3.8.12',
'__tests__/data/requirements-linux.txt',
pipFileLockHash
],
['pip', '3.8.12', '__tests__/data/requirements.txt', pipFileLockHash],
['pipenv', '3.9.1', '__tests__/data/**/Pipfile.lock', requirementsHash],
['pipenv', '3.9.12', '__tests__/data/requirements.txt', requirementsHash],
['poetry', '3.9.1', '__tests__/data/**/poetry.lock', requirementsHash]
])(
'restored dependencies for %s by primaryKey',
async (packageManager, pythonVersion, dependencyFile, fileHash) => {
restoreCacheSpy.mockImplementation(
(cachePaths: string[], primaryKey: string, restoreKey?: string) => {
return primaryKey !== fileHash && restoreKey ? pipFileLockHash : '';
}
);
const cacheDistributor = getCacheDistributor(
packageManager,
pythonVersion,
dependencyFile
);
await cacheDistributor.restoreCache();
let result = '';
switch (packageManager) {
case 'pip':
result = `Cache restored from key: ${fileHash}`;
break;
case 'pipenv':
result = 'pipenv cache is not found';
break;
case 'poetry':
result = 'poetry cache is not found';
break;
}
expect(infoSpy).toHaveBeenCalledWith(result);
}
);
});
describe('Check if handleMatchResult', () => {
it.each([
['pip', '3.8.12', 'requirements.txt', 'someKey', 'someKey', true],
['pipenv', '3.9.1', 'requirements.txt', 'someKey', 'someKey', true],
['poetry', '3.8.12', 'requirements.txt', 'someKey', 'someKey', true],
['pip', '3.9.2', 'requirements.txt', undefined, 'someKey', false],
['pipenv', '3.8.12', 'requirements.txt', undefined, 'someKey', false],
['poetry', '3.9.12', 'requirements.txt', undefined, 'someKey', false]
])(
'sets correct outputs',
async (
packageManager,
pythonVersion,
dependencyFile,
matchedKey,
restoredKey,
expectedOutputValue
) => {
const cacheDistributor = getCacheDistributor(
packageManager,
pythonVersion,
dependencyFile
);
cacheDistributor.handleMatchResult(matchedKey, restoredKey);
expect(setOutputSpy).toHaveBeenCalledWith(
'cache-hit',
expectedOutputValue
);
}
);
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
});
});
+266
View File
@@ -0,0 +1,266 @@
import * as core from '@actions/core';
import * as cache from '@actions/cache';
import * as exec from '@actions/exec';
import {run} from '../src/cache-save';
import {State} from '../src/cache-distributions/cache-distributor';
describe('run', () => {
const pipFileLockHash =
'd1dd6218299d8a6db5fc2001d988b34a8b31f1e9d0bb4534d377dde7c19f64b3';
const requirementsHash =
'd8110e0006d7fb5ee76365d565eef9d37df1d11598b912d3eb66d398d57a1121';
const requirementsLinuxHash =
'2d0ff7f46b0e120e3d3294db65768b474934242637b9899b873e6283dfd16d7c';
const poetryLockHash =
'571bf984f8d210e6a97f854e479fdd4a2b5af67b5fdac109ec337a0ea16e7836';
// core spy
let infoSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let saveStateSpy: jest.SpyInstance;
let getStateSpy: jest.SpyInstance;
let getInputSpy: jest.SpyInstance;
let setFailedSpy: jest.SpyInstance;
// cache spy
let saveCacheSpy: jest.SpyInstance;
// exec spy
let getExecOutputSpy: jest.SpyInstance;
let inputs = {} as any;
beforeEach(() => {
process.env['RUNNER_OS'] = process.env['RUNNER_OS'] ?? 'linux';
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(input => undefined);
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(input => undefined);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(input => undefined);
saveStateSpy = jest.spyOn(core, 'saveState');
saveStateSpy.mockImplementation(input => undefined);
getStateSpy = jest.spyOn(core, 'getState');
getStateSpy.mockImplementation(input => {
if (input === State.CACHE_PATHS) {
return JSON.stringify([__dirname]);
}
return requirementsHash;
});
setFailedSpy = jest.spyOn(core, 'setFailed');
getInputSpy = jest.spyOn(core, 'getInput');
getInputSpy.mockImplementation(input => inputs[input]);
getExecOutputSpy = jest.spyOn(exec, 'getExecOutput');
getExecOutputSpy.mockImplementation((input: string) => {
if (input.includes('pip')) {
return {stdout: 'pip', stderr: '', exitCode: 0};
}
return {stdout: '', stderr: 'Error occured', exitCode: 2};
});
saveCacheSpy = jest.spyOn(cache, 'saveCache');
saveCacheSpy.mockImplementation(() => undefined);
});
describe('Package manager validation', () => {
it('Package manager is not provided, skip caching', async () => {
inputs['cache'] = '';
await run();
expect(getInputSpy).toHaveBeenCalled();
expect(infoSpy).not.toHaveBeenCalled();
expect(saveCacheSpy).not.toHaveBeenCalled();
expect(setFailedSpy).not.toHaveBeenCalled();
});
});
describe('Validate unchanged cache is not saved', () => {
it('should not save cache for pip', async () => {
inputs['cache'] = 'pip';
inputs['python-version'] = '3.10.0';
await run();
expect(getInputSpy).toHaveBeenCalled();
expect(debugSpy).toHaveBeenCalledWith(
`paths for caching are ${__dirname}`
);
expect(getStateSpy).toHaveBeenCalledTimes(3);
expect(infoSpy).toHaveBeenCalledWith(
`Cache hit occurred on the primary key ${requirementsHash}, not saving cache.`
);
expect(setFailedSpy).not.toHaveBeenCalled();
});
it('should not save cache for pipenv', async () => {
inputs['cache'] = 'pipenv';
inputs['python-version'] = '3.10.0';
await run();
expect(getInputSpy).toHaveBeenCalled();
expect(debugSpy).toHaveBeenCalledWith(
`paths for caching are ${__dirname}`
);
expect(getStateSpy).toHaveBeenCalledTimes(3);
expect(infoSpy).toHaveBeenCalledWith(
`Cache hit occurred on the primary key ${requirementsHash}, not saving cache.`
);
expect(setFailedSpy).not.toHaveBeenCalled();
});
});
describe('action saves the cache', () => {
it('saves cache from pip', async () => {
inputs['cache'] = 'pip';
inputs['python-version'] = '3.10.0';
getStateSpy.mockImplementation((name: string) => {
if (name === State.CACHE_MATCHED_KEY) {
return requirementsHash;
} else if (name === State.CACHE_PATHS) {
return JSON.stringify([__dirname]);
} else {
return pipFileLockHash;
}
});
await run();
expect(getInputSpy).toHaveBeenCalled();
expect(getStateSpy).toHaveBeenCalledTimes(3);
expect(infoSpy).not.toHaveBeenCalledWith(
`Cache hit occurred on the primary key ${requirementsHash}, not saving cache.`
);
expect(saveCacheSpy).toHaveBeenCalled();
expect(infoSpy).toHaveBeenLastCalledWith(
`Cache saved with the key: ${pipFileLockHash}`
);
expect(setFailedSpy).not.toHaveBeenCalled();
});
it('saves cache from pipenv', async () => {
inputs['cache'] = 'pipenv';
inputs['python-version'] = '3.10.0';
getStateSpy.mockImplementation((name: string) => {
if (name === State.CACHE_MATCHED_KEY) {
return pipFileLockHash;
} else if (name === State.CACHE_PATHS) {
return JSON.stringify([__dirname]);
} else {
return requirementsHash;
}
});
await run();
expect(getInputSpy).toHaveBeenCalled();
expect(getStateSpy).toHaveBeenCalledTimes(3);
expect(infoSpy).not.toHaveBeenCalledWith(
`Cache hit occurred on the primary key ${pipFileLockHash}, not saving cache.`
);
expect(saveCacheSpy).toHaveBeenCalled();
expect(infoSpy).toHaveBeenLastCalledWith(
`Cache saved with the key: ${requirementsHash}`
);
expect(setFailedSpy).not.toHaveBeenCalled();
});
it('saves cache from poetry', async () => {
inputs['cache'] = 'poetry';
inputs['python-version'] = '3.10.0';
getStateSpy.mockImplementation((name: string) => {
if (name === State.CACHE_MATCHED_KEY) {
return poetryLockHash;
} else if (name === State.CACHE_PATHS) {
return JSON.stringify([__dirname]);
} else {
return requirementsHash;
}
});
await run();
expect(getInputSpy).toHaveBeenCalled();
expect(getStateSpy).toHaveBeenCalledTimes(3);
expect(infoSpy).not.toHaveBeenCalledWith(
`Cache hit occurred on the primary key ${poetryLockHash}, not saving cache.`
);
expect(saveCacheSpy).toHaveBeenCalled();
expect(infoSpy).toHaveBeenLastCalledWith(
`Cache saved with the key: ${requirementsHash}`
);
expect(setFailedSpy).not.toHaveBeenCalled();
});
it('saves with -1 cacheId , should not fail workflow', async () => {
inputs['cache'] = 'poetry';
inputs['python-version'] = '3.10.0';
getStateSpy.mockImplementation((name: string) => {
if (name === State.STATE_CACHE_PRIMARY_KEY) {
return poetryLockHash;
} else if (name === State.CACHE_PATHS) {
return JSON.stringify([__dirname]);
} else {
return requirementsHash;
}
});
saveCacheSpy.mockImplementation(() => {
return -1;
});
await run();
expect(getInputSpy).toHaveBeenCalled();
expect(getStateSpy).toHaveBeenCalledTimes(3);
expect(infoSpy).not.toHaveBeenCalled();
expect(saveCacheSpy).toHaveBeenCalled();
expect(infoSpy).not.toHaveBeenLastCalledWith(
`Cache saved with the key: ${poetryLockHash}`
);
expect(setFailedSpy).not.toHaveBeenCalled();
});
it('saves with error from toolkit, should not fail the workflow', async () => {
inputs['cache'] = 'npm';
inputs['python-version'] = '3.10.0';
getStateSpy.mockImplementation((name: string) => {
if (name === State.STATE_CACHE_PRIMARY_KEY) {
return poetryLockHash;
} else if (name === State.CACHE_PATHS) {
return JSON.stringify([__dirname]);
} else {
return requirementsHash;
}
});
saveCacheSpy.mockImplementation(() => {
throw new cache.ValidationError('Validation failed');
});
await run();
expect(getInputSpy).toHaveBeenCalled();
expect(getStateSpy).toHaveBeenCalledTimes(3);
expect(infoSpy).not.toHaveBeenCalledWith();
expect(saveCacheSpy).toHaveBeenCalled();
expect(setFailedSpy).not.toHaveBeenCalled();
});
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
inputs = {};
});
});
+14
View File
@@ -0,0 +1,14 @@
#!/bin/bash
set -euo pipefail
PYTHON_PATH="$1"
PATH_EXECUTABLE=$(python -c 'import sys; print(sys.executable)')
PYTHON_PATH_EXECUTABLE=$("${PYTHON_PATH}" -c 'import sys; print(sys.executable)')
if [ "${PATH_EXECUTABLE}" != "${PYTHON_PATH_EXECUTABLE}" ]; then
echo "Executable mismatch."
echo "python in PATH is: ${PATH_EXECUTABLE}"
echo "python-path (${PYTHON_PATH}) is: ${PYTHON_PATH_EXECUTABLE}"
exit 1
fi
echo "python-path: ${PYTHON_PATH}"
+13
View File
@@ -0,0 +1,13 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
flake8 = "==6.0.0"
numpy = "==2.2.4"
[dev-packages]
[requires]
python_version = "*"
+116
View File
@@ -0,0 +1,116 @@
{
"_meta": {
"hash": {
"sha256": "9d0bc7ff1f9078396b19f05bc5cd57894f3783c68f96fa9d623b1ea5a1b168f5"
},
"pipfile-spec": 6,
"requires": {
"python_version": "*"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"flake8": {
"hashes": [
"sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7",
"sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"
],
"index": "pypi",
"markers": "python_full_version >= '3.8.1'",
"version": "==6.0.0"
},
"mccabe": {
"hashes": [
"sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
"sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"
],
"markers": "python_version >= '3.6'",
"version": "==0.7.0"
},
"numpy": {
"hashes": [
"sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286",
"sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542",
"sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f",
"sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d",
"sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0",
"sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7",
"sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3",
"sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3",
"sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146",
"sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1",
"sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6",
"sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc",
"sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9",
"sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592",
"sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00",
"sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298",
"sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8",
"sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2",
"sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392",
"sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb",
"sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8",
"sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd",
"sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9",
"sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0",
"sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687",
"sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc",
"sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f",
"sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4",
"sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a",
"sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39",
"sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4",
"sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775",
"sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c",
"sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd",
"sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020",
"sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d",
"sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24",
"sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7",
"sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f",
"sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba",
"sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880",
"sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d",
"sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6",
"sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854",
"sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017",
"sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8",
"sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae",
"sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4",
"sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09",
"sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff",
"sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960",
"sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee",
"sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5",
"sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c",
"sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91"
],
"index": "pypi",
"markers": "python_version >= '3.10'",
"version": "==2.2.4"
},
"pycodestyle": {
"hashes": [
"sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053",
"sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"
],
"markers": "python_version >= '3.6'",
"version": "==2.10.0"
},
"pyflakes": {
"hashes": [
"sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf",
"sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"
],
"markers": "python_version >= '3.6'",
"version": "==3.0.1"
}
},
"develop": {}
}
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
numpy==2.2.4
flake8==6.0.0
+226
View File
@@ -0,0 +1,226 @@
# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand.
[[package]]
name = "altgraph"
version = "0.17.4"
description = "Python graph (network) package"
optional = false
python-versions = "*"
files = [
{file = "altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff"},
{file = "altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406"},
]
[[package]]
name = "flake8"
version = "4.0.1"
description = "the modular source code checker: pep8 pyflakes and co"
optional = false
python-versions = ">=3.6"
files = [
{file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
{file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
]
[package.dependencies]
mccabe = ">=0.6.0,<0.7.0"
pycodestyle = ">=2.8.0,<2.9.0"
pyflakes = ">=2.4.0,<2.5.0"
[[package]]
name = "importlib-metadata"
version = "8.5.0"
description = "Read metadata from Python packages"
optional = false
python-versions = ">=3.8"
files = [
{file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"},
{file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"},
]
[package.dependencies]
zipp = ">=3.20"
[package.extras]
check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
enabler = ["pytest-enabler (>=2.2)"]
perf = ["ipython"]
test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
type = ["pytest-mypy"]
[[package]]
name = "macholib"
version = "1.16.3"
description = "Mach-O header analysis and editing"
optional = false
python-versions = "*"
files = [
{file = "macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c"},
{file = "macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30"},
]
[package.dependencies]
altgraph = ">=0.17"
[[package]]
name = "mccabe"
version = "0.6.1"
description = "McCabe checker, plugin for flake8"
optional = false
python-versions = "*"
files = [
{file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
]
[[package]]
name = "packaging"
version = "24.2"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
files = [
{file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
{file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
]
[[package]]
name = "pefile"
version = "2024.8.26"
description = "Python PE parsing module"
optional = false
python-versions = ">=3.6.0"
files = [
{file = "pefile-2024.8.26-py3-none-any.whl", hash = "sha256:76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f"},
{file = "pefile-2024.8.26.tar.gz", hash = "sha256:3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632"},
]
[[package]]
name = "pycodestyle"
version = "2.8.0"
description = "Python style guide checker"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
{file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
{file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
]
[[package]]
name = "pyflakes"
version = "2.4.0"
description = "passive checker of Python programs"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
files = [
{file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"},
{file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
]
[[package]]
name = "pyinstaller"
version = "6.10.0"
description = "PyInstaller bundles a Python application and all its dependencies into a single package."
optional = false
python-versions = "<3.14,>=3.8"
files = [
{file = "pyinstaller-6.10.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:d60fb22859e11483af735aec115fdde09467cdbb29edd9844839f2c920b748c0"},
{file = "pyinstaller-6.10.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:46d75359668993ddd98630a3669dc5249f3c446e35239b43bc7f4155bc574748"},
{file = "pyinstaller-6.10.0-py3-none-manylinux2014_i686.whl", hash = "sha256:3398a98fa17d47ccb31f8779ecbdacec025f7adb2f22757a54b706ac8b4fe906"},
{file = "pyinstaller-6.10.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e9989f354ae4ed8a3bec7bdb37ae0d170751d6520e500f049c7cd0632d31d5c3"},
{file = "pyinstaller-6.10.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:b7c90c91921b3749083115b28f30f40abf2bb481ceff196d2b2ce0eaa2b3d429"},
{file = "pyinstaller-6.10.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6cf876d7d93b8b4f28d1ad57fa24645cf43119c79e985dd5e5f7a801245e6f53"},
{file = "pyinstaller-6.10.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:db05e3f2f10f9f78c56f1fb163d9cb453433429fe4281218ebaf1ebfd39ba942"},
{file = "pyinstaller-6.10.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:28eca3817f176fdc19747e1afcf434f13bb9f17a644f611be2c5a61b1f498ed7"},
{file = "pyinstaller-6.10.0-py3-none-win32.whl", hash = "sha256:703e041718987e46ba0568a2c71ecf2459fddef57cf9edf3efeed4a53e3dae3f"},
{file = "pyinstaller-6.10.0-py3-none-win_amd64.whl", hash = "sha256:95b55966e563e8b8f31a43882aea10169e9a11fdf38e626d86a2907b640c0701"},
{file = "pyinstaller-6.10.0-py3-none-win_arm64.whl", hash = "sha256:308e0a8670c9c9ac0cebbf1bbb492e71b6675606f2ec78bc4adfc830d209e087"},
{file = "pyinstaller-6.10.0.tar.gz", hash = "sha256:143840f8056ff7b910bf8f16f6cd92cc10a6c2680bb76d0a25d558d543d21270"},
]
[package.dependencies]
altgraph = "*"
importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
macholib = {version = ">=1.8", markers = "sys_platform == \"darwin\""}
packaging = ">=22.0"
pefile = {version = ">=2022.5.30", markers = "sys_platform == \"win32\""}
pyinstaller-hooks-contrib = ">=2024.8"
pywin32-ctypes = {version = ">=0.2.1", markers = "sys_platform == \"win32\""}
setuptools = ">=42.0.0"
[package.extras]
completion = ["argcomplete"]
hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"]
[[package]]
name = "pyinstaller-hooks-contrib"
version = "2025.1"
description = "Community maintained hooks for PyInstaller"
optional = false
python-versions = ">=3.8"
files = [
{file = "pyinstaller_hooks_contrib-2025.1-py3-none-any.whl", hash = "sha256:d3c799470cbc0bda60dcc8e6b4ab976777532b77621337f2037f558905e3a8e9"},
{file = "pyinstaller_hooks_contrib-2025.1.tar.gz", hash = "sha256:130818f9e9a0a7f2261f1fd66054966a3a50c99d000981c5d1db11d3ad0c6ab2"},
]
[package.dependencies]
importlib_metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
packaging = ">=22.0"
setuptools = ">=42.0.0"
[[package]]
name = "pywin32-ctypes"
version = "0.2.3"
description = "A (partial) reimplementation of pywin32 using ctypes/cffi"
optional = false
python-versions = ">=3.6"
files = [
{file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"},
{file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"},
]
[[package]]
name = "setuptools"
version = "75.3.2"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
optional = false
python-versions = ">=3.8"
files = [
{file = "setuptools-75.3.2-py3-none-any.whl", hash = "sha256:90ab613b6583fc02d5369cbca13ea26ea0e182d1df2d943ee9cbe81d4c61add9"},
{file = "setuptools-75.3.2.tar.gz", hash = "sha256:3c1383e1038b68556a382c1e8ded8887cd20141b0eb5708a6c8d277de49364f5"},
]
[package.extras]
check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"]
core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
enabler = ["pytest-enabler (>=2.2)"]
test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "ruff (<=0.7.1)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"]
type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"]
[[package]]
name = "zipp"
version = "3.20.2"
description = "Backport of pathlib-compatible object wrapper for zip files"
optional = false
python-versions = ">=3.8"
files = [
{file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"},
{file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"},
]
[package.extras]
check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
enabler = ["pytest-enabler (>=2.2)"]
test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
type = ["pytest-mypy"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.8,<3.14"
content-hash = "6db8fff0987f3dadb02cbf0e510a2d04b01ab2dc6d7b0fb32a0e33a8d30b3a58"
+17
View File
@@ -0,0 +1,17 @@
[tool.poetry]
name = "testactiontasks"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
[tool.poetry.dependencies]
python = ">=3.8,<3.14"
flake8 = "^4.0.1"
pyinstaller = "6.10.0"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
+623
View File
@@ -0,0 +1,623 @@
[
{
"pypy_version": "7.3.8rc2",
"python_version": "3.8.12",
"stable": false,
"latest_pypy": false,
"date": "2022-02-11",
"files": [
{
"filename": "pypy3.8-v7.3.8rc2-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-linux32.tar.bz2"
},
{
"filename": "pypy3.8-v7.3.8rc2-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-linux64.tar.bz2"
},
{
"filename": "pypy3.8-v7.3.8rc2-darwin64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-darwin64.tar.bz2"
},
{
"filename": "pypy3.8-v7.3.8rc2-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-s390x.tar.bz2"
},
{
"filename": "pypy3.8-v7.3.8rc2-win64.zip",
"arch": "x64",
"platform": "win64",
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-win64.zip"
},
{
"filename": "pypy3.8-v7.3.8rc2-win32.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy3.8-v7.3.8rc2-win32.zip"
}
]
},
{
"pypy_version": "7.4.0rc1",
"python_version": "3.6.12",
"stable": false,
"latest_pypy": false,
"date": "2021-11-11",
"files": [
{
"filename": "pypy3.6-v7.4.0rc1-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-aarch64.tar.bz2"
},
{
"filename": "pypy3.6-v7.4.0rc1-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-linux32.tar.bz2"
},
{
"filename": "pypy3.6-v7.4.0rc1-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-linux64.tar.bz2"
},
{
"filename": "pypy3.6-v7.4.0rc1-darwin64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-darwin64.tar.bz2"
},
{
"filename": "pypy3.6-v7.4.0rc1-win32.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-win32.zip"
},
{
"filename": "pypy3.6-v7.4.0rc1-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-s390x.tar.bz2"
}
]
},
{
"pypy_version": "7.3.3",
"python_version": "3.6.12",
"stable": true,
"latest_pypy": true,
"date": "2020-11-21",
"files": [
{
"filename": "pypy3.6-v7.3.3-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3-aarch64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.3-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3-linux32.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.3-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3-linux64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.3-darwin64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3-darwin64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.3-win32.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3-win32.zip"
},
{
"filename": "pypy3.6-v7.3.3-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3-s390x.tar.bz2"
}
]
},
{
"pypy_version": "7.3.3rc1",
"python_version": "3.6.12",
"stable": false,
"latest_pypy": false,
"date": "2020-11-11",
"files": [
{
"filename": "pypy3.6-v7.3.3rc1-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3rc1-aarch64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.3-linux32rc1.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3rc1-linux32.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.3rc1-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3rc1-linux64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.3rc1-osx64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3rc1-osx64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.3-win32rc1.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3rc1-win32.zip"
},
{
"filename": "pypy3.6-v7.3.3rc1-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.3rc1-s390x.tar.bz2"
}
]
},
{
"pypy_version": "7.3.4rc1",
"python_version": "2.7.18",
"stable": false,
"latest_pypy": false,
"date": "2021-03-19",
"files": [
{
"filename": "pypy2.7-v7.3.4rc1-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.downloads.python.org/pypy/pypy2.7-v7.3.4rc1-aarch64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.4rc1-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.downloads.python.org/pypy/pypy2.7-v7.3.4rc1-linux32.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.4rc1-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.downloads.python.org/pypy/pypy2.7-v7.3.4rc1-linux64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.4rc1-osx64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.downloads.python.org/pypy/pypy2.7-v7.3.4rc1-osx64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.4rc1-win64.zip",
"arch": "x64",
"platform": "win64",
"download_url": "https://test.downloads.python.org/pypy/pypy2.7-v7.3.4rc1-win64.zip"
}
]
},
{
"pypy_version": "7.3.3rc2",
"python_version": "3.7.7",
"stable": false,
"latest_pypy": false,
"date": "2020-11-11",
"files": [
{
"filename": "test.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "test.tar.bz2"
},
{
"filename": "test.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "test.tar.bz2"
},
{
"filename": "test.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "test.tar.bz2"
},
{
"filename": "test.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "test.tar.bz2"
},
{
"filename": "test.zip",
"arch": "x86",
"platform": "win32",
"download_url": "test.zip"
},
{
"filename": "test.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "test.tar.bz2"
}
]
},
{
"pypy_version": "7.3.3",
"python_version": "3.7.9",
"stable": true,
"latest_pypy": true,
"date": "2020-11-21",
"files": [
{
"filename": "pypy3.7-v7.3.3-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.3-aarch64.tar.bz2"
},
{
"filename": "pypy3.7-v7.3.3-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.3-linux32.tar.bz2"
},
{
"filename": "pypy3.7-v7.3.3-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.3-linux64.tar.bz2"
},
{
"filename": "pypy3.7-v7.3.3-osx64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.3-osx64.tar.bz2"
},
{
"filename": "pypy3.7-v7.3.3-win32.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.3-win32.zip"
},
{
"filename": "pypy3.7-v7.3.3-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.3-s390x.tar.bz2"
}
]
},
{
"pypy_version": "7.3.3",
"python_version": "2.7.18",
"stable": true,
"latest_pypy": true,
"date": "2020-11-21",
"files": [
{
"filename": "pypy2.7-v7.3.3-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.3-aarch64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.3-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.3-linux32.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.3-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.3-linux64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.3-osx64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.3-osx64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.3-win32.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.3-win32.zip"
},
{
"filename": "pypy2.7-v7.3.3-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.3-s390x.tar.bz2"
}
]
},
{
"pypy_version": "7.3.2",
"python_version": "3.6.9",
"stable": true,
"latest_pypy": true,
"date": "2020-09-25",
"files": [
{
"filename": "pypy3.6-v7.3.2-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.2-aarch64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.2-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.2-linux32.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.2-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.2-linux64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.2-osx64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.2-osx64.tar.bz2"
},
{
"filename": "pypy3.6-v7.3.2-win32.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.2-win32.zip"
},
{
"filename": "pypy3.6-v7.3.2-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.6-v7.3.2-s390x.tar.bz2"
}
]
},
{
"pypy_version": "7.3.2",
"python_version": "3.7.9",
"stable": true,
"latest_pypy": false,
"date": "2020-09-25",
"files": [
{
"filename": "pypy3.7-v7.3.2-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.2-aarch64.tar.bz2"
},
{
"filename": "pypy3.7-v7.3.2-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.2-linux32.tar.bz2"
},
{
"filename": "pypy3.7-v7.3.2-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.2-linux64.tar.bz2"
},
{
"filename": "pypy3.7-v7.3.2-osx64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.2-osx64.tar.bz2"
},
{
"filename": "pypy3.7-v7.3.2-win32.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.2-win32.zip"
},
{
"filename": "pypy3.7-v7.3.2-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy3.7-v7.3.2-s390x.tar.bz2"
}
]
},
{
"pypy_version": "7.3.2",
"python_version": "2.7.13",
"stable": true,
"latest_pypy": true,
"date": "2020-09-25",
"files": [
{
"filename": "pypy2.7-v7.3.2-aarch64.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.2-aarch64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.2-linux32.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.2-linux32.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.2-linux64.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.2-linux64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.2-osx64.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.2-osx64.tar.bz2"
},
{
"filename": "pypy2.7-v7.3.2-win32.zip",
"arch": "x86",
"platform": "win32",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.2-win32.zip"
},
{
"filename": "pypy2.7-v7.3.2-s390x.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "https://test.download.python.org/pypy/pypy2.7-v7.3.2-s390x.tar.bz2"
}
]
},
{
"pypy_version": "nightly",
"python_version": "2.7",
"stable": false,
"latest_pypy": false,
"files": [
{
"filename": "filename.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.zip",
"arch": "x86",
"platform": "win32",
"download_url": "http://nightlyBuilds.org/filename.zip"
},
{
"filename": "filename.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
}
]
},
{
"pypy_version": "nightly",
"python_version": "3.7",
"stable": false,
"latest_pypy": false,
"files": [
{
"filename": "filename.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.zip",
"arch": "x86",
"platform": "win32",
"download_url": "http://nightlyBuilds.org/filename.zip"
},
{
"filename": "filename.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
}
]
},
{
"pypy_version": "nightly",
"python_version": "3.6",
"stable": false,
"latest_pypy": false,
"files": [
{
"filename": "filename.tar.bz2",
"arch": "aarch64",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "i686",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "x64",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.tar.bz2",
"arch": "x64",
"platform": "darwin",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
},
{
"filename": "filename.zip",
"arch": "x86",
"platform": "win32",
"download_url": "http://nightlyBuilds.org/filename.zip"
},
{
"filename": "filename.tar.bz2",
"arch": "s390x",
"platform": "linux",
"download_url": "http://nightlyBuilds.org/filename.tar.bz2"
}
]
}
]
+12
View File
@@ -0,0 +1,12 @@
certifi==2020.6.20
chardet==3.0.4
docutils==0.16
idna==2.10
Kivy==2.0.0rc3
Kivy-Garden==0.1.4
packaging==20.7
pdf2image==1.12.1
Pygments==2.6.1
requests==2.32.2
urllib3==1.26.19
xlrd==1.2.0
+47
View File
@@ -0,0 +1,47 @@
altgraph==0.17.2
certifi==2020.6.20
chardet==3.0.4
docutils==0.16
future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'
idna==2.9
itsdangerous==1.1.0
kivy-deps-angle==0.3.0
kivy-deps.glew==0.1.12
kivy-deps.gstreamer==0.1.17
kivy-deps.sdl2==0.1.22
kivy-garden==0.1.4
kivy==1.11.1
packaging==21.0
pdf2image==1.12.1
pefile==2021.9.3; python_full_version >= '3.6.0'
pillow>=10.2.0
pygments==2.6.1
pyinstaller==6.10.0
pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'
pywin32-ctypes==0.2.0
requests==2.32.2
urllib3==1.26.19
xlrd==1.2.0
+77
View File
@@ -0,0 +1,77 @@
[
{
"version": "1.2.4-beta.2",
"stable": false,
"release_url": "https://github.com/actions/sometool/releases/tag/1.2.4-beta.2-20200402.5",
"files": [
{
"filename": "sometool-1.2.4-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.4-beta.2-20200402.5/sometool-1.2.4-linux-x64.tar.gz"
},
{
"filename": "sometool-1.2.4-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.4-beta.2-20200402.5/sometool-1.2.4-darwin-x64.tar.gz"
},
{
"filename": "sometool-1.2.4-win32-x64.tar.gz",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.4-beta.2-20200402.5/sometool-1.2.4-win32-x64.tar.gz"
}
]
},
{
"version": "1.2.3",
"stable": true,
"release_url": "https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6",
"files": [
{
"filename": "sometool-1.2.3-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-linux-x64.tar.gz"
},
{
"filename": "sometool-1.2.3-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-darwin-x64.tar.gz"
},
{
"filename": "sometool-1.2.3-win32-x64.tar.gz",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-win32-x64.tar.gz"
}
]
},
{
"version": "1.1.0-beta.2",
"stable": false,
"release_url": "https://github.com/actions/sometool/releases/tag/1.1.0-beta.2-20200402.5",
"files": [
{
"filename": "sometool-1.1.0-linux-x64.tar.gz",
"arch": "x64",
"platform": "linux",
"download_url": "https://github.com/actions/sometool/releases/tag/1.1.0-beta.2-20200402.5/sometool-1.1.0-linux-x64.tar.gz"
},
{
"filename": "sometool-1.1.0-darwin-x64.tar.gz",
"arch": "x64",
"platform": "darwin",
"download_url": "https://github.com/actions/sometool/releases/tag/1.1.0-beta.2-20200402.5/sometool-1.1.0-darwin-x64.tar.gz"
},
{
"filename": "sometool-1.1.0-win32-x64.tar.gz",
"arch": "x64",
"platform": "win32",
"download_url": "https://github.com/actions/sometool/releases/tag/1.1.0-beta.2-20200402.5/sometool-1.1.0-win32-x64.tar.gz"
}
]
}
]
+378
View File
@@ -0,0 +1,378 @@
import fs from 'fs';
import {HttpClient} from '@actions/http-client';
import * as ifm from '@actions/http-client/lib/interfaces';
import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec';
import * as core from '@actions/core';
import * as path from 'path';
import * as semver from 'semver';
import * as finder from '../src/find-graalpy';
import {IGraalPyManifestRelease, IS_WINDOWS} from '../src/utils';
import manifestData from './data/graalpy.json';
const architecture = 'x64';
const toolDir = path.join(__dirname, 'runner', 'tools');
const tempDir = path.join(__dirname, 'runner', 'temp');
/* GraalPy doesn't have a windows release yet */
const describeSkipOnWindows = IS_WINDOWS ? describe.skip : describe;
describe('parseGraalPyVersion', () => {
it.each([
['graalpy-23', '23'],
['graalpy-23.0', '23.0'],
['graalpy23.0', '23.0']
])('%s -> %s', (input, expected) => {
expect(finder.parseGraalPyVersion(input)).toEqual(expected);
});
it.each(['', 'graalpy-', 'graalpy', 'p', 'notgraalpy-'])(
'throw on invalid input "%s"',
input => {
expect(() => finder.parseGraalPyVersion(input)).toThrow(
"Invalid 'version' property for GraalPy. GraalPy version should be specified as 'graalpy<python-version>' or 'graalpy-<python-version>'. See README for examples and documentation."
);
}
);
});
describe('findGraalPyToolCache', () => {
const actualGraalPyVersion = '23.0.0';
const graalpyPath = path.join('GraalPy', actualGraalPyVersion, architecture);
let tcFind: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let addPathSpy: jest.SpyInstance;
let exportVariableSpy: jest.SpyInstance;
let setOutputSpy: jest.SpyInstance;
beforeEach(() => {
tcFind = jest.spyOn(tc, 'find');
tcFind.mockImplementation((toolname: string, pythonVersion: string) => {
const semverVersion = new semver.Range(pythonVersion);
return semver.satisfies(actualGraalPyVersion, semverVersion)
? graalpyPath
: '';
});
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => null);
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(() => null);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => null);
addPathSpy = jest.spyOn(core, 'addPath');
addPathSpy.mockImplementation(() => null);
exportVariableSpy = jest.spyOn(core, 'exportVariable');
exportVariableSpy.mockImplementation(() => null);
setOutputSpy = jest.spyOn(core, 'setOutput');
setOutputSpy.mockImplementation(() => null);
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
jest.restoreAllMocks();
});
it('GraalPy exists on the path and versions are satisfied', () => {
expect(finder.findGraalPyToolCache('23.0.0', architecture)).toEqual({
installDir: graalpyPath,
resolvedGraalPyVersion: actualGraalPyVersion
});
});
it('GraalPy exists on the path and versions are satisfied with semver', () => {
expect(finder.findGraalPyToolCache('23.0', architecture)).toEqual({
installDir: graalpyPath,
resolvedGraalPyVersion: actualGraalPyVersion
});
});
it("GraalPy exists on the path, but version doesn't match", () => {
expect(finder.findGraalPyToolCache('22.3', architecture)).toEqual({
installDir: '',
resolvedGraalPyVersion: ''
});
});
});
describeSkipOnWindows('findGraalPyVersion', () => {
let getBooleanInputSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
let addPathSpy: jest.SpyInstance;
let exportVariableSpy: jest.SpyInstance;
let setOutputSpy: jest.SpyInstance;
let tcFind: jest.SpyInstance;
let spyExtractZip: jest.SpyInstance;
let spyExtractTar: jest.SpyInstance;
let spyHttpClient: jest.SpyInstance;
let spyExistsSync: jest.SpyInstance;
let spyExec: jest.SpyInstance;
let spySymlinkSync: jest.SpyInstance;
let spyDownloadTool: jest.SpyInstance;
let spyFsReadDir: jest.SpyInstance;
let spyCacheDir: jest.SpyInstance;
let spyChmodSync: jest.SpyInstance;
let spyCoreAddPath: jest.SpyInstance;
let spyCoreExportVariable: jest.SpyInstance;
const env = process.env;
beforeEach(() => {
getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
getBooleanInputSpy.mockImplementation(() => false);
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => {});
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(() => null);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => null);
addPathSpy = jest.spyOn(core, 'addPath');
addPathSpy.mockImplementation(() => null);
exportVariableSpy = jest.spyOn(core, 'exportVariable');
exportVariableSpy.mockImplementation(() => null);
setOutputSpy = jest.spyOn(core, 'setOutput');
setOutputSpy.mockImplementation(() => null);
jest.resetModules();
process.env = {...env};
tcFind = jest.spyOn(tc, 'find');
tcFind.mockImplementation((tool: string, version: string) => {
const semverRange = new semver.Range(version);
let graalpyPath = '';
if (semver.satisfies('23.0.0', semverRange)) {
graalpyPath = path.join(toolDir, 'GraalPy', '23.0.0', architecture);
}
return graalpyPath;
});
spyDownloadTool = jest.spyOn(tc, 'downloadTool');
spyDownloadTool.mockImplementation(() => path.join(tempDir, 'GraalPy'));
spyExtractZip = jest.spyOn(tc, 'extractZip');
spyExtractZip.mockImplementation(() => tempDir);
spyExtractTar = jest.spyOn(tc, 'extractTar');
spyExtractTar.mockImplementation(() => tempDir);
spyFsReadDir = jest.spyOn(fs, 'readdirSync');
spyFsReadDir.mockImplementation((directory: string) => ['GraalPyTest']);
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockImplementation(
async (): Promise<ifm.TypedResponse<IGraalPyManifestRelease[]>> => {
const result = JSON.stringify(manifestData);
return {
statusCode: 200,
headers: {},
result: JSON.parse(result) as IGraalPyManifestRelease[]
};
}
);
spyExec = jest.spyOn(exec, 'exec');
spyExec.mockImplementation(() => undefined);
spySymlinkSync = jest.spyOn(fs, 'symlinkSync');
spySymlinkSync.mockImplementation(() => undefined);
spyExistsSync = jest.spyOn(fs, 'existsSync');
spyExistsSync.mockReturnValue(true);
spyCoreAddPath = jest.spyOn(core, 'addPath');
spyCoreExportVariable = jest.spyOn(core, 'exportVariable');
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
jest.restoreAllMocks();
process.env = env;
});
it('found GraalPy in toolcache', async () => {
await expect(
finder.findGraalPyVersion(
'graalpy-23.0',
architecture,
true,
false,
false
)
).resolves.toEqual('23.0.0');
expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation',
expect.anything()
);
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'PKG_CONFIG_PATH',
expect.anything()
);
});
it('throw on invalid input format', async () => {
await expect(
finder.findGraalPyVersion('graalpy-x23', architecture, true, false, false)
).rejects.toThrow();
});
it('found and install successfully', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'GraalPy', '23.0.0', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
finder.findGraalPyVersion(
'graalpy-23.0.0',
architecture,
true,
false,
false
)
).resolves.toEqual('23.0.0');
expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation',
expect.anything()
);
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'PKG_CONFIG_PATH',
expect.anything()
);
});
it('found and install successfully without environment update', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'GraalPy', '23.0.0', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
finder.findGraalPyVersion(
'graalpy-23.0.0',
architecture,
false,
false,
false
)
).resolves.toEqual('23.0.0');
expect(spyCoreAddPath).not.toHaveBeenCalled();
expect(spyCoreExportVariable).not.toHaveBeenCalled();
});
it('throw if release is not found', async () => {
await expect(
finder.findGraalPyVersion(
'graalpy-19.0.0',
architecture,
true,
false,
false
)
).rejects.toThrow(
`GraalPy version 19.0.0 with arch ${architecture} not found`
);
});
it('check-latest enabled version found and used from toolcache', async () => {
await expect(
finder.findGraalPyVersion(
'graalpy-23.0.0',
architecture,
false,
true,
false
)
).resolves.toEqual('23.0.0');
expect(infoSpy).toHaveBeenCalledWith('Resolved as GraalPy 23.0.0');
});
it('check-latest enabled version found and install successfully', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'GraalPy', '23.0.0', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
finder.findGraalPyVersion(
'graalpy-23.0.0',
architecture,
false,
true,
false
)
).resolves.toEqual('23.0.0');
expect(infoSpy).toHaveBeenCalledWith('Resolved as GraalPy 23.0.0');
});
it('check-latest enabled version is not found and used from toolcache', async () => {
tcFind.mockImplementationOnce((tool: string, version: string) => {
const semverRange = new semver.Range(version);
let graalpyPath = '';
if (semver.satisfies('22.3.4', semverRange)) {
graalpyPath = path.join(toolDir, 'GraalPy', '22.3.4', architecture);
}
return graalpyPath;
});
await expect(
finder.findGraalPyVersion(
'graalpy-22.3.4',
architecture,
false,
true,
false
)
).resolves.toEqual('22.3.4');
expect(infoSpy).toHaveBeenCalledWith(
'Failed to resolve GraalPy 22.3.4 from manifest'
);
});
it('found and install successfully, pre-release fallback', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'GraalPy', '23.1', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
finder.findGraalPyVersion(
'graalpy23.1',
architecture,
false,
false,
false
)
).rejects.toThrow();
await expect(
finder.findGraalPyVersion('graalpy23.1', architecture, false, false, true)
).resolves.toEqual('23.1.0-a.1');
});
});
+464
View File
@@ -0,0 +1,464 @@
import fs from 'fs';
import * as utils from '../src/utils';
import {HttpClient} from '@actions/http-client';
import * as ifm from '@actions/http-client/lib/interfaces';
import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec';
import * as core from '@actions/core';
import * as path from 'path';
import * as semver from 'semver';
import * as finder from '../src/find-pypy';
import {
IPyPyManifestRelease,
IS_WINDOWS,
getPyPyVersionFromPath
} from '../src/utils';
import manifestData from './data/pypy.json';
let architecture: string;
if (IS_WINDOWS) {
architecture = 'x86';
} else {
architecture = 'x64';
}
const toolDir = path.join(__dirname, 'runner', 'tools');
const tempDir = path.join(__dirname, 'runner', 'temp');
describe('parsePyPyVersion', () => {
it.each([
['pypy-3.6-v7.3.3', {pythonVersion: '3.6', pypyVersion: 'v7.3.3'}],
['pypy-3.6-v7.3.x', {pythonVersion: '3.6', pypyVersion: 'v7.3.x'}],
['pypy-3.6-v7.x', {pythonVersion: '3.6', pypyVersion: 'v7.x'}],
['pypy-3.6', {pythonVersion: '3.6', pypyVersion: 'x'}],
['pypy-3.6-nightly', {pythonVersion: '3.6', pypyVersion: 'nightly'}],
['pypy-3.6-v7.3.3rc1', {pythonVersion: '3.6', pypyVersion: 'v7.3.3-rc.1'}],
['pypy3.8-v7.3.7', {pythonVersion: '3.8', pypyVersion: 'v7.3.7'}],
['pypy3.8-v7.3.x', {pythonVersion: '3.8', pypyVersion: 'v7.3.x'}],
['pypy3.8-v7.x', {pythonVersion: '3.8', pypyVersion: 'v7.x'}],
['pypy3.8', {pythonVersion: '3.8', pypyVersion: 'x'}],
['pypy3.9-nightly', {pythonVersion: '3.9', pypyVersion: 'nightly'}],
['pypy3.9-v7.3.8rc1', {pythonVersion: '3.9', pypyVersion: 'v7.3.8-rc.1'}]
])('%s -> %s', (input, expected) => {
expect(finder.parsePyPyVersion(input)).toEqual(expected);
});
it.each(['', 'pypy-', 'pypy', 'p', 'notpypy-'])(
'throw on invalid input "%s"',
input => {
expect(() => finder.parsePyPyVersion(input)).toThrow(
"Invalid 'version' property for PyPy. PyPy version should be specified as 'pypy<python-version>' or 'pypy-<python-version>'. See README for examples and documentation."
);
}
);
it.each(['pypy-2', 'pypy-3', 'pypy2', 'pypy3', 'pypy3.x', 'pypy3.8.10'])(
'throw on invalid input "%s"',
input => {
expect(() => finder.parsePyPyVersion(input)).toThrow(
"Invalid format of Python version for PyPy. Python version should be specified in format 'x.y'. See README for examples and documentation."
);
}
);
});
describe('getPyPyVersionFromPath', () => {
it('/fake/toolcache/PyPy/3.6.5/x64 -> 3.6.5', () => {
expect(getPyPyVersionFromPath('/fake/toolcache/PyPy/3.6.5/x64')).toEqual(
'3.6.5'
);
});
});
describe('findPyPyToolCache', () => {
const actualPythonVersion = '3.6.17';
const actualPyPyVersion = '7.5.4';
const pypyPath = path.join('PyPy', actualPythonVersion, architecture);
let tcFind: jest.SpyInstance;
let spyReadExactPyPyVersion: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let addPathSpy: jest.SpyInstance;
let exportVariableSpy: jest.SpyInstance;
let setOutputSpy: jest.SpyInstance;
beforeEach(() => {
tcFind = jest.spyOn(tc, 'find');
tcFind.mockImplementation((toolname: string, pythonVersion: string) => {
const semverVersion = new semver.Range(pythonVersion);
return semver.satisfies(actualPythonVersion, semverVersion)
? pypyPath
: '';
});
spyReadExactPyPyVersion = jest.spyOn(utils, 'readExactPyPyVersionFile');
spyReadExactPyPyVersion.mockImplementation(() => actualPyPyVersion);
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => null);
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(() => null);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => null);
addPathSpy = jest.spyOn(core, 'addPath');
addPathSpy.mockImplementation(() => null);
exportVariableSpy = jest.spyOn(core, 'exportVariable');
exportVariableSpy.mockImplementation(() => null);
setOutputSpy = jest.spyOn(core, 'setOutput');
setOutputSpy.mockImplementation(() => null);
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
jest.restoreAllMocks();
});
it('PyPy exists on the path and versions are satisfied', () => {
expect(finder.findPyPyToolCache('3.6.17', 'v7.5.4', architecture)).toEqual({
installDir: pypyPath,
resolvedPythonVersion: actualPythonVersion,
resolvedPyPyVersion: actualPyPyVersion
});
});
it('PyPy exists on the path and versions are satisfied with semver', () => {
expect(finder.findPyPyToolCache('3.6', 'v7.5.x', architecture)).toEqual({
installDir: pypyPath,
resolvedPythonVersion: actualPythonVersion,
resolvedPyPyVersion: actualPyPyVersion
});
});
it("PyPy exists on the path, but Python version doesn't match", () => {
expect(finder.findPyPyToolCache('3.7', 'v7.5.4', architecture)).toEqual({
installDir: '',
resolvedPythonVersion: '',
resolvedPyPyVersion: ''
});
});
it("PyPy exists on the path, but PyPy version doesn't match", () => {
expect(finder.findPyPyToolCache('3.6', 'v7.5.1', architecture)).toEqual({
installDir: null,
resolvedPythonVersion: '',
resolvedPyPyVersion: ''
});
});
});
describe('findPyPyVersion', () => {
let getBooleanInputSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
let addPathSpy: jest.SpyInstance;
let exportVariableSpy: jest.SpyInstance;
let setOutputSpy: jest.SpyInstance;
let tcFind: jest.SpyInstance;
let spyExtractZip: jest.SpyInstance;
let spyExtractTar: jest.SpyInstance;
let spyHttpClient: jest.SpyInstance;
let spyExistsSync: jest.SpyInstance;
let spyExec: jest.SpyInstance;
let spySymlinkSync: jest.SpyInstance;
let spyDownloadTool: jest.SpyInstance;
let spyReadExactPyPyVersion: jest.SpyInstance;
let spyFsReadDir: jest.SpyInstance;
let spyWriteExactPyPyVersionFile: jest.SpyInstance;
let spyCacheDir: jest.SpyInstance;
let spyChmodSync: jest.SpyInstance;
let spyCoreAddPath: jest.SpyInstance;
let spyCoreExportVariable: jest.SpyInstance;
const env = process.env;
beforeEach(() => {
getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
getBooleanInputSpy.mockImplementation(() => false);
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => {});
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(() => null);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => null);
addPathSpy = jest.spyOn(core, 'addPath');
addPathSpy.mockImplementation(() => null);
exportVariableSpy = jest.spyOn(core, 'exportVariable');
exportVariableSpy.mockImplementation(() => null);
setOutputSpy = jest.spyOn(core, 'setOutput');
setOutputSpy.mockImplementation(() => null);
jest.resetModules();
process.env = {...env};
tcFind = jest.spyOn(tc, 'find');
tcFind.mockImplementation((tool: string, version: string) => {
const semverRange = new semver.Range(version);
let pypyPath = '';
if (semver.satisfies('3.6.12', semverRange)) {
pypyPath = path.join(toolDir, 'PyPy', '3.6.12', architecture);
}
return pypyPath;
});
spyWriteExactPyPyVersionFile = jest.spyOn(
utils,
'writeExactPyPyVersionFile'
);
spyWriteExactPyPyVersionFile.mockImplementation(() => null);
spyReadExactPyPyVersion = jest.spyOn(utils, 'readExactPyPyVersionFile');
spyReadExactPyPyVersion.mockImplementation(() => '7.3.3');
spyDownloadTool = jest.spyOn(tc, 'downloadTool');
spyDownloadTool.mockImplementation(() => path.join(tempDir, 'PyPy'));
spyExtractZip = jest.spyOn(tc, 'extractZip');
spyExtractZip.mockImplementation(() => tempDir);
spyExtractTar = jest.spyOn(tc, 'extractTar');
spyExtractTar.mockImplementation(() => tempDir);
spyFsReadDir = jest.spyOn(fs, 'readdirSync');
spyFsReadDir.mockImplementation((directory: string) => ['PyPyTest']);
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockImplementation(
async (): Promise<ifm.TypedResponse<IPyPyManifestRelease[]>> => {
const result = JSON.stringify(manifestData);
return {
statusCode: 200,
headers: {},
result: JSON.parse(result) as IPyPyManifestRelease[]
};
}
);
spyExec = jest.spyOn(exec, 'exec');
spyExec.mockImplementation(() => undefined);
spySymlinkSync = jest.spyOn(fs, 'symlinkSync');
spySymlinkSync.mockImplementation(() => undefined);
spyExistsSync = jest.spyOn(fs, 'existsSync');
spyExistsSync.mockReturnValue(true);
spyCoreAddPath = jest.spyOn(core, 'addPath');
spyCoreExportVariable = jest.spyOn(core, 'exportVariable');
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
jest.restoreAllMocks();
process.env = env;
});
it('found PyPy in toolcache', async () => {
await expect(
finder.findPyPyVersion(
'pypy-3.6-v7.3.x',
architecture,
true,
false,
false
)
).resolves.toEqual({
resolvedPythonVersion: '3.6.12',
resolvedPyPyVersion: '7.3.3'
});
expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation',
expect.anything()
);
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'PKG_CONFIG_PATH',
expect.anything()
);
});
it('throw on invalid input format', async () => {
await expect(
finder.findPyPyVersion('pypy3.7-v7.3.x', architecture, true, false, false)
).rejects.toThrow();
});
it('throw on invalid input format pypy3.7-7.3.x', async () => {
await expect(
finder.findPyPyVersion('pypy3.7-v7.3.x', architecture, true, false, false)
).rejects.toThrow();
});
it('found and install successfully', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'PyPy', '3.7.7', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
finder.findPyPyVersion(
'pypy-3.7-v7.3.x',
architecture,
true,
false,
false
)
).resolves.toEqual({
resolvedPythonVersion: '3.7.9',
resolvedPyPyVersion: '7.3.3'
});
expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation',
expect.anything()
);
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'PKG_CONFIG_PATH',
expect.anything()
);
});
it('found and install successfully without environment update', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'PyPy', '3.7.7', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
finder.findPyPyVersion(
'pypy-3.7-v7.3.x',
architecture,
false,
false,
false
)
).resolves.toEqual({
resolvedPythonVersion: '3.7.9',
resolvedPyPyVersion: '7.3.3'
});
expect(spyCoreAddPath).not.toHaveBeenCalled();
expect(spyCoreExportVariable).not.toHaveBeenCalled();
});
it('throw if release is not found', async () => {
await expect(
finder.findPyPyVersion(
'pypy-3.7-v7.5.x',
architecture,
true,
false,
false
)
).rejects.toThrow(
`PyPy version 3.7 (v7.5.x) with arch ${architecture} not found`
);
});
it('check-latest enabled version found and used from toolcache', async () => {
await expect(
finder.findPyPyVersion(
'pypy-3.6-v7.3.x',
architecture,
false,
true,
false
)
).resolves.toEqual({
resolvedPythonVersion: '3.6.12',
resolvedPyPyVersion: '7.3.3'
});
expect(infoSpy).toHaveBeenCalledWith(
'Resolved as PyPy 7.3.3 with Python (3.6.12)'
);
});
it('check-latest enabled version found and install successfully', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'PyPy', '3.7.7', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
finder.findPyPyVersion(
'pypy-3.7-v7.3.x',
architecture,
false,
true,
false
)
).resolves.toEqual({
resolvedPythonVersion: '3.7.9',
resolvedPyPyVersion: '7.3.3'
});
expect(infoSpy).toHaveBeenCalledWith(
'Resolved as PyPy 7.3.3 with Python (3.7.9)'
);
});
it('check-latest enabled version is not found and used from toolcache', async () => {
tcFind.mockImplementationOnce((tool: string, version: string) => {
const semverRange = new semver.Range(version);
let pypyPath = '';
if (semver.satisfies('3.8.8', semverRange)) {
pypyPath = path.join(toolDir, 'PyPy', '3.8.8', architecture);
}
return pypyPath;
});
await expect(
finder.findPyPyVersion(
'pypy-3.8-v7.3.x',
architecture,
false,
true,
false
)
).resolves.toEqual({
resolvedPythonVersion: '3.8.8',
resolvedPyPyVersion: '7.3.3'
});
expect(infoSpy).toHaveBeenCalledWith(
'Failed to resolve PyPy v7.3.x with Python (3.8) from manifest'
);
});
it('found and install successfully, pre-release fallback', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'PyPy', '3.8.12', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
finder.findPyPyVersion('pypy3.8', architecture, false, false, false)
).rejects.toThrow();
await expect(
finder.findPyPyVersion('pypy3.8', architecture, false, false, true)
).resolves.toEqual({
resolvedPythonVersion: '3.8.12',
resolvedPyPyVersion: '7.3.8rc2'
});
});
});
+43
View File
@@ -0,0 +1,43 @@
import {desugarVersion, pythonVersionToSemantic} from '../src/find-python';
describe('desugarVersion', () => {
it.each([
['3.13', {version: '3.13', freethreaded: false}],
['3.13t', {version: '3.13', freethreaded: true}],
['3.13.1', {version: '3.13.1', freethreaded: false}],
['3.13.1t', {version: '3.13.1', freethreaded: true}],
['3.14-dev', {version: '~3.14.0-0', freethreaded: false}],
['3.14t-dev', {version: '~3.14.0-0', freethreaded: true}]
])('%s -> %s', (input, expected) => {
expect(desugarVersion(input)).toEqual(expected);
});
});
// Test the combined desugarVersion and pythonVersionToSemantic functions
describe('pythonVersions', () => {
it.each([
['3.13', {version: '3.13', freethreaded: false}],
['3.13t', {version: '3.13', freethreaded: true}],
['3.13.1', {version: '3.13.1', freethreaded: false}],
['3.13.1t', {version: '3.13.1', freethreaded: true}],
['3.14-dev', {version: '~3.14.0-0', freethreaded: false}],
['3.14t-dev', {version: '~3.14.0-0', freethreaded: true}]
])('%s -> %s', (input, expected) => {
const {version, freethreaded} = desugarVersion(input);
const semanticVersionSpec = pythonVersionToSemantic(version, false);
expect({version: semanticVersionSpec, freethreaded}).toEqual(expected);
});
it.each([
['3.13', {version: '~3.13.0-0', freethreaded: false}],
['3.13t', {version: '~3.13.0-0', freethreaded: true}],
['3.13.1', {version: '3.13.1', freethreaded: false}],
['3.13.1t', {version: '3.13.1', freethreaded: true}],
['3.14-dev', {version: '~3.14.0-0', freethreaded: false}],
['3.14t-dev', {version: '~3.14.0-0', freethreaded: true}]
])('%s (allowPreReleases=true) -> %s', (input, expected) => {
const {version, freethreaded} = desugarVersion(input);
const semanticVersionSpec = pythonVersionToSemantic(version, true);
expect({version: semanticVersionSpec, freethreaded}).toEqual(expected);
});
});
+301
View File
@@ -0,0 +1,301 @@
import * as io from '@actions/io';
import os from 'os';
import fs from 'fs';
import path from 'path';
const toolDir = path.join(
__dirname,
'runner',
path.join(Math.random().toString(36).substring(7)),
'tools'
);
const tempDir = path.join(
__dirname,
'runner',
path.join(Math.random().toString(36).substring(7)),
'temp'
);
process.env['RUNNER_TOOL_CACHE'] = toolDir;
process.env['RUNNER_TEMP'] = tempDir;
import * as tc from '@actions/tool-cache';
import * as core from '@actions/core';
import * as finder from '../src/find-python';
import * as installer from '../src/install-python';
import manifestData from './data/versions-manifest.json';
describe('Finder tests', () => {
let writeSpy: jest.SpyInstance;
let spyCoreAddPath: jest.SpyInstance;
let spyCoreExportVariable: jest.SpyInstance;
const env = process.env;
beforeEach(() => {
writeSpy = jest.spyOn(process.stdout, 'write');
writeSpy.mockImplementation(() => {});
jest.resetModules();
process.env = {...env};
spyCoreAddPath = jest.spyOn(core, 'addPath');
spyCoreExportVariable = jest.spyOn(core, 'exportVariable');
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
jest.restoreAllMocks();
process.env = env;
});
it('Finds Python if it is installed', async () => {
const getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
getBooleanInputSpy.mockImplementation(input => false);
const pythonDir: string = path.join(toolDir, 'Python', '3.0.0', 'x64');
await io.mkdirP(pythonDir);
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await finder.useCpythonVersion('3.x', 'x64', true, false, false, false);
expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation',
expect.anything()
);
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'PKG_CONFIG_PATH',
expect.anything()
);
});
it('Finds Python if it is installed without environment update', async () => {
const pythonDir: string = path.join(toolDir, 'Python', '3.0.0', 'x64');
await io.mkdirP(pythonDir);
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await finder.useCpythonVersion('3.x', 'x64', false, false, false, false);
expect(spyCoreAddPath).not.toHaveBeenCalled();
expect(spyCoreExportVariable).not.toHaveBeenCalled();
});
it('Finds stable Python version if it is not installed, but exists in the manifest', async () => {
const findSpy: jest.SpyInstance = jest.spyOn(tc, 'getManifestFromRepo');
findSpy.mockImplementation(() => <tc.IToolRelease[]>manifestData);
const getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
getBooleanInputSpy.mockImplementation(input => false);
const installSpy: jest.SpyInstance = jest.spyOn(
installer,
'installCpythonFromRelease'
);
installSpy.mockImplementation(async () => {
const pythonDir: string = path.join(toolDir, 'Python', '1.2.3', 'x64');
await io.mkdirP(pythonDir);
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
});
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await expect(
finder.useCpythonVersion('1.2.3', 'x64', true, false, false, false)
).resolves.toEqual({
impl: 'CPython',
version: '1.2.3'
});
expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation',
expect.anything()
);
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'PKG_CONFIG_PATH',
expect.anything()
);
});
it('Finds pre-release Python version in the manifest', async () => {
const findSpy: jest.SpyInstance = jest.spyOn(tc, 'getManifestFromRepo');
findSpy.mockImplementation(() => <tc.IToolRelease[]>manifestData);
const getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
getBooleanInputSpy.mockImplementation(input => false);
const installSpy: jest.SpyInstance = jest.spyOn(
installer,
'installCpythonFromRelease'
);
installSpy.mockImplementation(async () => {
const pythonDir: string = path.join(
toolDir,
'Python',
'1.2.4-beta.2',
'x64'
);
await io.mkdirP(pythonDir);
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
});
// This will throw if it doesn't find it in the manifest (because no such version exists)
await expect(
finder.useCpythonVersion(
'1.2.4-beta.2',
'x64',
false,
false,
false,
false
)
).resolves.toEqual({
impl: 'CPython',
version: '1.2.4-beta.2'
});
});
it('Check-latest true, finds the latest version in the manifest', async () => {
const findSpy: jest.SpyInstance = jest.spyOn(tc, 'getManifestFromRepo');
findSpy.mockImplementation(() => <tc.IToolRelease[]>manifestData);
const getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput');
getBooleanInputSpy.mockImplementation(input => true);
const cnSpy: jest.SpyInstance = jest.spyOn(process.stdout, 'write');
cnSpy.mockImplementation(line => {
// uncomment to debug
// process.stderr.write('write:' + line + '\n');
});
const addPathSpy: jest.SpyInstance = jest.spyOn(core, 'addPath');
addPathSpy.mockImplementation(() => null);
const infoSpy: jest.SpyInstance = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => {});
const debugSpy: jest.SpyInstance = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => {});
const pythonDir: string = path.join(toolDir, 'Python', '1.2.2', 'x64');
const expPath: string = path.join(toolDir, 'Python', '1.2.3', 'x64');
const installSpy: jest.SpyInstance = jest.spyOn(
installer,
'installCpythonFromRelease'
);
installSpy.mockImplementation(async () => {
await io.mkdirP(expPath);
fs.writeFileSync(`${expPath}.complete`, 'hello');
});
const tcFindSpy: jest.SpyInstance = jest.spyOn(tc, 'find');
tcFindSpy
.mockImplementationOnce(() => '')
.mockImplementationOnce(() => expPath);
await io.mkdirP(pythonDir);
await io.rmRF(path.join(toolDir, 'Python', '1.2.3'));
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await finder.useCpythonVersion('1.2', 'x64', true, true, false, false);
expect(infoSpy).toHaveBeenCalledWith("Resolved as '1.2.3'");
expect(infoSpy).toHaveBeenCalledWith(
'Version 1.2.3 was not found in the local cache'
);
expect(infoSpy).toHaveBeenCalledWith(
'Version 1.2.3 is available for downloading'
);
expect(installSpy).toHaveBeenCalled();
expect(addPathSpy).toHaveBeenCalledWith(expPath);
await finder.useCpythonVersion(
'1.2.4-beta.2',
'x64',
false,
true,
false,
false
);
expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation',
expect.anything()
);
expect(spyCoreExportVariable).toHaveBeenCalledWith(
'PKG_CONFIG_PATH',
expect.anything()
);
});
it('Finds stable Python version if it is not installed, but exists in the manifest, skipping newer pre-release', async () => {
const findSpy: jest.SpyInstance = jest.spyOn(tc, 'getManifestFromRepo');
findSpy.mockImplementation(() => <tc.IToolRelease[]>manifestData);
const installSpy: jest.SpyInstance = jest.spyOn(
installer,
'installCpythonFromRelease'
);
installSpy.mockImplementation(async () => {
const pythonDir: string = path.join(toolDir, 'Python', '1.2.3', 'x64');
await io.mkdirP(pythonDir);
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
});
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await expect(
finder.useCpythonVersion('1.2', 'x64', false, false, false, false)
).resolves.toEqual({
impl: 'CPython',
version: '1.2.3'
});
});
it('Finds Python version if it is not installed, but exists in the manifest, pre-release fallback', async () => {
const findSpy: jest.SpyInstance = jest.spyOn(tc, 'getManifestFromRepo');
findSpy.mockImplementation(() => <tc.IToolRelease[]>manifestData);
const installSpy: jest.SpyInstance = jest.spyOn(
installer,
'installCpythonFromRelease'
);
installSpy.mockImplementation(async () => {
const pythonDir: string = path.join(
toolDir,
'Python',
'1.1.0-beta.2',
'x64'
);
await io.mkdirP(pythonDir);
fs.writeFileSync(`${pythonDir}.complete`, 'hello');
});
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await expect(
finder.useCpythonVersion('1.1', 'x64', false, false, false, false)
).rejects.toThrow();
await expect(
finder.useCpythonVersion('1.1', 'x64', false, false, true, false)
).resolves.toEqual({
impl: 'CPython',
version: '1.1.0-beta.2'
});
// Check 1.1.0 version specifier does not fallback to '1.1.0-beta.2'
await expect(
finder.useCpythonVersion('1.1.0', 'x64', false, false, true, false)
).rejects.toThrow();
});
it('Errors if Python is not installed', async () => {
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
let thrown = false;
try {
await finder.useCpythonVersion(
'3.300000',
'x64',
true,
false,
false,
false
);
} catch {
thrown = true;
}
expect(thrown).toBeTruthy();
expect(spyCoreAddPath).not.toHaveBeenCalled();
expect(spyCoreExportVariable).not.toHaveBeenCalled();
});
});
+256
View File
@@ -0,0 +1,256 @@
import fs from 'fs';
import {HttpClient} from '@actions/http-client';
import * as ifm from '@actions/http-client/lib/interfaces';
import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec';
import * as core from '@actions/core';
import * as path from 'path';
import * as installer from '../src/install-graalpy';
import {
IGraalPyManifestRelease,
IGraalPyManifestAsset,
IS_WINDOWS
} from '../src/utils';
import manifestData from './data/graalpy.json';
const architecture = 'x64';
const toolDir = path.join(__dirname, 'runner', 'tools');
const tempDir = path.join(__dirname, 'runner', 'temp');
/* GraalPy doesn't have a windows release yet */
const describeSkipOnWindows = IS_WINDOWS ? describe.skip : describe;
describe('graalpyVersionToSemantic', () => {
it.each([
['23.0.0a1', '23.0.0a1'],
['23.0.0', '23.0.0'],
['23.0.x', '23.0.x'],
['23.x', '23.x']
])('%s -> %s', (input, expected) => {
expect(installer.graalPyTagToVersion(input)).toEqual(expected);
});
});
describeSkipOnWindows('findRelease', () => {
const result = JSON.stringify(manifestData);
const releases = JSON.parse(result) as IGraalPyManifestRelease[];
const extension = 'tar.gz';
const arch = installer.toGraalPyArchitecture(architecture);
const platform = installer.toGraalPyPlatform(process.platform);
const extensionName = `${platform}-${arch}.${extension}`;
const files: IGraalPyManifestAsset = {
name: `graalpython-23.0.0-${extensionName}`,
browser_download_url: `https://github.com/oracle/graalpython/releases/download/graal-23.0.0/graalpython-23.0.0-${extensionName}`
};
const filesRC1: IGraalPyManifestAsset = {
name: `graalpython-23.1.0a1-${extensionName}`,
browser_download_url: `https://github.com/oracle/graalpython/releases/download/graal-23.1.0a1/graalpython-23.1.0a1-${extensionName}`
};
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
beforeEach(() => {
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => {});
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(() => null);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => null);
});
it("GraalPy version doesn't match", () => {
const graalpyVersion = '12.0.0';
expect(
installer.findRelease(releases, graalpyVersion, architecture, false)
).toEqual(null);
});
it('GraalPy version matches', () => {
const graalpyVersion = '23.0.0';
expect(
installer.findRelease(releases, graalpyVersion, architecture, false)
).toMatchObject({
foundAsset: files,
resolvedGraalPyVersion: graalpyVersion
});
});
it('Preview version of GraalPy is found', () => {
const graalpyVersion = installer.graalPyTagToVersion('vm-23.1.0a1');
expect(
installer.findRelease(releases, graalpyVersion, architecture, false)
).toMatchObject({
foundAsset: {
name: `graalpython-23.1.0a1-${extensionName}`,
browser_download_url: `https://github.com/oracle/graalpython/releases/download/graal-23.1.0a1/graalpython-23.1.0a1-${extensionName}`
},
resolvedGraalPyVersion: '23.1.0-a.1'
});
});
it('Latest GraalPy is found', () => {
const graalpyVersion = 'x';
expect(
installer.findRelease(releases, graalpyVersion, architecture, false)
).toMatchObject({
foundAsset: files,
resolvedGraalPyVersion: '23.0.0'
});
});
it('GraalPy version matches semver (pre-release)', () => {
const graalpyVersion = '23.1.x';
expect(
installer.findRelease(releases, graalpyVersion, architecture, false)
).toBeNull();
expect(
installer.findRelease(releases, graalpyVersion, architecture, true)
).toMatchObject({
foundAsset: filesRC1,
resolvedGraalPyVersion: '23.1.0-a.1'
});
});
});
describeSkipOnWindows('installGraalPy', () => {
let tcFind: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
let spyExtractZip: jest.SpyInstance;
let spyExtractTar: jest.SpyInstance;
let spyFsReadDir: jest.SpyInstance;
let spyFsWriteFile: jest.SpyInstance;
let spyHttpClient: jest.SpyInstance;
let spyExistsSync: jest.SpyInstance;
let spyExec: jest.SpyInstance;
let spySymlinkSync: jest.SpyInstance;
let spyDownloadTool: jest.SpyInstance;
let spyCacheDir: jest.SpyInstance;
let spyChmodSync: jest.SpyInstance;
beforeEach(() => {
tcFind = jest.spyOn(tc, 'find');
tcFind.mockImplementation(() =>
path.join('GraalPy', '3.6.12', architecture)
);
spyDownloadTool = jest.spyOn(tc, 'downloadTool');
spyDownloadTool.mockImplementation(() => path.join(tempDir, 'GraalPy'));
spyExtractZip = jest.spyOn(tc, 'extractZip');
spyExtractZip.mockImplementation(() => tempDir);
spyExtractTar = jest.spyOn(tc, 'extractTar');
spyExtractTar.mockImplementation(() => tempDir);
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => {});
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(() => null);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => null);
spyFsReadDir = jest.spyOn(fs, 'readdirSync');
spyFsReadDir.mockImplementation(() => ['GraalPyTest']);
spyFsWriteFile = jest.spyOn(fs, 'writeFileSync');
spyFsWriteFile.mockImplementation(() => undefined);
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockImplementation(
async (): Promise<ifm.TypedResponse<IGraalPyManifestRelease[]>> => {
const result = JSON.stringify(manifestData);
return {
statusCode: 200,
headers: {},
result: JSON.parse(result) as IGraalPyManifestRelease[]
};
}
);
spyExec = jest.spyOn(exec, 'exec');
spyExec.mockImplementation(() => undefined);
spySymlinkSync = jest.spyOn(fs, 'symlinkSync');
spySymlinkSync.mockImplementation(() => undefined);
spyExistsSync = jest.spyOn(fs, 'existsSync');
spyExistsSync.mockImplementation(() => false);
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
jest.restoreAllMocks();
});
it('throw if release is not found', async () => {
await expect(
installer.installGraalPy('7.3.3', architecture, false, undefined)
).rejects.toThrow(
`GraalPy version 7.3.3 with arch ${architecture} not found`
);
expect(spyHttpClient).toHaveBeenCalled();
expect(spyDownloadTool).not.toHaveBeenCalled();
expect(spyExec).not.toHaveBeenCalled();
});
it('found and install GraalPy', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'GraalPy', '21.3.0', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
installer.installGraalPy('21.x', architecture, false, undefined)
).resolves.toEqual({
installDir: path.join(toolDir, 'GraalPy', '21.3.0', architecture),
resolvedGraalPyVersion: '21.3.0'
});
expect(spyHttpClient).toHaveBeenCalled();
expect(spyDownloadTool).toHaveBeenCalled();
expect(spyCacheDir).toHaveBeenCalled();
expect(spyExec).toHaveBeenCalled();
});
it('found and install GraalPy, pre-release fallback', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'GraalPy', '23.1.0', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
installer.installGraalPy('23.1.x', architecture, false, undefined)
).rejects.toThrow();
await expect(
installer.installGraalPy('23.1.x', architecture, true, undefined)
).resolves.toEqual({
installDir: path.join(toolDir, 'GraalPy', '23.1.0', architecture),
resolvedGraalPyVersion: '23.1.0-a.1'
});
expect(spyHttpClient).toHaveBeenCalled();
expect(spyDownloadTool).toHaveBeenCalled();
expect(spyCacheDir).toHaveBeenCalled();
expect(spyExec).toHaveBeenCalled();
});
});
+356
View File
@@ -0,0 +1,356 @@
import fs from 'fs';
import {HttpClient} from '@actions/http-client';
import * as ifm from '@actions/http-client/lib/interfaces';
import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec';
import * as core from '@actions/core';
import * as path from 'path';
import * as installer from '../src/install-pypy';
import {
IPyPyManifestRelease,
IPyPyManifestAsset,
IS_WINDOWS
} from '../src/utils';
import manifestData from './data/pypy.json';
let architecture: string;
if (IS_WINDOWS) {
architecture = 'x86';
} else {
architecture = 'x64';
}
const toolDir = path.join(__dirname, 'runner', 'tools');
const tempDir = path.join(__dirname, 'runner', 'temp');
describe('pypyVersionToSemantic', () => {
it.each([
['7.3.3rc1', '7.3.3-rc.1'],
['7.3.3', '7.3.3'],
['7.3.x', '7.3.x'],
['7.x', '7.x'],
['nightly', 'nightly']
])('%s -> %s', (input, expected) => {
expect(installer.pypyVersionToSemantic(input)).toEqual(expected);
});
});
describe('findRelease', () => {
const result = JSON.stringify(manifestData);
const releases = JSON.parse(result) as IPyPyManifestRelease[];
const extension = IS_WINDOWS ? '.zip' : '.tar.bz2';
const extensionName = IS_WINDOWS
? `${process.platform}${extension}`
: `${process.platform}64${extension}`;
const files: IPyPyManifestAsset = {
filename: `pypy3.6-v7.3.3-${extensionName}`,
arch: architecture,
platform: process.platform,
download_url: `https://test.download.python.org/pypy/pypy3.6-v7.3.3-${extensionName}`
};
const filesRC1: IPyPyManifestAsset = {
filename: `pypy3.6-v7.4.0rc1-${extensionName}`,
arch: architecture,
platform: process.platform,
download_url: `https://test.download.python.org/pypy/pypy3.6-v7.4.0rc1-${extensionName}`
};
let getBooleanInputSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
beforeEach(() => {
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => {});
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(() => null);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => null);
});
it("Python version is found, but PyPy version doesn't match", () => {
const pythonVersion = '3.6';
const pypyVersion = '7.3.7';
expect(
installer.findRelease(
releases,
pythonVersion,
pypyVersion,
architecture,
false
)
).toEqual(null);
});
it('Python version is found and PyPy version matches', () => {
const pythonVersion = '3.6';
const pypyVersion = '7.3.3';
expect(
installer.findRelease(
releases,
pythonVersion,
pypyVersion,
architecture,
false
)
).toEqual({
foundAsset: files,
resolvedPythonVersion: '3.6.12',
resolvedPyPyVersion: pypyVersion
});
});
it('Python version is found in toolcache and PyPy version matches semver', () => {
const pythonVersion = '3.6';
const pypyVersion = '7.x';
expect(
installer.findRelease(
releases,
pythonVersion,
pypyVersion,
architecture,
false
)
).toEqual({
foundAsset: files,
resolvedPythonVersion: '3.6.12',
resolvedPyPyVersion: '7.3.3'
});
});
it('Python and preview version of PyPy are found', () => {
const pythonVersion = '3.7';
const pypyVersion = installer.pypyVersionToSemantic('7.3.3rc2');
expect(
installer.findRelease(
releases,
pythonVersion,
pypyVersion,
architecture,
false
)
).toEqual({
foundAsset: {
filename: `test${extension}`,
arch: architecture,
platform: process.platform,
download_url: `test${extension}`
},
resolvedPythonVersion: '3.7.7',
resolvedPyPyVersion: '7.3.3rc2'
});
});
it('Python version with latest PyPy is found', () => {
const pythonVersion = '3.6';
const pypyVersion = 'x';
expect(
installer.findRelease(
releases,
pythonVersion,
pypyVersion,
architecture,
false
)
).toEqual({
foundAsset: files,
resolvedPythonVersion: '3.6.12',
resolvedPyPyVersion: '7.3.3'
});
});
it('Python version and PyPy version matches semver (pre-release)', () => {
const pythonVersion = '3.6';
const pypyVersion = '7.4.x';
expect(
installer.findRelease(
releases,
pythonVersion,
pypyVersion,
architecture,
false
)
).toBeNull();
expect(
installer.findRelease(
releases,
pythonVersion,
pypyVersion,
architecture,
true
)
).toEqual({
foundAsset: filesRC1,
resolvedPythonVersion: '3.6.12',
resolvedPyPyVersion: '7.4.0rc1'
});
});
it('Nightly release is found', () => {
const pythonVersion = '3.6';
const pypyVersion = 'nightly';
const filename = IS_WINDOWS ? 'filename.zip' : 'filename.tar.bz2';
expect(
installer.findRelease(
releases,
pythonVersion,
pypyVersion,
architecture,
false
)
).toEqual({
foundAsset: {
filename: filename,
arch: architecture,
platform: process.platform,
download_url: `http://nightlyBuilds.org/${filename}`
},
resolvedPythonVersion: '3.6',
resolvedPyPyVersion: pypyVersion
});
});
});
describe('installPyPy', () => {
let tcFind: jest.SpyInstance;
let getBooleanInputSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
let debugSpy: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
let spyExtractZip: jest.SpyInstance;
let spyExtractTar: jest.SpyInstance;
let spyFsReadDir: jest.SpyInstance;
let spyFsWriteFile: jest.SpyInstance;
let spyHttpClient: jest.SpyInstance;
let spyExistsSync: jest.SpyInstance;
let spyExec: jest.SpyInstance;
let spySymlinkSync: jest.SpyInstance;
let spyDownloadTool: jest.SpyInstance;
let spyCacheDir: jest.SpyInstance;
let spyChmodSync: jest.SpyInstance;
beforeEach(() => {
tcFind = jest.spyOn(tc, 'find');
tcFind.mockImplementation(() => path.join('PyPy', '3.6.12', architecture));
spyDownloadTool = jest.spyOn(tc, 'downloadTool');
spyDownloadTool.mockImplementation(() => path.join(tempDir, 'PyPy'));
spyExtractZip = jest.spyOn(tc, 'extractZip');
spyExtractZip.mockImplementation(() => tempDir);
spyExtractTar = jest.spyOn(tc, 'extractTar');
spyExtractTar.mockImplementation(() => tempDir);
infoSpy = jest.spyOn(core, 'info');
infoSpy.mockImplementation(() => {});
warningSpy = jest.spyOn(core, 'warning');
warningSpy.mockImplementation(() => null);
debugSpy = jest.spyOn(core, 'debug');
debugSpy.mockImplementation(() => null);
spyFsReadDir = jest.spyOn(fs, 'readdirSync');
spyFsReadDir.mockImplementation(() => ['PyPyTest']);
spyFsWriteFile = jest.spyOn(fs, 'writeFileSync');
spyFsWriteFile.mockImplementation(() => undefined);
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockImplementation(
async (): Promise<ifm.TypedResponse<IPyPyManifestRelease[]>> => {
const result = JSON.stringify(manifestData);
return {
statusCode: 200,
headers: {},
result: JSON.parse(result) as IPyPyManifestRelease[]
};
}
);
spyExec = jest.spyOn(exec, 'exec');
spyExec.mockImplementation(() => undefined);
spySymlinkSync = jest.spyOn(fs, 'symlinkSync');
spySymlinkSync.mockImplementation(() => undefined);
spyExistsSync = jest.spyOn(fs, 'existsSync');
spyExistsSync.mockImplementation(() => false);
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
jest.restoreAllMocks();
});
it('throw if release is not found', async () => {
await expect(
installer.installPyPy('7.3.3', '3.6.17', architecture, false, undefined)
).rejects.toThrow(
`PyPy version 3.6.17 (7.3.3) with arch ${architecture} not found`
);
expect(spyHttpClient).toHaveBeenCalled();
expect(spyDownloadTool).not.toHaveBeenCalled();
expect(spyExec).not.toHaveBeenCalled();
});
it('found and install PyPy', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'PyPy', '3.6.12', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
installer.installPyPy('7.x', '3.6.12', architecture, false, undefined)
).resolves.toEqual({
installDir: path.join(toolDir, 'PyPy', '3.6.12', architecture),
resolvedPythonVersion: '3.6.12',
resolvedPyPyVersion: '7.3.3'
});
expect(spyHttpClient).toHaveBeenCalled();
expect(spyDownloadTool).toHaveBeenCalled();
expect(spyExistsSync).toHaveBeenCalled();
expect(spyCacheDir).toHaveBeenCalled();
expect(spyExec).toHaveBeenCalled();
});
it('found and install PyPy, pre-release fallback', async () => {
spyCacheDir = jest.spyOn(tc, 'cacheDir');
spyCacheDir.mockImplementation(() =>
path.join(toolDir, 'PyPy', '3.6.12', architecture)
);
spyChmodSync = jest.spyOn(fs, 'chmodSync');
spyChmodSync.mockImplementation(() => undefined);
await expect(
installer.installPyPy('7.4.x', '3.6.12', architecture, false, undefined)
).rejects.toThrow();
await expect(
installer.installPyPy('7.4.x', '3.6.12', architecture, true, undefined)
).resolves.toEqual({
installDir: path.join(toolDir, 'PyPy', '3.6.12', architecture),
resolvedPythonVersion: '3.6.12',
resolvedPyPyVersion: '7.4.0rc1'
});
expect(spyHttpClient).toHaveBeenCalled();
expect(spyDownloadTool).toHaveBeenCalled();
expect(spyExistsSync).toHaveBeenCalled();
expect(spyCacheDir).toHaveBeenCalled();
expect(spyExec).toHaveBeenCalled();
});
});
+77
View File
@@ -0,0 +1,77 @@
import {
getManifest,
getManifestFromRepo,
getManifestFromURL
} from '../src/install-python';
import * as httpm from '@actions/http-client';
import * as tc from '@actions/tool-cache';
jest.mock('@actions/http-client');
jest.mock('@actions/tool-cache');
jest.mock('@actions/tool-cache', () => ({
getManifestFromRepo: jest.fn()
}));
const mockManifest = [
{
version: '1.0.0',
stable: true,
files: [
{
filename: 'tool-v1.0.0-linux-x64.tar.gz',
platform: 'linux',
arch: 'x64',
download_url: 'https://example.com/tool-v1.0.0-linux-x64.tar.gz'
}
]
}
];
describe('getManifest', () => {
beforeEach(() => {
jest.resetAllMocks();
});
it('should return manifest from repo', async () => {
(tc.getManifestFromRepo as jest.Mock).mockResolvedValue(mockManifest);
const manifest = await getManifest();
expect(manifest).toEqual(mockManifest);
});
it('should return manifest from URL if repo fetch fails', async () => {
(tc.getManifestFromRepo as jest.Mock).mockRejectedValue(
new Error('Fetch failed')
);
(httpm.HttpClient.prototype.getJson as jest.Mock).mockResolvedValue({
result: mockManifest
});
const manifest = await getManifest();
expect(manifest).toEqual(mockManifest);
});
});
describe('getManifestFromRepo', () => {
it('should return manifest from repo', async () => {
(tc.getManifestFromRepo as jest.Mock).mockResolvedValue(mockManifest);
const manifest = await getManifestFromRepo();
expect(manifest).toEqual(mockManifest);
});
});
describe('getManifestFromURL', () => {
it('should return manifest from URL', async () => {
(httpm.HttpClient.prototype.getJson as jest.Mock).mockResolvedValue({
result: mockManifest
});
const manifest = await getManifestFromURL();
expect(manifest).toEqual(mockManifest);
});
it('should throw error if unable to get manifest from URL', async () => {
(httpm.HttpClient.prototype.getJson as jest.Mock).mockResolvedValue({
result: null
});
await expect(getManifestFromURL()).rejects.toThrow(
'Unable to get manifest from'
);
});
});
+7
View File
@@ -0,0 +1,7 @@
import numpy as np
a = np.array([2, 3, 4])
print(type(a))
b = np.array([1.2, 3.5, 5.1])
print(type(b))
+313
View File
@@ -0,0 +1,313 @@
import * as cache from '@actions/cache';
import * as core from '@actions/core';
import * as io from '@actions/io';
import fs from 'fs';
import path from 'path';
import {
validateVersion,
validatePythonVersionFormatForPyPy,
isCacheFeatureAvailable,
getVersionInputFromFile,
getVersionInputFromPlainFile,
getVersionInputFromTomlFile,
getNextPageUrl,
isGhes,
IS_WINDOWS,
getDownloadFileName,
getVersionInputFromToolVersions
} from '../src/utils';
jest.mock('@actions/cache');
jest.mock('@actions/core');
describe('validatePythonVersionFormatForPyPy', () => {
it.each([
['3.6', true],
['3.7', true],
['3.6.x', false],
['3.7.x', false],
['3.x', false],
['3', false]
])('%s -> %s', (input, expected) => {
expect(validatePythonVersionFormatForPyPy(input)).toEqual(expected);
});
});
describe('validateVersion', () => {
it.each([
['v7.3.3', true],
['v7.3.x', true],
['v7.x', true],
['x', true],
['v7.3.3-rc.1', true],
['nightly', true],
['v7.3.b', false],
['3.6', true],
['3.b', false],
['3', true]
])('%s -> %s', (input, expected) => {
expect(validateVersion(input)).toEqual(expected);
});
});
describe('isCacheFeatureAvailable', () => {
it('isCacheFeatureAvailable disabled on GHES', () => {
jest.spyOn(cache, 'isFeatureAvailable').mockImplementation(() => false);
const infoMock = jest.spyOn(core, 'warning');
const message =
'Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.';
try {
process.env['GITHUB_SERVER_URL'] = 'http://example.com';
expect(isCacheFeatureAvailable()).toBeFalsy();
expect(infoMock).toHaveBeenCalledWith(message);
} finally {
delete process.env['GITHUB_SERVER_URL'];
}
});
it('isCacheFeatureAvailable disabled on dotcom', () => {
jest.spyOn(cache, 'isFeatureAvailable').mockImplementation(() => false);
const infoMock = jest.spyOn(core, 'warning');
const message =
'The runner was not able to contact the cache service. Caching will be skipped';
try {
process.env['GITHUB_SERVER_URL'] = 'http://github.com';
expect(isCacheFeatureAvailable()).toBe(false);
expect(infoMock).toHaveBeenCalledWith(message);
} finally {
delete process.env['GITHUB_SERVER_URL'];
}
});
it('isCacheFeatureAvailable is enabled', () => {
jest.spyOn(cache, 'isFeatureAvailable').mockImplementation(() => true);
expect(isCacheFeatureAvailable()).toBe(true);
});
});
const tempDir = path.join(
__dirname,
'runner',
path.join(Math.random().toString(36).substring(7)),
'temp'
);
describe('Version from file test', () => {
it.each([getVersionInputFromPlainFile, getVersionInputFromFile])(
'Version from plain file test',
async _fn => {
await io.mkdirP(tempDir);
const pythonVersionFileName = 'python-version.file';
const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName);
const pythonVersionFileContent = '3.7';
fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent);
expect(_fn(pythonVersionFilePath)).toEqual([pythonVersionFileContent]);
}
);
it.each([getVersionInputFromTomlFile, getVersionInputFromFile])(
'Version from standard pyproject.toml test',
async _fn => {
await io.mkdirP(tempDir);
const pythonVersionFileName = 'pyproject.toml';
const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName);
const pythonVersion = '>=3.7.0';
const pythonVersionFileContent = `[project]\nrequires-python = "${pythonVersion}"`;
fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent);
expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]);
}
);
it.each([getVersionInputFromTomlFile, getVersionInputFromFile])(
'Version from poetry pyproject.toml test',
async _fn => {
await io.mkdirP(tempDir);
const pythonVersionFileName = 'pyproject.toml';
const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName);
const pythonVersion = '>=3.7.0';
const pythonVersionFileContent = `[tool.poetry.dependencies]\npython = "${pythonVersion}"`;
fs.writeFileSync(pythonVersionFilePath, pythonVersionFileContent);
expect(_fn(pythonVersionFilePath)).toEqual([pythonVersion]);
}
);
it.each([getVersionInputFromTomlFile, getVersionInputFromFile])(
'Version undefined',
async _fn => {
await io.mkdirP(tempDir);
const pythonVersionFileName = 'pyproject.toml';
const pythonVersionFilePath = path.join(tempDir, pythonVersionFileName);
fs.writeFileSync(pythonVersionFilePath, ``);
expect(_fn(pythonVersionFilePath)).toEqual([]);
}
);
it.each([getVersionInputFromToolVersions])(
'Version from .tool-versions',
async _fn => {
const toolVersionFileName = '.tool-versions';
const toolVersionFilePath = path.join(tempDir, toolVersionFileName);
const toolVersionContent = 'python 3.9.10\nnodejs 16';
fs.writeFileSync(toolVersionFilePath, toolVersionContent);
expect(_fn(toolVersionFilePath)).toEqual(['3.9.10']);
}
);
it.each([getVersionInputFromToolVersions])(
'Version from .tool-versions with comment',
async _fn => {
const toolVersionFileName = '.tool-versions';
const toolVersionFilePath = path.join(tempDir, toolVersionFileName);
const toolVersionContent = '# python 3.8\npython 3.9';
fs.writeFileSync(toolVersionFilePath, toolVersionContent);
expect(_fn(toolVersionFilePath)).toEqual(['3.9']);
}
);
it.each([getVersionInputFromToolVersions])(
'Version from .tool-versions with whitespace',
async _fn => {
const toolVersionFileName = '.tool-versions';
const toolVersionFilePath = path.join(tempDir, toolVersionFileName);
const toolVersionContent = ' python 3.10 ';
fs.writeFileSync(toolVersionFilePath, toolVersionContent);
expect(_fn(toolVersionFilePath)).toEqual(['3.10']);
}
);
it.each([getVersionInputFromToolVersions])(
'Version from .tool-versions with v prefix',
async _fn => {
const toolVersionFileName = '.tool-versions';
const toolVersionFilePath = path.join(tempDir, toolVersionFileName);
const toolVersionContent = 'python v3.9.10';
fs.writeFileSync(toolVersionFilePath, toolVersionContent);
expect(_fn(toolVersionFilePath)).toEqual(['3.9.10']);
}
);
it.each([getVersionInputFromToolVersions])(
'Version from .tool-versions with pypy version',
async _fn => {
const toolVersionFileName = '.tool-versions';
const toolVersionFilePath = path.join(tempDir, toolVersionFileName);
const toolVersionContent = 'python pypy3.10-7.3.14';
fs.writeFileSync(toolVersionFilePath, toolVersionContent);
expect(_fn(toolVersionFilePath)).toEqual(['pypy3.10-7.3.14']);
}
);
it.each([getVersionInputFromToolVersions])(
'Version from .tool-versions with alpha Releases',
async _fn => {
const toolVersionFileName = '.tool-versions';
const toolVersionFilePath = path.join(tempDir, toolVersionFileName);
const toolVersionContent = 'python 3.14.0a5t';
fs.writeFileSync(toolVersionFilePath, toolVersionContent);
expect(_fn(toolVersionFilePath)).toEqual(['3.14.0a5t']);
}
);
it.each([getVersionInputFromToolVersions])(
'Version from .tool-versions with dev suffix',
async _fn => {
const toolVersionFileName = '.tool-versions';
const toolVersionFilePath = path.join(tempDir, toolVersionFileName);
const toolVersionContent = 'python 3.14t-dev';
fs.writeFileSync(toolVersionFilePath, toolVersionContent);
expect(_fn(toolVersionFilePath)).toEqual(['3.14t-dev']);
}
);
});
describe('getNextPageUrl', () => {
it('GitHub API pagination next page is parsed correctly', () => {
function generateResponse(link: string) {
return {
statusCode: 200,
result: null,
headers: {
link: link
}
};
}
const page1Links =
'<https://api.github.com/repositories/129883600/releases?page=2>; rel="next", <https://api.github.com/repositories/129883600/releases?page=3>; rel="last"';
expect(getNextPageUrl(generateResponse(page1Links))).toStrictEqual(
'https://api.github.com/repositories/129883600/releases?page=2'
);
const page2Links =
'<https://api.github.com/repositories/129883600/releases?page=1>; rel="prev", <https://api.github.com/repositories/129883600/releases?page=1>; rel="first"';
expect(getNextPageUrl(generateResponse(page2Links))).toBeNull();
});
});
describe('getDownloadFileName', () => {
const originalEnv = process.env;
const tempDir = path.join(__dirname, 'runner', 'temp');
beforeEach(() => {
process.env = {...originalEnv};
});
afterEach(() => {
process.env = originalEnv;
});
it('should return the correct path on Windows', () => {
if (IS_WINDOWS) {
process.env['RUNNER_TEMP'] = tempDir;
const downloadUrl =
'https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-win32-x64.zip';
const expectedPath = path.join(
process.env.RUNNER_TEMP,
path.basename(downloadUrl)
);
expect(getDownloadFileName(downloadUrl)).toBe(expectedPath);
}
});
it('should return undefined on non-Windows', () => {
if (!IS_WINDOWS) {
const downloadUrl =
'https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-linux-x64.tar.gz';
expect(getDownloadFileName(downloadUrl)).toBeUndefined();
}
});
});
describe('isGhes', () => {
const pristineEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {...pristineEnv};
});
afterAll(() => {
process.env = pristineEnv;
});
it('returns false when the GITHUB_SERVER_URL environment variable is not defined', async () => {
delete process.env['GITHUB_SERVER_URL'];
expect(isGhes()).toBeFalsy();
});
it('returns false when the GITHUB_SERVER_URL environment variable is set to github.com', async () => {
process.env['GITHUB_SERVER_URL'] = 'https://github.com';
expect(isGhes()).toBeFalsy();
});
it('returns false when the GITHUB_SERVER_URL environment variable is set to a GitHub Enterprise Cloud-style URL', async () => {
process.env['GITHUB_SERVER_URL'] = 'https://contoso.ghe.com';
expect(isGhes()).toBeFalsy();
});
it('returns false when the GITHUB_SERVER_URL environment variable has a .localhost suffix', async () => {
process.env['GITHUB_SERVER_URL'] = 'https://mock-github.localhost';
expect(isGhes()).toBeFalsy();
});
it('returns true when the GITHUB_SERVER_URL environment variable is set to some other URL', async () => {
process.env['GITHUB_SERVER_URL'] = 'https://src.onpremise.fabrikam.com';
expect(isGhes()).toBeTruthy();
});
});
+3
View File
@@ -0,0 +1,3 @@
import sys
if __name__ == '__main__':
print(f"Using GIL: {sys._is_gil_enabled()}\n")
+22
View File
@@ -0,0 +1,22 @@
import sys
argCount = len(sys.argv) - 1
if argCount == 1:
expectedVersion = sys.argv[1]
versions = len(expectedVersion.split("."))
majorMinor = str(sys.version_info[0]) + '.' + str(sys.version_info[1])
if versions == 2:
# Test only major and minor version
if expectedVersion != majorMinor:
raise Exception("Incorrect major + minor version detected\nExpected: " + expectedVersion + "\nActual: " + majorMinor)
elif versions == 3:
# Test major, minor and micro version
majorMinorMicro = majorMinor + '.' + str(sys.version_info[2])
if expectedVersion != majorMinorMicro:
raise Exception("Incorrect major + minor + micro version detected\nExpected: " + expectedVersion + "\nActual: " + majorMinorMicro)
else:
raise Exception("Incorrect number of arguments supplied")
print("Correct version of Python " + expectedVersion + " detected")
else:
raise Exception("Incorrect number of arguments supplied")