Compare commits

...

45 Commits
v4.9.0 ... main

Author SHA1 Message Date
aparnajyothi-y
6ed2c67c8a
Fix for Candidate Not Iterable Error (#1082)
Some checks failed
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.13.1t) (push) Failing after 6m48s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.13.2t) (push) Successful in 17m15s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.0t) (push) Successful in 58m52s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.1t) (push) Failing after 1m32s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.2t) (push) Failing after 32s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.13.0t) (push) Failing after 31s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.13.1t) (push) Failing after 31s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.13.2t) (push) Failing after 32s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.0t) (push) Failing after 32s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.1t) (push) Failing after 31s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.2t) (push) Failing after 31s
e2e-cache freethread / Test poetry (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.13.0) (push) Failing after 32s
e2e-cache freethread / Test poetry (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.13.1) (push) Failing after 3h3m17s
e2e-cache freethread / Test poetry (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.13.2) (push) Failing after 19m9s
e2e-cache freethread / Test poetry (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.0) (push) Failing after 4m45s
e2e-cache freethread / Test poetry (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.1) (push) Failing after 12m7s
e2e-cache freethread / Test poetry (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-latest, 3.13.2) (push) Failing after 8m53s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-22.04, 3.13.0t) (push) Failing after 1m32s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-22.04, 3.13.1t) (push) Failing after 1m52s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-22.04, 3.13.2t) (push) Failing after 31s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-latest, 3.13.0t) (push) Failing after 32s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-latest, 3.13.1t) (push) Failing after 31s
e2e-cache freethread / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-latest, 3.13.2t) (push) Failing after 31s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-22.04, 3.13.0t) (push) Failing after 32s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-22.04, 3.13.1t) (push) Failing after 32s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-22.04, 3.13.2t) (push) Failing after 31s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-latest, 3.13.0t) (push) Failing after 31s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-latest, 3.13.1t) (push) Failing after 19s
e2e-cache freethread / Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path) (ubuntu-latest, 3.13.2t) (push) Failing after 1m32s
e2e-cache / Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) (ubuntu-22.04, 3.10) (push) Failing after 6m43s
* candidates not iterable

* update the error message

* update error to debug

* update debug to info

* error message updates
2025-04-17 08:55:44 -05:00
aparnajyothi-y
e348410e00
Remove Ubuntu 20.04 from workflows due to deprecation from 2025-04-15 (#1065)
Some checks failed
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-22.04, pypy3.10-v7.3.17) (push) Failing after 44m28s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-22.04, pypy3.11-v7.3.19) (push) Successful in 40m43s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-22.04, pypy3.9) (push) Successful in 8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7) (push) Successful in 7s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-2.7) (push) Successful in 8s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-3.10) (push) Successful in 3s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-3.11) (push) Successful in 4s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-22.04, pypy2.7) (push) Successful in 3s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-22.04, pypy3.10-nightly) (push) Failing after 11m33s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.12rc1) (push) Successful in 29m5s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.17) (push) Failing after 3h21m5s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10) (push) Failing after 6m47s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-nightly) (push) Failing after 26m55s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.16) (push) Failing after 3h17m19s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.17) (push) Failing after 1m32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.x) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.x) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.10-v7.3.17) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.11-v7.3.19) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.9) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-22.04, pypy3.11) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-22.04, pypy3.9) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Failing after 26s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.11) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Failing after 31s
Validate PyPy e2e / check-latest (ubuntu-22.04) (push) Failing after 31s
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Failing after 32s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-22.04) (push) Failing after 31s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Failing after 32s
* remove ubuntu-20.04

* check failure fix

* remove spaces

* npm run format-check
2025-04-11 13:36:23 -05:00
priya-kinthali
8d9ed9ac5c
Add e2e Testing for free threaded and Bump @action/cache from 4.0.0 to 4.0.3 (#1056)
Some checks failed
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10) (push) Failing after 1m32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-nightly) (push) Failing after 1m32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.16) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.17) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.x) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.x) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.10-v7.3.17) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.11-v7.3.19) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.9) (push) Failing after 32s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-2.7) (push) Failing after 31s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-3.10) (push) Failing after 27s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-3.11) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy2.7) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.10-nightly) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.11) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.9) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-22.04, pypy2.7) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-22.04, pypy3.10-nightly) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-22.04, pypy3.11) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-22.04, pypy3.9) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.11) (push) Successful in 6s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Successful in 6s
Validate PyPy e2e / check-latest (ubuntu-20.04) (push) Successful in 8s
Validate PyPy e2e / check-latest (ubuntu-22.04) (push) Successful in 8s
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Successful in 23s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-20.04) (push) Successful in 40s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-22.04) (push) Successful in 9s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Successful in 59s
* include freethread e2e testing and upgrade cache from 4.0.0 to 4.0.2

* include verify gil step and validated python version

* Rename files

* include ubuntu-arm runners for testing
2025-03-24 11:19:17 -05:00
mahabaleshwars
19e4675e06
Add support for .tool-versions file in setup-python (#1043)
Some checks failed
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-2.7-v7.3.17) (push) Failing after 1m31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10) (push) Successful in 8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-nightly) (push) Successful in 4m13s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.16) (push) Successful in 2m8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.17) (push) Successful in 4m14s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.x) (push) Successful in 8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.x) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy3.10-v7.3.17) (push) Successful in 31m54s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy3.9) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7) (push) Successful in 8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.12rc1) (push) Successful in 1h10m26s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.17) (push) Successful in 4m57s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10) (push) Successful in 8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-nightly) (push) Successful in 42s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.16) (push) Successful in 10m29s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.17) (push) Successful in 48m55s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.x) (push) Failing after 6m42s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.x) (push) Failing after 1m31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.10-v7.3.17) (push) Failing after 1m32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.9) (push) Failing after 1m32s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-2.7) (push) Failing after 26s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-3.10) (push) Successful in 8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy2.7) (push) Successful in 5s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.10-nightly) (push) Failing after 14m7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.9) (push) Failing after 1m31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Failing after 1m32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Successful in 3m23s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Failing after 1m32s
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Failing after 31s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Failing after 31s
* add support for .tool-versions file

* update regex

* optimize code

* update test-python.yml for .tool-versions

* fix format-check errors

* fix formatting in test-python.yml

* Fix test-python.yml error

* workflow update with latest versions

* update test cases

* fix lint issue
2025-03-13 10:21:27 -05:00
dependabot[bot]
6fd11e170a
Bump @actions/glob from 0.4.0 to 0.5.0 (#1015)
Some checks failed
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-24.04-arm, pypy-3.10) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2019, pypy-2.7) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2019, pypy-3.10) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2022, pypy-2.7) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2022, pypy-3.10) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2025, pypy-2.7) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2025, pypy-3.10) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / check-latest (macos-13) (push) Has been cancelled
Validate PyPy e2e / check-latest (macos-latest) (push) Has been cancelled
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Has been cancelled
Validate PyPy e2e / check-latest (windows-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (macos-13) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (macos-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (windows-latest) (push) Has been cancelled
* Bump @actions/glob from 0.4.0 to 0.5.0

Bumps [@actions/glob](https://github.com/actions/toolkit/tree/HEAD/packages/glob) from 0.4.0 to 0.5.0.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/glob/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/glob)

---
updated-dependencies:
- dependency-name: "@actions/glob"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix for check failures

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aparna Jyothi <aparnajyothi-y@github.com>
2025-03-12 12:00:26 -05:00
Sam Gross
9e62be81b2
Support free threaded Python versions like '3.13t' (#973)
Some checks failed
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2019, pypy-2.7) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2019, pypy-3.10) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2022, pypy-2.7) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2022, pypy-3.10) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2025, pypy-2.7) (push) Has been cancelled
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (windows-2025, pypy-3.10) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / check-latest (macos-13) (push) Has been cancelled
Validate PyPy e2e / check-latest (macos-latest) (push) Has been cancelled
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Has been cancelled
Validate PyPy e2e / check-latest (windows-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (macos-13) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (macos-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (windows-latest) (push) Has been cancelled
Update configuration files / Update configuration files (push) Has been cancelled
* Support free threaded Python versions like '3.13t'

Python wheels, pyenv, and a number of other tools use 't' in the Python
version number to identify free threaded builds. For example, '3.13t',
'3.14.0a1', '3.14t-dev'.

This PR supports that syntax in `actions/setup-python`, strips the "t",
and adds "-freethreading" to the architecture to select the correct
Python version.

See #771

* Add free threading to advanced usage documentation

* Fix desugaring of `3.13.1t` and add test case.

* Add freethreaded input and fix handling of prerelease versions

* Fix lint

* Add 't' suffix to python-version output

* Use distinct cache key for free threaded Python

* Remove support for syntax like '3.14.0a1'

* Clarify use of 't' suffix

* Improve error message when trying to use free threaded Python versions before 3.13
2025-03-04 16:49:43 -06:00
dependabot[bot]
6ca8e8598f
Bump @vercel/ncc from 0.38.1 to 0.38.3 (#1016)
Some checks failed
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-2.7-v7.3.17) (push) Successful in 2h45m25s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10) (push) Successful in 8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-nightly) (push) Successful in 2m18s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.16) (push) Successful in 1h17m47s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.17) (push) Failing after 12s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.x) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.x) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy3.10-v7.3.17) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy3.9) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.12rc1) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.17) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-nightly) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.16) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.17) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.x) (push) Failing after 12s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.x) (push) Failing after 11s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.10-v7.3.17) (push) Failing after 26s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.9) (push) Failing after 11s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-2.7) (push) Failing after 32s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-3.10) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy2.7) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.10-nightly) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.9) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Successful in 2m51s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Failing after 12s
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Failing after 6m33s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Successful in 35m5s
* Bump @vercel/ncc from 0.38.1 to 0.38.3

Bumps [@vercel/ncc](https://github.com/vercel/ncc) from 0.38.1 to 0.38.3.
- [Release notes](https://github.com/vercel/ncc/releases)
- [Commits](https://github.com/vercel/ncc/compare/0.38.1...0.38.3)

---
updated-dependencies:
- dependency-name: "@vercel/ncc"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* check failure fix

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aparna Jyothi <aparnajyothi-y@github.com>
2025-02-18 15:23:52 -06:00
Matthieu Darbois
8039c45ed9
fix: install PyPy on Linux ARM64 (#1011)
Some checks failed
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-2.7-v7.3.17) (push) Successful in 1h8m1s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-nightly) (push) Successful in 21m27s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.16) (push) Successful in 46m43s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.17) (push) Successful in 1h4m32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.x) (push) Successful in 8s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.x) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy3.10-v7.3.17) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy3.9) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.12rc1) (push) Failing after 3h17m30s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.17) (push) Successful in 9s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-nightly) (push) Successful in 5m29s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.16) (push) Failing after 1h8m39s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.17) (push) Successful in 53m59s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.x) (push) Successful in 9s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.x) (push) Successful in 10s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.10-v7.3.17) (push) Successful in 9s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.9) (push) Successful in 9s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-2.7) (push) Successful in 10s
Validate PyPy e2e / Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} (ubuntu-22.04, pypy-3.10) (push) Successful in 9s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy2.7) (push) Successful in 7s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.10-nightly) (push) Successful in 27m46s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.9) (push) Successful in 6s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Successful in 6s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Successful in 54m2s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Successful in 6s
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Failing after 16m5s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Failing after 6m30s
* ci: check non-eol versions of PyPy are available on all runners

* fix: install PyPy on Linux ARM64

* ci: remove eol ubuntu-20.04
2025-02-05 13:58:38 -06:00
Stephen Karl Larroque
42375524e2
Improve Advanced Usage examples (#645)
* docs: fix outputs python-version example and description

Description was lacking words, example was misleading (id was set to cp310 which clearly was a reference to CPython 3.10, but the id is referring to the setup-python action!

* docs: copy-editing in advanced-usage.md

Signed-off-by: Stephen L. <lrq3000@gmail.com>

* docs: add example if statement in advanced-usage.md

Signed-off-by: Stephen L. <lrq3000@gmail.com>

* docs: implement changes suggested by @mahabaleshwars (deprecate pypy2.7, 3.7, 3.8, tweak example, remove wildcard *)

Signed-off-by: Stephen L. <LRQ3000@gmail.com>

---------

Signed-off-by: Stephen L. <lrq3000@gmail.com>
Signed-off-by: Stephen L. <LRQ3000@gmail.com>
2025-01-27 13:04:33 -06:00
dependabot[bot]
709bfa58ba
Bump requests from 2.24.0 to 2.32.2 in /__tests__/data (#1019)
Bumps [requests](https://github.com/psf/requests) from 2.24.0 to 2.32.2.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.24.0...v2.32.2)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-27 13:01:28 -06:00
dependabot[bot]
ceb20b242d
Bump @actions/http-client from 2.2.1 to 2.2.3 (#1020)
* Bump @actions/http-client from 2.2.1 to 2.2.3

Bumps [@actions/http-client](https://github.com/actions/toolkit/tree/HEAD/packages/http-client) from 2.2.1 to 2.2.3.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/http-client/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/http-client)

---
updated-dependencies:
- dependency-name: "@actions/http-client"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix for licensed and check-dist checks failures

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aparna Jyothi <aparnajyothi-y@github.com>
2025-01-27 13:00:34 -06:00
dependabot[bot]
0dc2d2cf0c
Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 (#1014)
Bumps [actions/publish-immutable-action](https://github.com/actions/publish-immutable-action) from 0.0.3 to 0.0.4.
- [Release notes](https://github.com/actions/publish-immutable-action/releases)
- [Commits](https://github.com/actions/publish-immutable-action/compare/0.0.3...v0.0.4)

---
updated-dependencies:
- dependency-name: actions/publish-immutable-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-27 12:05:51 -06:00
dependabot[bot]
feb9c6e7c6
Bump urllib3 from 1.25.9 to 1.26.19 in /__tests__/data (#895)
Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.25.9 to 1.26.19.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/1.26.19/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.25.9...1.26.19)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-27 12:04:31 -06:00
dependabot[bot]
d0b4fc497a
Bump undici from 5.28.4 to 5.28.5 (#1012)
Some checks failed
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-v7.3.16) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-v7.3.17) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-v7.3.x) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-v7.x) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy3.10-v7.3.17) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / check-latest (macos-13) (push) Has been cancelled
Validate PyPy e2e / check-latest (macos-latest) (push) Has been cancelled
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Has been cancelled
Validate PyPy e2e / check-latest (windows-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (macos-13) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (macos-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (windows-latest) (push) Has been cancelled
* Bump undici from 5.28.4 to 5.28.5

Bumps [undici](https://github.com/nodejs/undici) from 5.28.4 to 5.28.5.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.28.4...v5.28.5)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix for chec-dist and license check failures

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aparna Jyothi <aparnajyothi-y@github.com>
2025-01-22 14:29:59 -06:00
HarithaVattikuti
e3dfaac0fd
Configure Dependabot settings (#1008)
* Create dependabot.yml

* Update e2e-cache.yml
2025-01-22 12:59:38 -06:00
Priya Gupta
b8cf3eb1eb
Use the new cache service: upgrade @actions/cache to ^4.0.0 (#1007)
Some checks failed
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (macos-latest, pypy-3.10-v7.3.x) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (macos-latest, pypy-3.10-v7.x) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (macos-latest, pypy3.10-v7.3.17) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (macos-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-2.7-v7.3.12rc1) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-2.7-v7.3.17) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-v7.3.16) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-v7.3.17) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-v7.3.x) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy-3.10-v7.x) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy3.10-v7.3.17) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (windows-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-13, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (macos-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy2.7) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy3.10-nightly) (push) Has been cancelled
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (windows-latest, pypy3.9) (push) Has been cancelled
Validate PyPy e2e / check-latest (macos-13) (push) Has been cancelled
Validate PyPy e2e / check-latest (macos-latest) (push) Has been cancelled
Validate PyPy e2e / check-latest (windows-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (macos-13) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (macos-latest) (push) Has been cancelled
Validate PyPy e2e / setup-pypy-multiple-versions (windows-latest) (push) Has been cancelled
* Upgrade-actions/cache

* Review licenses & update types

* Fixed poetry install command in e2e-cache.yml

* Updated package-lock.json
2025-01-21 15:57:07 -06:00
Ben Wells
1928ae624d
Update README.md (#1009) 2025-01-16 08:50:08 -06:00
priya-kinthali
3fddbee787
Enhance Workflows: Add Ubuntu-24, Remove Python 3.8 (#985)
Some checks failed
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-2.7) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-2.7-v7.3.12rc1) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-2.7-v7.3.17) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-nightly) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.16) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.17) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.3.x) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy-3.10-v7.x) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy3.10-v7.3.17) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-20.04, pypy3.9) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.12rc1) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-2.7-v7.3.17) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-nightly) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.16) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.17) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.3.x) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy-3.10-v7.x) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.10-v7.3.17) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (ubuntu-latest, pypy3.9) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy2.7) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.10-nightly) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-20.04, pypy3.9) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy2.7) (push) Failing after 32s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.10-nightly) (push) Failing after 31s
Validate PyPy e2e / Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) (ubuntu-latest, pypy3.9) (push) Failing after 32s
Validate PyPy e2e / check-latest (ubuntu-latest) (push) Failing after 31s
Validate PyPy e2e / setup-pypy-multiple-versions (ubuntu-latest) (push) Failing after 31s
* included ubuntu24 testing

* Remove Python 3.8 testing from workflows due to end of life (EOL)
2024-12-19 12:03:44 -06:00
aparnajyothi-y
55aad42e46
Update error message for no dependencies to cache (#968) 2024-11-04 19:27:40 -06:00
priya-kinthali
0b93645e9f
Enhance workflows: Add macOS 13 support, upgrade publish-action, and update documentation for arm64 and latest versions (#965)
* update ci workflows with latest versions and added macos-13

* updated document with latest versions
2024-10-24 08:38:22 -05:00
aparnajyothi-y
9c76e71650
Bump pillow from 7.2 to 10.2.0 in /__tests__/data (#956)
* Update e2e-cache.yml

* Update basic-validation.yml

* Pyinstaller upgrade to 5.13.1

* pyinstaller-update

* Update basic-validation.yml

* Update e2e-cache.yml

* fix-db-alert-164-165-166

* upgrade pillow
2024-10-21 15:39:11 -05:00
John Wesley Walker III
f4c5a1183d
Revise isGhes logic (#963)
* Revise `isGhes` logic

* ran `npm run format`

* add unit test

* ran `npm run format`
2024-10-21 11:42:17 -05:00
Jeff Widman
19dfb7b659
Bump default versions to latest (#905)
People copy/paste these values all the time... might as well start them off on the right foot with a modern default.
2024-10-04 11:28:10 -05:00
Joel Ambass
e9675cc634
Merge pull request #943 from actions/Jcambass-patch-1
Upgrade IA publish
2024-09-26 08:24:10 +02:00
Joel Ambass
3226af69c0
Upgrade IA publish 2024-09-16 17:18:49 +02:00
Joel Ambass
70dcb22d26
Merge pull request #941 from actions/Jcambass-patch-1
Add workflow file for publishing releases to immutable action package
2024-09-10 17:03:13 +02:00
Joel Ambass
65b48c7115
Create publish-immutable-actions.yml
This workflow file publishes new action releases to the immutable action package of the same name as this repo.

This is part of the Immutable Actions project which is not yet fully released to the public. First party actions like this one are part of our initial testing of this feature.
2024-09-10 16:54:46 +02:00
priya-kinthali
29a37be0a3
initial commit (#938) 2024-09-06 11:40:29 -05:00
aparnajyothi-y
f677139bbe
Bump pyinstaller from 3.6 to 5.13.1 in /__tests__/data (#923)
* Update e2e-cache.yml

* Update basic-validation.yml

* Pyinstaller upgrade to 5.13.1

* pyinstaller-update

* Update basic-validation.yml

* Update e2e-cache.yml
2024-08-13 14:03:23 -05:00
gowridurgad
2bd53f9a4d
Documentation update for caching poetry dependencies (#908)
* Create testing.yml

* Update testing.yml

* Fix for parsing version number from TOML 1.0.0 pyproject.toml file

* Delete .github/workflows/testing.yml

* fixed license issue

* updated the Note

* updated doc

* updated the doc

* npm run build

* Mark up corrections

---------

Co-authored-by: gowridurgad <gowridurga@github.com>
Co-authored-by: HarithaVattikuti <73516759+HarithaVattikuti@users.noreply.github.com>
2024-08-08 12:54:56 -05:00
Zxilly
80b49d3ed8
fix: add arch to cache key (#896)
* fix: add arch to cache key

* test: update tests accordingly
2024-08-07 15:12:32 -05:00
Priya Gupta
036a523674
Fix: Add .zip extension to Windows package downloads for Expand-Archive Compatibility (#916)
* Fix: specify filename during Windows package download

* Changed unit test download urls
2024-08-05 12:23:34 -05:00
sciencewhiz
04c1311429
Fix display of emojis in contributors doc (#899) 2024-07-23 09:16:08 -05:00
priya-kinthali
cb68456441
Updated @iarna/toml version to 3.0.0 (#912) 2024-07-22 13:50:49 -05:00
gowridurgad
39cd14951b
Documentation update for cache (#873)
* updated doc

* added note

* modify1

* Update advanced-usage.md

* Update 0000-caching-dependencies.md

---------

Co-authored-by: gowridurgad <gowridurga@github.com>
2024-07-10 08:48:13 -05:00
Matthieu Darbois
a0d74c0c42
fix(ci): update all failing workflows (#863)
* fix(ci): update all failing workflows

With `macos-latest` moving to `macos-14`, most workflows are currently failing.
Update them to be able to run on `macos-latest`

Don't test python 3.5 on ubuntu. It's been EOL for almost 4 years and there are now some certificate issues with pip.

* review: remove test with python 3.5, 3.6 & 3.7

* add latest versions to e2e-tests.yml
2024-06-27 13:18:32 -05:00
dependabot[bot]
4eb7dbcb95
Bump braces from 3.0.2 to 3.0.3 (#893)
* Bump braces from 3.0.2 to 3.0.3

Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump undici from 5.28.3 to 5.28.4

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: HarithaVattikuti <73516759+HarithaVattikuti@users.noreply.github.com>
2024-06-26 12:13:45 -05:00
priya-kinthali
82c7e631bb
Documentation changes for avoiding rate limit issues on GHES (#835)
* initial commit for documentation changes related to rawapi

* documentation changes and added check for validating raw api

* documenation changes for pr
2024-03-26 08:56:51 -05:00
Tobias
10aa35afd7
feat: fallback to raw endpoint for manifest when rate limit is reached (#766) 2024-03-26 08:56:00 -05:00
dependabot[bot]
9a7ac94420
Bump undici from 5.27.2 to 5.28.3 (#817)
* Bump undici from 5.27.2 to 5.28.3

Bumps [undici](https://github.com/nodejs/undici) from 5.27.2 to 5.28.3.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.27.2...v5.28.3)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* license check fix

* dependency fix

* nightly version issue fix

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: HarithaVattikuti <73516759+HarithaVattikuti@users.noreply.github.com>
2024-03-11 10:03:54 -05:00
Aliaksei Urbanski
871daa956c
Fix the "Specifying multiple Python/PyPy versions" link (#782)
The link was broken due to inconsistency between a table of content and
an actual title of a corresponding section of the Advanced Usage guide.
2024-01-24 14:44:08 -06:00
Russell Smith
2f078955e4
Fix broken README.md link (#793) 2024-01-18 11:33:07 +05:30
Bas Nijholt
e9d6f99097
Replace setup-python@v4 by setup-python@v5 in README (#776) 2023-12-14 16:28:18 +01:00
Dmitry Shibanov
0a5c615913
Update action to node20 (#772) 2023-12-05 14:52:09 +01:00
Dmitry Shibanov
0ae58361cd
Add example of GraalPy to docs (#773) 2023-12-05 11:40:46 +01:00
85 changed files with 80273 additions and 24752 deletions

22
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,22 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
# Enable version updates for npm
- package-ecosystem: 'npm'
# Look for `package.json` and `lock` files in the `root` directory
directory: '/'
# Check the npm registry for updates every day (weekdays)
schedule:
interval: 'weekly'
# Enable version updates for GitHub Actions
- package-ecosystem: 'github-actions'
# Workflow files stored in the default location of `.github/workflows`
# You don't need to specify `/.github/workflows` for `directory`. You can use `directory: "/"`.
directory: '/'
schedule:
interval: 'weekly'

View File

@ -13,3 +13,5 @@ jobs:
call-basic-validation: call-basic-validation:
name: Basic validation name: Basic validation
uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main
with:
node-version: '20.x'

View File

@ -15,3 +15,5 @@ jobs:
call-check-dist: call-check-dist:
name: Check dist/ name: Check dist/
uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main
with:
node-version: '20.x'

View File

@ -0,0 +1,164 @@
name: e2e-cache freethread
on:
pull_request:
paths-ignore:
- '**.md'
push:
branches:
- main
- releases/*
paths-ignore:
- '**.md'
workflow_dispatch:
permissions:
contents: read
jobs:
python-pip-dependencies-caching:
name: Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
ubuntu-latest,
ubuntu-22.04,
ubuntu-24.04-arm,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version: [3.13.0t, 3.13.1t, 3.13.2t]
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: ./
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install dependencies
run: pip install numpy pandas requests
python-pipenv-dependencies-caching:
name: Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
ubuntu-latest,
ubuntu-24.04-arm,
ubuntu-22.04,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version: [3.13.0t, 3.13.1t, 3.13.2t]
steps:
- uses: actions/checkout@v4
- name: Setup Python
id: cache-pipenv
uses: ./
with:
python-version: ${{ matrix.python-version }}
cache: 'pipenv'
- name: Install pipenv
run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python
- name: Install dependencies
run: pipenv install requests
python-poetry-dependencies-caching:
name: Test poetry (Python ${{ matrix.python-version}}, ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
ubuntu-latest,
ubuntu-22.04,
ubuntu-24.04-arm,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version: [3.13.0, 3.13.1, 3.13.2]
steps:
- uses: actions/checkout@v4
- name: Install poetry
run: pipx install poetry
- name: Init pyproject.toml
run: mv ./__tests__/data/pyproject.toml .
- name: Setup Python
uses: ./
with:
python-version: ${{ matrix.python-version }}
freethreaded: true
cache: 'poetry'
- name: Install dependencies
run: poetry install --no-root
python-pip-dependencies-caching-path:
name: Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path)
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
ubuntu-latest,
ubuntu-22.04,
ubuntu-24.04-arm,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version: [3.13.0t, 3.13.1t, 3.13.2t]
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: ./
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
cache-dependency-path: __tests__/data/requirements.txt
- name: Install dependencies
run: pip install numpy pandas requests
python-pipenv-dependencies-caching-path:
name: Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path)
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
ubuntu-latest,
ubuntu-22.04,
ubuntu-24.04-arm,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version: [3.13.0t, 3.13.1t, 3.13.2t]
steps:
- uses: actions/checkout@v4
- name: Setup Python
id: cache-pipenv
uses: ./
with:
python-version: ${{ matrix.python-version }}
cache: 'pipenv'
cache-dependency-path: '**/pipenv-requirements.txt'
- name: Install pipenv
run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python
- name: Install dependencies
run: pipenv install requests

View File

@ -10,6 +10,7 @@ on:
- releases/* - releases/*
paths-ignore: paths-ignore:
- '**.md' - '**.md'
workflow_dispatch:
permissions: permissions:
contents: read contents: read
@ -20,8 +21,30 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
python-version: ['3.9', 'pypy-3.7-v7.x'] [
ubuntu-latest,
ubuntu-24.04-arm,
ubuntu-22.04,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version:
[
'3.9',
'pypy-3.9-v7.x',
'3.10',
'pypy-3.10-v7.x',
'3.11',
'pypy-3.11-v7.x',
'3.12',
'3.13'
]
exclude:
- os: windows-latest
python-version: pypy-3.11-v7.x
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Python - name: Setup Python
@ -38,8 +61,29 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
python-version: ['3.9', 'pypy-3.9-v7.x'] [
ubuntu-latest,
ubuntu-24.04-arm,
ubuntu-22.04,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version:
['3.10', 'pypy-3.10-v7.x', '3.11', 'pypy-3.11-v7.x', '3.12', '3.13']
exclude:
- os: windows-latest
python-version: pypy-3.11-v7.x
- os: ubuntu-22.04
python-version: pypy-3.11-v7.x
- os: ubuntu-22.04-arm
python-version: pypy-3.10-v7.x
- os: ubuntu-22.04-arm
python-version: pypy-3.11-v7.x
- os: ubuntu-22.04-arm
python-version: pypy-3.10-v7.x
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Python - name: Setup Python
@ -74,8 +118,27 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
python-version: ['3.9', 'pypy-3.8'] [
ubuntu-latest,
ubuntu-24.04-arm,
ubuntu-22.04,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version:
[
'3.9',
'pypy-3.9-v7.x',
'3.10',
'pypy-3.10-v7.x',
'3.11',
'pypy-3.11-v7.x',
'3.12',
'3.13'
]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Install poetry - name: Install poetry
@ -88,16 +151,38 @@ jobs:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
cache: 'poetry' cache: 'poetry'
- name: Install dependencies - name: Install dependencies
run: poetry install run: poetry install --no-root
python-pip-dependencies-caching-path: python-pip-dependencies-caching-path:
name: Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}) name: Test pip (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path)
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
python-version: ['3.9', 'pypy-3.7-v7.x'] [
ubuntu-latest,
ubuntu-24.04-arm,
ubuntu-22.04,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version:
[
'3.9',
'pypy-3.9-v7.x',
'3.10',
'pypy-3.10-v7.x',
'3.11',
'pypy-3.11-v7.x',
'3.12',
'3.13'
]
exclude:
- os: windows-latest
python-version: pypy-3.11-v7.x
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Python - name: Setup Python
@ -110,13 +195,32 @@ jobs:
run: pip install numpy pandas requests run: pip install numpy pandas requests
python-pipenv-dependencies-caching-path: python-pipenv-dependencies-caching-path:
name: Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}) name: Test pipenv (Python ${{ matrix.python-version}}, ${{ matrix.os }}, caching path)
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
python-version: ['3.9', 'pypy-3.9-v7.x'] [
ubuntu-latest,
ubuntu-24.04-arm,
ubuntu-22.04,
ubuntu-22.04-arm,
windows-latest,
macos-latest,
macos-13
]
python-version:
['3.10', 'pypy-3.10-v7.x', '3.11', 'pypy-3.11-v7.x', '3.12', '3.13']
exclude:
- os: windows-latest
python-version: pypy-3.11-v7.x
- os: ubuntu-22.04
python-version: pypy-3.11-v7.x
- os: ubuntu-22.04-arm
python-version: pypy-3.10-v7.x
- os: ubuntu-22.04-arm
python-version: pypy-3.11-v7.x
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Python - name: Setup Python

View File

@ -9,6 +9,7 @@ on:
pull_request: pull_request:
paths-ignore: paths-ignore:
- '**.md' - '**.md'
workflow_dispatch:
jobs: jobs:
test-setup-python: test-setup-python:
@ -16,80 +17,79 @@ jobs:
runs-on: ${{ matrix.operating-system }} runs-on: ${{ matrix.operating-system }}
strategy: strategy:
matrix: matrix:
operating-system: [ubuntu-20.04, windows-latest] operating-system:
[
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-latest,
ubuntu-24.04-arm,
macos-latest,
macos-13
]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Run with setup-python 3.5 - name: Run with setup-python 3.9.13
uses: ./ uses: ./
with: with:
python-version: 3.5 python-version: 3.9.13
- name: Verify 3.5 - name: Verify 3.9.13
run: python __tests__/verify-python.py 3.5 run: python __tests__/verify-python.py 3.9.13
- name: Run with setup-python 3.6 - name: Run with setup-python 3.9.13
uses: ./ uses: ./
with: with:
python-version: 3.6 python-version: 3.10.11
- name: Verify 3.6 - name: Verify 3.10.11
run: python __tests__/verify-python.py 3.6 run: python __tests__/verify-python.py 3.10.11
- name: Run with setup-python 3.7 - name: Run with setup-python 3.11.9
uses: ./ uses: ./
with: with:
python-version: 3.7 python-version: 3.11.9
- name: Verify 3.7 - name: Verify 3.11.9
run: python __tests__/verify-python.py 3.7 run: python __tests__/verify-python.py 3.11.9
- name: Run with setup-python 3.8 - name: Run with setup-python 3.12.7
uses: ./ uses: ./
with: with:
python-version: 3.8 python-version: 3.12.7
- name: Verify 3.8 - name: Verify 3.12.7
run: python __tests__/verify-python.py 3.8 run: python __tests__/verify-python.py 3.12.7
- name: Run with setup-python 3.7.5 - name: Run with setup-python 3.13.0
uses: ./ uses: ./
with: with:
python-version: 3.7.5 python-version: 3.13.0
- name: Verify 3.7.5 - name: Verify 3.13.0
run: python __tests__/verify-python.py 3.7.5 run: python __tests__/verify-python.py 3.13.0
- name: Run with setup-python 3.6.7 - name: Run with setup-python 3.13
id: cp313
uses: ./ uses: ./
with: with:
python-version: 3.6.7 python-version: '3.13'
- name: Verify 3.6.7 - name: Verify 3.13
run: python __tests__/verify-python.py 3.6.7 run: python __tests__/verify-python.py 3.13
- name: Run python-path sample 3.13
run: pipx run --python '${{ steps.cp313.outputs.python-path }}' nox --version
- name: Run with setup-python 3.8.1 - name: Run with setup-python ==3.13
uses: ./ uses: ./
with: with:
python-version: 3.8.1 python-version: '==3.13'
- name: Verify 3.8.1 - name: Verify ==3.13
run: python __tests__/verify-python.py 3.8.1 run: python __tests__/verify-python.py 3.13
- name: Run with setup-python 3.10 - name: Run with setup-python <3.13
id: cp310
uses: ./ uses: ./
with: with:
python-version: '3.10' python-version: '<3.13'
- name: Verify 3.10 - name: Verify <3.13
run: python __tests__/verify-python.py 3.10 run: python __tests__/verify-python.py 3.12
- name: Run python-path sample 3.10 - name: Test Raw Endpoint Access
run: pipx run --python '${{ steps.cp310.outputs.python-path }}' nox --version run: |
curl -L https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json | jq empty
- name: Run with setup-python ==3.8 shell: bash
uses: ./
with:
python-version: '==3.8'
- name: Verify ==3.8
run: python __tests__/verify-python.py 3.8
- name: Run with setup-python <3.11
uses: ./
with:
python-version: '<3.11'
- name: Verify <3.11
run: python __tests__/verify-python.py 3.10

View File

@ -0,0 +1,20 @@
name: 'Publish Immutable Action Version'
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
packages: write
steps:
- name: Checking out
uses: actions/checkout@v4
- name: Publish
id: publish
uses: actions/publish-immutable-action@v0.0.4

View File

@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Update the ${{ env.TAG_NAME }} tag - name: Update the ${{ env.TAG_NAME }} tag
uses: actions/publish-action@v0.2.2 uses: actions/publish-action@v0.3.0
with: with:
source-tag: ${{ env.TAG_NAME }} source-tag: ${{ env.TAG_NAME }}
slack-webhook: ${{ secrets.SLACK_WEBHOOK }} slack-webhook: ${{ secrets.SLACK_WEBHOOK }}

View File

@ -9,6 +9,7 @@ on:
pull_request: pull_request:
paths-ignore: paths-ignore:
- '**.md' - '**.md'
workflow_dispatch:
jobs: jobs:
setup-graalpy: setup-graalpy:
@ -17,10 +18,20 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, ubuntu-20.04, ubuntu-latest] os:
[
macos-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
graalpy: graalpy:
- 'graalpy-23.0'
- 'graalpy-22.3' - 'graalpy-22.3'
- 'graalpy-23.0'
- 'graalpy-23.1'
- 'graalpy-24.1'
steps: steps:
- name: Checkout - name: Checkout
@ -62,8 +73,16 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, ubuntu-20.04, ubuntu-latest] os:
graalpy: ['graalpy23.0', 'graalpy22.3'] [
macos-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
graalpy: ['graalpy22.3', 'graalpy23.0', 'graalpy23.1', 'graalpy24.1']
steps: steps:
- name: Checkout - name: Checkout
@ -87,14 +106,14 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, macos-latest] os: [ubuntu-latest, macos-latest, macos-13]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup GraalPy and check latest - name: Setup GraalPy and check latest
uses: ./ uses: ./
id: graalpy id: graalpy
with: with:
python-version: 'graalpy-23.x' python-version: 'graalpy-24.x'
check-latest: true check-latest: true
- name: GraalPy and Python version - name: GraalPy and Python version
run: python --version run: python --version

View File

@ -11,6 +11,7 @@ on:
- '**.md' - '**.md'
schedule: schedule:
- cron: 30 3 * * * - cron: 30 3 * * *
workflow_dispatch:
jobs: jobs:
setup-pypy: setup-pypy:
@ -19,19 +20,82 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-latest] os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
pypy: pypy:
- 'pypy-2.7' - 'pypy-2.7'
- 'pypy-3.7' - 'pypy-3.10'
- 'pypy3.9' - 'pypy3.9'
- 'pypy-2.7-v7.3.4' - 'pypy-2.7-v7.3.17'
- 'pypy-3.7-v7.3.5' - 'pypy-3.10-v7.3.17'
- 'pypy-3.7-v7.3.4' - 'pypy-3.10-v7.3.16'
- 'pypy-3.7-v7.3.x' - 'pypy-3.10-v7.3.x'
- 'pypy-3.7-v7.x' - 'pypy-3.10-v7.x'
- 'pypy-2.7-v7.3.4rc1' - 'pypy-2.7-v7.3.12rc1'
- 'pypy-3.7-nightly' - 'pypy-3.10-nightly'
- 'pypy3.8-v7.3.7' - 'pypy3.10-v7.3.17'
- 'pypy3.11-v7.3.19'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: setup-python ${{ matrix.pypy }}
id: setup-python
uses: ./
with:
python-version: ${{ matrix.pypy }}
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: PyPy and Python version
run: python --version
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
- name: Assert PyPy is running
run: |
import platform
assert platform.python_implementation().lower() == "pypy"
shell: python
- name: Assert expected binaries (or symlinks) are present
run: |
EXECUTABLE=${{ matrix.pypy }}
EXECUTABLE=${EXECUTABLE/pypy-/pypy} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name
EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe
${EXECUTABLE} --version
shell: bash
check-non-eol:
name: Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
- macos-13
- macos-14
- macos-15
- windows-2019
- windows-2022
- windows-2025
- ubuntu-22.04
- ubuntu-24.04
- ubuntu-22.04-arm
- ubuntu-24.04-arm
pypy: ['pypy-2.7', 'pypy-3.10', 'pypy-3.11']
steps: steps:
- name: Checkout - name: Checkout
@ -73,8 +137,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-latest] os:
pypy: ['pypy2.7', 'pypy3.7', 'pypy3.8', 'pypy3.9-nightly'] [
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
pypy: ['pypy2.7', 'pypy3.9', 'pypy3.10-nightly', 'pypy3.11']
steps: steps:
- name: Checkout - name: Checkout
@ -98,13 +171,22 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup PyPy and check latest - name: Setup PyPy and check latest
uses: ./ uses: ./
with: with:
python-version: 'pypy-3.7-v7.3.x' python-version: 'pypy-3.11-v7.3.x'
check-latest: true check-latest: true
- name: PyPy and Python version - name: PyPy and Python version
run: python --version run: python --version
@ -120,7 +202,7 @@ jobs:
- name: Assert expected binaries (or symlinks) are present - name: Assert expected binaries (or symlinks) are present
run: | run: |
EXECUTABLE="pypy-3.7-v7.3.x" EXECUTABLE="pypy-3.11-v7.3.x"
EXECUTABLE=${EXECUTABLE/-/} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name EXECUTABLE=${EXECUTABLE/-/} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name
EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe
${EXECUTABLE} --version ${EXECUTABLE} --version
@ -131,15 +213,25 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup PyPy and check latest - name: Setup PyPy and check latest
uses: ./ uses: ./
with: with:
python-version: | python-version: |
pypy-3.7-v7.3.x pypy-3.11-v7.3.x
pypy3.8 pypy-3.10-v7.3.x
pypy3.9
check-latest: true check-latest: true
- name: PyPy and Python version - name: PyPy and Python version
run: python --version run: python --version
@ -155,14 +247,14 @@ jobs:
- name: Assert expected binaries (or symlinks) are present - name: Assert expected binaries (or symlinks) are present
run: | run: |
EXECUTABLE="pypy-3.7-v7.3.x" EXECUTABLE="pypy-3.11-v7.3.x"
EXECUTABLE=${EXECUTABLE/-/} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name EXECUTABLE=${EXECUTABLE/-/} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name
EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe
${EXECUTABLE} --version ${EXECUTABLE} --version
shell: bash shell: bash
- name: Assert expected binaries (or symlinks) are present - name: Assert expected binaries (or symlinks) are present
run: | run: |
EXECUTABLE='pypy3.8' EXECUTABLE='pypy3.9'
EXECUTABLE=${EXECUTABLE/pypy-/pypy} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name EXECUTABLE=${EXECUTABLE/pypy-/pypy} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name
EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe
${EXECUTABLE} --version ${EXECUTABLE} --version

View File

@ -0,0 +1,486 @@
name: Validate Python e2e freethread
on:
push:
branches:
- main
paths-ignore:
- '**.md'
pull_request:
paths-ignore:
- '**.md'
schedule:
- cron: 30 3 * * *
workflow_dispatch:
jobs:
setup-versions-from-manifest:
name: Setup ${{ matrix.python }} ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [3.13.0t, 3.13.1t, 3.13.2t]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: setup-python ${{ matrix.python }}
id: setup-python
uses: ./
with:
python-version: ${{ matrix.python }}
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Verify Python version
run: ${{ steps.setup-python.outputs.python-path }} -VVV
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
setup-versions-from-file:
name: Setup ${{ matrix.python }} ${{ matrix.os }} version file
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [3.13.0t, 3.13.1t, 3.13.2t]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: build-version-file ${{ matrix.python }}
run: echo ${{ matrix.python }} > .python-version
- name: setup-python ${{ matrix.python }}
id: setup-python
uses: ./
with:
python-version-file: .python-version
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Verify Python version
run: ${{ steps.setup-python.outputs.python-path }} -VVV
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
setup-versions-from-file-without-parameter:
name: Setup ${{ matrix.python }} ${{ matrix.os }} version file without parameter
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [3.13.0t, 3.13.1t, 3.13.2t]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: build-version-file ${{ matrix.python }}
run: echo ${{ matrix.python }} > .python-version
- name: setup-python ${{ matrix.python }}
id: setup-python
uses: ./
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Verify Python version
run: ${{ steps.setup-python.outputs.python-path }} -VVV
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
setup-versions-from-standard-pyproject-file:
name: Setup ${{ matrix.python }} ${{ matrix.os }} standard pyproject file
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [3.13.0, 3.13.1, 3.13.2]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: build-version-file ${{ matrix.python }}
run: |
echo '[project]
requires-python = "${{ matrix.python }}"
' > pyproject.toml
- name: setup-python ${{ matrix.python }}
id: setup-python
uses: ./
with:
python-version-file: pyproject.toml
freethreaded: true
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
setup-versions-from-poetry-pyproject-file:
name: Setup ${{ matrix.python }} ${{ matrix.os }} poetry pyproject file
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [3.13.0, 3.13.1, 3.13.2]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: build-version-file ${{ matrix.python }}
run: |
echo '[tool.poetry.dependencies]
python = "${{ matrix.python }}"
' > pyproject.toml
- name: setup-python ${{ matrix.python }}
id: setup-python
uses: ./
with:
python-version-file: pyproject.toml
freethreaded: true
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
setup-versions-from-tool-versions-file:
name: Setup ${{ matrix.python }} ${{ matrix.os }} .tool-versions file
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [3.13.0t, 3.13.1t, 3.13.2t, 3.14t-dev]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: build-tool-versions-file ${{ matrix.python }}
run: |
echo "python ${{ matrix.python }}" > .tool-versions
- name: setup-python using .tool-versions ${{ matrix.python }}
id: setup-python-tool-versions
uses: ./
with:
python-version-file: .tool-versions
setup-pre-release-version-from-manifest:
name: Setup 3.14.0-alpha.6 ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: setup-python 3.14.0-alpha.6
id: setup-python
uses: ./
with:
python-version: '3.14.0-alpha.6'
freethreaded: true
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Verify Python version
run: ${{ steps.setup-python.outputs.python-path }} -VVV
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
setup-dev-version:
name: Setup 3.14t-dev ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: setup-python 3.14t-dev
id: setup-python
uses: ./
with:
python-version: '3.14t-dev'
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Validate version
run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.14.') }}
shell: bash
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
setup-prerelease-version:
name: Setup 3.14t ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: setup-python 3.14t
id: setup-python
uses: ./
with:
python-version: '3.14t'
allow-prereleases: true
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Validate version
run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.14.') }}
shell: bash
- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'
setup-versions-noenv:
name: Setup ${{ matrix.python }} ${{ matrix.os }} (noenv)
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [3.13.0t, 3.13.1t, 3.13.2t]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: setup-python ${{ matrix.python }}
id: setup-python
uses: ./
with:
python-version: ${{ matrix.python }}
update-environment: false
- name: Verify Python version
run: ${{ steps.setup-python.outputs.python-path }} -VVV
- name: Run simple code
run: ${{ steps.setup-python.outputs.python-path }} -c 'import math; print(math.factorial(5))'
check-latest:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
python-version: [3.13t, 3.14t-dev]
steps:
- uses: actions/checkout@v4
- name: Setup Python and check latest
id: setup-python
uses: ./
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Verify Python version
run: ${{ steps.setup-python.outputs.python-path }} -VVV
setup-python-multiple-python-versions:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
steps:
- uses: actions/checkout@v4
- name: Setup Python and check latest
id: setup-python
uses: ./
with:
python-version: |
3.13.1t
3.13.2t
3.14t-dev
- name: Verify Python version
run: ${{ steps.setup-python.outputs.python-path }} -VVV
setup-versions-with-freethread-input:
name: Setup ${{ matrix.python }} ${{ matrix.os }} using freethread input parameter
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-20.04,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [3.13.1, 3.13.2, 3.14-dev, 3.14.0-alpha.6]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: setup-python ${{ matrix.python }}
id: setup-python
uses: ./
with:
python-version: ${{ matrix.python }}
freethreaded: true
- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash
- name: Validate GIL
run: python ./__tests__/verify-freethreaded.py

View File

@ -20,17 +20,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] os:
python: [3.5.4, 3.6.7, 3.7.5, 3.8.15, 3.9.13] [
exclude: macos-latest,
- os: ubuntu-22.04 windows-latest,
python: 3.5.4 ubuntu-22.04,
- os: ubuntu-22.04 ubuntu-22.04-arm,
python: 3.6.7 macos-13,
- os: ubuntu-22.04 ubuntu-latest,
python: 3.7.5 ubuntu-24.04-arm
- os: windows-latest ]
python: 3.8.15 python: [3.9.13, 3.10.11, 3.11.9, 3.12.3, 3.13.2]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -64,17 +64,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] os:
python: [3.5.4, 3.6.7, 3.7.5, 3.8.15, 3.9.13] [
exclude: macos-latest,
- os: ubuntu-22.04 windows-latest,
python: 3.5.4 ubuntu-22.04,
- os: ubuntu-22.04 ubuntu-22.04-arm,
python: 3.6.7 macos-13,
- os: ubuntu-22.04 ubuntu-latest,
python: 3.7.5 ubuntu-24.04-arm
- os: windows-latest ]
python: 3.8.15 python: [3.9.13, 3.10.11, 3.11.9, 3.12.3, 3.13.2]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -111,17 +111,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] os:
python: [3.5.4, 3.6.7, 3.7.5, 3.8.15, 3.9.13] [
exclude: macos-latest,
- os: ubuntu-22.04 windows-latest,
python: 3.5.4 ubuntu-22.04,
- os: ubuntu-22.04 ubuntu-22.04-arm,
python: 3.6.7 macos-13,
- os: ubuntu-22.04 ubuntu-latest,
python: 3.7.5 ubuntu-24.04-arm
- os: windows-latest ]
python: 3.8.15 python: [3.9.13, 3.10.11, 3.11.9, 3.12.3, 3.13.2]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -156,17 +156,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] os:
python: [3.5.4, 3.6.7, 3.7.5, 3.8.15, 3.9.13, '==3.10.10'] [
exclude: macos-latest,
- os: ubuntu-22.04 windows-latest,
python: 3.5.4 ubuntu-22.04,
- os: ubuntu-22.04 ubuntu-22.04-arm,
python: 3.6.7 macos-13,
- os: ubuntu-22.04 ubuntu-latest,
python: 3.7.5 ubuntu-24.04-arm
- os: windows-latest ]
python: 3.8.15 python: [3.9.13, 3.10.11, 3.11.9, '==3.12.3', 3.13.2]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -206,17 +206,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] os:
python: [3.5.4, 3.6.7, 3.7.5, 3.8.15, 3.9.13] [
exclude: macos-latest,
- os: ubuntu-22.04 windows-latest,
python: 3.5.4 ubuntu-22.04,
- os: ubuntu-22.04 ubuntu-22.04-arm,
python: 3.6.7 macos-13,
- os: ubuntu-22.04 ubuntu-latest,
python: 3.7.5 ubuntu-24.04-arm
- os: windows-latest ]
python: 3.8.15 python: [3.9.13, 3.10.11, 3.11.9, 3.12.3, 3.13.2]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -250,22 +250,65 @@ jobs:
- name: Run simple code - name: Run simple code
run: python -c 'import math; print(math.factorial(5))' run: python -c 'import math; print(math.factorial(5))'
setup-pre-release-version-from-manifest: setup-versions-from-tool-versions-file:
name: Setup 3.9.0-beta.4 ${{ matrix.os }} name: Setup ${{ matrix.python }} ${{ matrix.os }} .tool-versions file
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04] os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: [pypy3.11-7.3.18, graalpy-24.1.2, 3.13.2, 3.14-dev]
exclude:
- os: windows-latest
python: graalpy-24.1.2
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: setup-python 3.9.0-beta.4 - name: build-tool-versions-file ${{ matrix.python }}
run: |
echo "python ${{ matrix.python }}" > .tool-versions
- name: setup-python using .tool-versions ${{ matrix.python }}
id: setup-python-tool-versions
uses: ./
with:
python-version-file: .tool-versions
setup-pre-release-version-from-manifest:
name: Setup 3.14.0-alpha.6 ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: setup-python 3.14.0-alpha.6
id: setup-python id: setup-python
uses: ./ uses: ./
with: with:
python-version: '3.9.0-beta.4' python-version: '3.14.0-alpha.6'
- name: Check python-path - name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
@ -274,8 +317,8 @@ jobs:
- name: Validate version - name: Validate version
run: | run: |
$pythonVersion = (python --version) $pythonVersion = (python --version)
if ("Python 3.9.0b4" -ne "$pythonVersion"){ if ("Python 3.14.0a6" -ne "$pythonVersion"){
Write-Host "The current version is $pythonVersion; expected version is 3.9.0b4" Write-Host "The current version is $pythonVersion; expected version is 3.14.0a6"
exit 1 exit 1
} }
$pythonVersion $pythonVersion
@ -285,49 +328,67 @@ jobs:
run: python -c 'import math; print(math.factorial(5))' run: python -c 'import math; print(math.factorial(5))'
setup-dev-version: setup-dev-version:
name: Setup 3.9-dev ${{ matrix.os }} name: Setup 3.14-dev ${{ matrix.os }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-latest] os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: setup-python 3.9-dev - name: setup-python 3.14-dev
id: setup-python id: setup-python
uses: ./ uses: ./
with: with:
python-version: '3.9-dev' python-version: '3.14-dev'
- name: Check python-path - name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash shell: bash
- name: Validate version - name: Validate version
run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.9.') }} run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.14.') }}
shell: bash shell: bash
- name: Run simple code - name: Run simple code
run: python -c 'import math; print(math.factorial(5))' run: python -c 'import math; print(math.factorial(5))'
setup-prerelease-version: setup-prerelease-version:
name: Setup 3.12 ${{ matrix.os }} name: Setup 3.14 ${{ matrix.os }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-latest] os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: setup-python 3.12 - name: setup-python 3.14
id: setup-python id: setup-python
uses: ./ uses: ./
with: with:
python-version: '3.12' python-version: '3.14'
allow-prereleases: true allow-prereleases: true
- name: Check python-path - name: Check python-path
@ -335,7 +396,7 @@ jobs:
shell: bash shell: bash
- name: Validate version - name: Validate version
run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.12.') }} run: ${{ startsWith(steps.setup-python.outputs.python-version, '3.14.') }}
shell: bash shell: bash
- name: Run simple code - name: Run simple code
@ -347,8 +408,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04] os:
python: ['3.7', '3.8', '3.9', '3.10'] [
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
macos-13,
ubuntu-latest,
ubuntu-24.04-arm
]
python: ['3.9', '3.10', '3.11', '3.12', '3.13']
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@ -371,8 +441,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
python-version: ['3.8', '3.9', '3.10'] [
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Python and check latest - name: Setup Python and check latest
@ -395,23 +474,33 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest] os:
[
macos-latest,
windows-latest,
ubuntu-22.04,
ubuntu-22.04-arm,
ubuntu-24.04-arm,
ubuntu-latest,
macos-13
]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup Python and check latest - name: Setup Python and check latest
uses: ./ uses: ./
with: with:
python-version: | python-version: |
3.7
3.8
3.9 3.9
3.10 3.10
3.11
3.12
3.13
check-latest: true check-latest: true
- name: Validate version - name: Validate version
run: | run: |
$pythonVersion = (python --version) $pythonVersion = (python --version)
if ("$pythonVersion" -NotMatch "3.10"){ if ("$pythonVersion" -NotMatch "3.13"){
Write-Host "The current version is $pythonVersion; expected version is 3.10" Write-Host "The current version is $pythonVersion; expected version is 3.13"
exit 1 exit 1
} }
$pythonVersion $pythonVersion

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.licenses/npm/@fastify/busboy.dep.yml generated Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.licenses/npm/@protobuf-ts/plugin.dep.yml generated Normal file

Binary file not shown.

BIN
.licenses/npm/@protobuf-ts/protoc.dep.yml generated Normal file

Binary file not shown.

Binary file not shown.

BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml generated Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.licenses/npm/typescript.dep.yml generated Normal file

Binary file not shown.

BIN
.licenses/npm/undici-types.dep.yml generated Normal file

Binary file not shown.

BIN
.licenses/npm/undici.dep.yml generated Normal file

Binary file not shown.

View File

@ -19,9 +19,9 @@ See [action.yml](action.yml)
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.10' python-version: '3.13'
- run: python my_script.py - run: python my_script.py
``` ```
@ -29,11 +29,32 @@ steps:
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: 'pypy3.9' python-version: 'pypy3.10'
- run: python my_script.py - run: python my_script.py
``` ```
**GraalPy**
```yaml
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 'graalpy-24.0'
- run: python my_script.py
```
**Free threaded Python**
```yaml
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.13t'
- run: python my_script.py
```
The `python-version` input is optional. If not supplied, the action will try to resolve the version from the default `.python-version` file. If the `.python-version` file doesn't exist Python or PyPy version from the PATH will be used. The default version of Python or PyPy in PATH varies between runners and can be changed unexpectedly so we recommend always setting Python version explicitly using the `python-version` or `python-version-file` inputs. The `python-version` input is optional. If not supplied, the action will try to resolve the version from the default `.python-version` file. If the `.python-version` file doesn't exist Python or PyPy version from the PATH will be used. The default version of Python or PyPy in PATH varies between runners and can be changed unexpectedly so we recommend always setting Python version explicitly using the `python-version` or `python-version-file` inputs.
The action will first check the local [tool cache](docs/advanced-usage.md#hosted-tool-cache) for a [semver](https://github.com/npm/node-semver#versions) match. If unable to find a specific version in the tool cache, the action will attempt to download a version of Python from [GitHub Releases](https://github.com/actions/python-versions/releases) and for PyPy from the official [PyPy's dist](https://downloads.python.org/pypy/). The action will first check the local [tool cache](docs/advanced-usage.md#hosted-tool-cache) for a [semver](https://github.com/npm/node-semver#versions) match. If unable to find a specific version in the tool cache, the action will attempt to download a version of Python from [GitHub Releases](https://github.com/actions/python-versions/releases) and for PyPy from the official [PyPy's dist](https://downloads.python.org/pypy/).
@ -46,7 +67,7 @@ The `python-version` input supports the [Semantic Versioning Specification](http
## Supported architectures ## Supported architectures
Using `architecture` input it is possible to specify the required Python or PyPy interpreter architecture: `x86` or `x64`. If the input is not specified the architecture defaults to `x64`. Using the `architecture` input, it is possible to specify the required Python or PyPy interpreter architecture: `x86`, `x64`, or `arm64`. If the input is not specified, the architecture defaults to the host OS architecture.
## Caching packages dependencies ## Caching packages dependencies
@ -63,9 +84,9 @@ The action defaults to searching for a dependency file (`requirements.txt` or `p
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: '3.13'
cache: 'pip' # caching pip dependencies cache: 'pip' # caching pip dependencies
- run: pip install -r requirements.txt - run: pip install -r requirements.txt
``` ```
@ -82,12 +103,21 @@ See examples of using `cache` and `cache-dependency-path` for `pipenv` and `poet
- [Check latest version](docs/advanced-usage.md#check-latest-version) - [Check latest version](docs/advanced-usage.md#check-latest-version)
- [Caching packages](docs/advanced-usage.md#caching-packages) - [Caching packages](docs/advanced-usage.md#caching-packages)
- [Outputs and environment variables](docs/advanced-usage.md#outputs-and-environment-variables) - [Outputs and environment variables](docs/advanced-usage.md#outputs-and-environment-variables)
- [Available versions of Python and PyPy](docs/advanced-usage.md#available-versions-of-python-and-pypy) - [Available versions of Python, PyPy and GraalPy](docs/advanced-usage.md#available-versions-of-python-pypy-and-graalpy)
- [Hosted tool cache](docs/advanced-usage.md#hosted-tool-cache) - [Hosted tool cache](docs/advanced-usage.md#hosted-tool-cache)
- [Using `setup-python` with a self-hosted runner](docs/advanced-usage.md#using-setup-python-with-a-self-hosted-runner) - [Using `setup-python` with a self-hosted runner](docs/advanced-usage.md#using-setup-python-with-a-self-hosted-runner)
- [Using `setup-python` on GHES](docs/advanced-usage.md#using-setup-python-on-ghes) - [Using `setup-python` on GHES](docs/advanced-usage.md#using-setup-python-on-ghes)
- [Allow pre-releases](docs/advanced-usage.md#allow-pre-releases) - [Allow pre-releases](docs/advanced-usage.md#allow-pre-releases)
## Recommended permissions
When using the `setup-python` action in your GitHub Actions workflow, it is recommended to set the following permissions to ensure proper functionality:
```yaml
permissions:
contents: read # access to check out code and install dependencies
```
## License ## License
The scripts and documentation in this project are released under the [MIT License](LICENSE). The scripts and documentation in this project are released under the [MIT License](LICENSE).

View File

@ -184,19 +184,31 @@ virtualenvs.path = "{cache-dir}/virtualenvs" # /Users/patrick/Library/Caches/py
); );
} }
if (process.platform === 'linux' && packageManager === 'pip') { const restoredKeys = restoreCacheSpy.mock.results.map(
expect(infoSpy).toHaveBeenCalledWith( result => result.value
`Cache restored from key: setup-python-${process.env['RUNNER_OS']}-20.04-Ubuntu-python-${pythonVersion}-${packageManager}-${fileHash}` );
);
} else if (packageManager === 'poetry') { restoredKeys.forEach(restoredKey => {
expect(infoSpy).toHaveBeenCalledWith( if (restoredKey) {
`Cache restored from key: setup-python-${process.env['RUNNER_OS']}-python-${pythonVersion}-${packageManager}-v2-${fileHash}` if (process.platform === 'linux' && packageManager === 'pip') {
); expect(infoSpy).toHaveBeenCalledWith(
} else { `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-${process.arch}-20.04-Ubuntu-python-${pythonVersion}-${packageManager}-${fileHash}`
expect(infoSpy).toHaveBeenCalledWith( );
`Cache restored from key: setup-python-${process.env['RUNNER_OS']}-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 30000
); );

View File

@ -5,7 +5,7 @@ name = "pypi"
[packages] [packages]
flake8 = "==6.0.0" flake8 = "==6.0.0"
numpy = "==1.25.1" numpy = "==2.2.4"
[dev-packages] [dev-packages]

View File

@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "dcea65dabfe8442466b5e9280ecab72cfa7bf555791ee0ad55b6e7255dca1f43" "sha256": "9d0bc7ff1f9078396b19f05bc5cd57894f3783c68f96fa9d623b1ea5a1b168f5"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
@ -22,6 +22,7 @@
"sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_full_version >= '3.8.1'",
"version": "==6.0.0" "version": "==6.0.0"
}, },
"mccabe": { "mccabe": {
@ -34,34 +35,65 @@
}, },
"numpy": { "numpy": {
"hashes": [ "hashes": [
"sha256:012097b5b0d00a11070e8f2e261128c44157a8689f7dedcf35576e525893f4fe", "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286",
"sha256:0d3fe3dd0506a28493d82dc3cf254be8cd0d26f4008a417385cbf1ae95b54004", "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542",
"sha256:0def91f8af6ec4bb94c370e38c575855bf1d0be8a8fbfba42ef9c073faf2cf19", "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f",
"sha256:1a180429394f81c7933634ae49b37b472d343cccb5bb0c4a575ac8bbc433722f", "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d",
"sha256:1d5d3c68e443c90b38fdf8ef40e60e2538a27548b39b12b73132456847f4b631", "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0",
"sha256:20e1266411120a4f16fad8efa8e0454d21d00b8c7cee5b5ccad7565d95eb42dd", "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7",
"sha256:247d3ffdd7775bdf191f848be8d49100495114c82c2bd134e8d5d075fb386a1c", "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3",
"sha256:35a9527c977b924042170a0887de727cd84ff179e478481404c5dc66b4170009", "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3",
"sha256:38eb6548bb91c421261b4805dc44def9ca1a6eef6444ce35ad1669c0f1a3fc5d", "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146",
"sha256:3d7abcdd85aea3e6cdddb59af2350c7ab1ed764397f8eec97a038ad244d2d105", "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1",
"sha256:41a56b70e8139884eccb2f733c2f7378af06c82304959e174f8e7370af112e09", "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6",
"sha256:4a90725800caeaa160732d6b31f3f843ebd45d6b5f3eec9e8cc287e30f2805bf", "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc",
"sha256:6b82655dd8efeea69dbf85d00fca40013d7f503212bc5259056244961268b66e", "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9",
"sha256:6c6c9261d21e617c6dc5eacba35cb68ec36bb72adcff0dee63f8fbc899362588", "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592",
"sha256:77d339465dff3eb33c701430bcb9c325b60354698340229e1dff97745e6b3efa", "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00",
"sha256:791f409064d0a69dd20579345d852c59822c6aa087f23b07b1b4e28ff5880fcb", "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298",
"sha256:9a3a9f3a61480cc086117b426a8bd86869c213fc4072e606f01c4e4b66eb92bf", "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8",
"sha256:c1516db588987450b85595586605742879e50dcce923e8973f79529651545b57", "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2",
"sha256:c40571fe966393b212689aa17e32ed905924120737194b5d5c1b20b9ed0fb171", "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392",
"sha256:d412c1697c3853c6fc3cb9751b4915859c7afe6a277c2bf00acf287d56c4e625", "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb",
"sha256:d5154b1a25ec796b1aee12ac1b22f414f94752c5f94832f14d8d6c9ac40bcca6", "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8",
"sha256:d736b75c3f2cb96843a5c7f8d8ccc414768d34b0a75f466c05f3a739b406f10b", "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd",
"sha256:e8f6049c4878cb16960fbbfb22105e49d13d752d4d8371b55110941fb3b17800", "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9",
"sha256:f76aebc3358ade9eacf9bc2bb8ae589863a4f911611694103af05346637df1b7", "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0",
"sha256:fd67b306320dcadea700a8f79b9e671e607f8696e98ec255915c0c6d6b818503" "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", "index": "pypi",
"version": "==1.25.1" "markers": "python_version >= '3.10'",
"version": "==2.2.4"
}, },
"pycodestyle": { "pycodestyle": {
"hashes": [ "hashes": [
@ -81,4 +113,4 @@
} }
}, },
"develop": {} "develop": {}
} }

View File

@ -1,2 +1,2 @@
numpy==1.22.3 numpy==2.2.4
flake8==6.0.0 flake8==6.0.0

View File

@ -1,413 +1,226 @@
# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand.
[[package]] [[package]]
name = "altgraph" name = "altgraph"
version = "0.17.2" version = "0.17.4"
description = "Python graph (network) package" description = "Python graph (network) package"
category = "main"
optional = false optional = false
python-versions = "*" 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]] [[package]]
name = "certifi" name = "flake8"
version = "2020.6.20" version = "4.0.1"
description = "Python package for providing Mozilla's CA Bundle." description = "the modular source code checker: pep8 pyflakes and co"
category = "main"
optional = false optional = false
python-versions = "*" python-versions = ">=3.6"
files = [
[[package]] {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
name = "chardet" {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
version = "3.0.4" ]
description = "Universal encoding detector for Python 2 and 3"
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "dis3"
version = "0.1.3"
description = "Python 2.7 backport of the \"dis\" module from Python 3.5+"
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "docutils"
version = "0.16"
description = "Docutils -- Python Documentation Utilities"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]]
name = "future"
version = "0.18.2"
description = "Clean single-source support for Python 3 and 2"
category = "main"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
[[package]]
name = "idna"
version = "2.9"
description = "Internationalized Domain Names in Applications (IDNA)"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "itsdangerous"
version = "1.1.0"
description = "Various helpers to pass data to untrusted environments and back."
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "kivy"
version = "1.11.1"
description = "A software library for rapid development of hardware-accelerated multitouch applications."
category = "main"
optional = false
python-versions = "*"
[package.dependencies] [package.dependencies]
docutils = "*" mccabe = ">=0.6.0,<0.7.0"
Kivy-Garden = ">=0.1.4" pycodestyle = ">=2.8.0,<2.9.0"
pygments = "*" 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] [package.extras]
tuio = ["oscpy"] 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]] [[package]]
name = "kivy-deps.angle" name = "macholib"
version = "0.3.0" version = "1.16.3"
description = "Repackaged binary dependency of Kivy." description = "Mach-O header analysis and editing"
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "kivy-deps.glew"
version = "0.1.12"
description = "Repackaged binary dependency of Kivy."
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "kivy-deps.gstreamer"
version = "0.1.17"
description = "Repackaged binary dependency of Kivy."
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "kivy-deps.sdl2"
version = "0.1.22"
description = "Repackaged binary dependency of Kivy."
category = "main"
optional = false
python-versions = "*"
[[package]]
name = "kivy-garden"
version = "0.1.4"
description = "Garden tool for kivy flowers."
category = "main"
optional = false optional = false
python-versions = "*" 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] [package.dependencies]
requests = "*" 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]] [[package]]
name = "packaging" name = "packaging"
version = "21.0" version = "24.2"
description = "Core utilities for Python packages" description = "Core utilities for Python packages"
category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.8"
files = [
[package.dependencies] {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
pyparsing = ">=2.0.2" {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
]
[[package]]
name = "pdf2image"
version = "1.12.1"
description = "A wrapper around the pdftoppm and pdftocairo command line tools to convert PDF to a PIL Image list."
category = "main"
optional = false
python-versions = "*"
[package.dependencies]
pillow = "*"
[[package]] [[package]]
name = "pefile" name = "pefile"
version = "2021.9.3" version = "2024.8.26"
description = "Python PE parsing module" description = "Python PE parsing module"
category = "main"
optional = false optional = false
python-versions = ">=3.6.0" python-versions = ">=3.6.0"
files = [
[package.dependencies] {file = "pefile-2024.8.26-py3-none-any.whl", hash = "sha256:76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f"},
future = "*" {file = "pefile-2024.8.26.tar.gz", hash = "sha256:3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632"},
]
[[package]] [[package]]
name = "pillow" name = "pycodestyle"
version = "7.2.0" version = "2.8.0"
description = "Python Imaging Library (Fork)" description = "Python style guide checker"
category = "main"
optional = false optional = false
python-versions = ">=3.5" 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]] [[package]]
name = "pygments" name = "pyflakes"
version = "2.6.1" version = "2.4.0"
description = "Pygments is a syntax highlighting package written in Python." description = "passive checker of Python programs"
category = "main"
optional = false optional = false
python-versions = ">=3.5" 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]] [[package]]
name = "pyinstaller" name = "pyinstaller"
version = "3.6" version = "6.10.0"
description = "PyInstaller bundles a Python application and all its dependencies into a single package." description = "PyInstaller bundles a Python application and all its dependencies into a single package."
category = "main"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 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] [package.dependencies]
altgraph = "*" altgraph = "*"
dis3 = "*" 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]] [[package]]
name = "pyparsing" name = "pyinstaller-hooks-contrib"
version = "2.4.7" version = "2025.1"
description = "Python parsing module" description = "Community maintained hooks for PyInstaller"
category = "main"
optional = false optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 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]] [[package]]
name = "pywin32-ctypes" name = "pywin32-ctypes"
version = "0.2.0" version = "0.2.3"
description = "" description = "A (partial) reimplementation of pywin32 using ctypes/cffi"
category = "main"
optional = false optional = false
python-versions = "*" 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]] [[package]]
name = "requests" name = "setuptools"
version = "2.24.0" version = "75.3.2"
description = "Python HTTP for Humans." description = "Easily download, build, install, upgrade, and uninstall Python packages"
category = "main"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=3.8"
files = [
[package.dependencies] {file = "setuptools-75.3.2-py3-none-any.whl", hash = "sha256:90ab613b6583fc02d5369cbca13ea26ea0e182d1df2d943ee9cbe81d4c61add9"},
certifi = ">=2017.4.17" {file = "setuptools-75.3.2.tar.gz", hash = "sha256:3c1383e1038b68556a382c1e8ded8887cd20141b0eb5708a6c8d277de49364f5"},
chardet = ">=3.0.2,<4" ]
idna = ">=2.5,<3"
urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"
[package.extras] [package.extras]
security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"]
socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 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]] [[package]]
name = "urllib3" name = "zipp"
version = "1.25.9" version = "3.20.2"
description = "HTTP library with thread-safe connection pooling, file post, and more." description = "Backport of pathlib-compatible object wrapper for zip files"
category = "main"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 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] [package.extras]
brotli = ["brotlipy (>=0.6.0)"] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] cover = ["pytest-cov"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
enabler = ["pytest-enabler (>=2.2)"]
[[package]] test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
name = "xlrd" type = ["pytest-mypy"]
version = "1.2.0"
description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[metadata] [metadata]
lock-version = "1.1" lock-version = "2.0"
python-versions = "^3.8" python-versions = ">=3.8,<3.14"
content-hash = "b3d607363c6daf2b5448aa5ee676cff28606af6200d8e9b42e89937a190a3d46" content-hash = "6db8fff0987f3dadb02cbf0e510a2d04b01ab2dc6d7b0fb32a0e33a8d30b3a58"
[metadata.files]
altgraph = [
{file = "altgraph-0.17.2-py2.py3-none-any.whl", hash = "sha256:743628f2ac6a7c26f5d9223c91ed8ecbba535f506f4b6f558885a8a56a105857"},
{file = "altgraph-0.17.2.tar.gz", hash = "sha256:ebf2269361b47d97b3b88e696439f6e4cbc607c17c51feb1754f90fb79839158"},
]
certifi = [
{file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
{file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"},
]
chardet = [
{file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
{file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
]
dis3 = [
{file = "dis3-0.1.3-py2-none-any.whl", hash = "sha256:61f7720dd0d8749d23fda3d7227ce74d73da11c2fade993a67ab2f9852451b14"},
{file = "dis3-0.1.3-py3-none-any.whl", hash = "sha256:30b6412d33d738663e8ded781b138f4b01116437f0872aa56aa3adba6aeff218"},
{file = "dis3-0.1.3.tar.gz", hash = "sha256:9259b881fc1df02ed12ac25f82d4a85b44241854330b1a651e40e0c675cb2d1e"},
]
docutils = [
{file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
{file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
]
future = [
{file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"},
]
idna = [
{file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"},
{file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"},
]
itsdangerous = [
{file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"},
{file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"},
]
kivy = [
{file = "Kivy-1.11.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:11e85eaf6efbfa2362a3334ffdad179a1b0ca8d255cca79eaa6a2765560d4982"},
{file = "Kivy-1.11.1-cp27-cp27m-win32.whl", hash = "sha256:5c3d0f2749522d62e9cce09cd54b2d823bf1b6b644ff1f627be49de6f3e3cba0"},
{file = "Kivy-1.11.1-cp27-cp27m-win_amd64.whl", hash = "sha256:f835462dd9aa491272552ef079b948a088598e2e95d68bb1d885d2c3f3d4e2c3"},
{file = "Kivy-1.11.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:090d3ded9835a17477cd93fbdaf0a7c42ff2218981cf198ded5ad8795bc74391"},
{file = "Kivy-1.11.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:b85ccf165050cbf2ee8447671eebbc222b369b40f0e0038dd9547d49a5e37373"},
{file = "Kivy-1.11.1-cp35-cp35m-win32.whl", hash = "sha256:4a5480cbf837d3780c77a4f61b32b56d22ae9f03845e7a89dd3eaef1ae5fd037"},
{file = "Kivy-1.11.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a687602d90c4629dd036f577ca39acb76ba581370f9d915f3cab99be818ba8ad"},
{file = "Kivy-1.11.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:c36652caa7f6c327dee834cfc699d5962d346b7a53e54bd81abc17c314226d89"},
{file = "Kivy-1.11.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:b7ef6aad43a86d8df3fb865db864e354f2155a748019f8517f69f65c1a29cb64"},
{file = "Kivy-1.11.1-cp36-cp36m-win32.whl", hash = "sha256:f3bea6e4a21991827885d04127fc6d09a0e974ecfa12da7bf5faae93562ea102"},
{file = "Kivy-1.11.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ece170514db3f49844a41e4c910ad9ce9bc46da6f47a49158e11266bdcc6e479"},
{file = "Kivy-1.11.1-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:8819a27a09871af451760cb69486ced52e830c8a0a37480f22ef5e692f12c05b"},
{file = "Kivy-1.11.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1a1ff32f8a95f1e175198cbab81fcd2596783b180d4eafe63e87d171aa7fdb5e"},
{file = "Kivy-1.11.1-cp37-cp37m-win32.whl", hash = "sha256:815a5c0b3b72fcd81ca7b2aa0744087163ed03e4cf9ab4e7c9733cea99fc1571"},
{file = "Kivy-1.11.1-cp37-cp37m-win_amd64.whl", hash = "sha256:1d28b198a64c30db8d94a0488e85f3037af60d514ab0d7ad5ab45add3ab77090"},
{file = "Kivy-1.11.1.tar.gz", hash = "sha256:4d0e596f74271e901b551f77661dde238df4765484fce9f5d1c72e8022984e84"},
]
"kivy-deps.angle" = [
{file = "kivy_deps.angle-0.3.0-cp310-cp310-win32.whl", hash = "sha256:7b56477c726e361592f794d49b2fdd96d579b7efd7225a8aadf7fd01d4e8cb80"},
{file = "kivy_deps.angle-0.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:a4b78fd9d47c76e5ff52fcbaa040920a2f97bff038f4c534346dd833dc8f3145"},
{file = "kivy_deps.angle-0.3.0-cp36-cp36m-win32.whl", hash = "sha256:a2cea09e8a5e899629466403fbd540459f1cdef8d08c6c479b6607b95309be02"},
{file = "kivy_deps.angle-0.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b167e19b3eea55a9a8c606a607bb909ec1bedda88deee40347c780b310155a79"},
{file = "kivy_deps.angle-0.3.0-cp37-cp37m-win32.whl", hash = "sha256:d0e7b7b9eb9669837a5d70808a7ea45f2b61961b56f9f69a233bad6bd36ce260"},
{file = "kivy_deps.angle-0.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b9d07976b0bf6bac724a42aa8ed5a8c7caa95609046db30c8f15bb731f8e4d36"},
{file = "kivy_deps.angle-0.3.0-cp38-cp38-win32.whl", hash = "sha256:99c40d53582a958748e251dfbd61aa67fb85963e27529ca08a21f2f5eeed04e1"},
{file = "kivy_deps.angle-0.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:50605fdd4c9fdbe9f717069734a598a9aba0afe5d3f0412afbe2ecff0326e92d"},
{file = "kivy_deps.angle-0.3.0-cp39-cp39-win32.whl", hash = "sha256:64ac7f33c000585dc30194e604aed925972c6b7c3848b5c3b073ae916fb0b55c"},
{file = "kivy_deps.angle-0.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb4d53f15a093214adbbe205c108ede5cc0f6af6eff104c1b8c468ddaaf6400a"},
]
"kivy-deps.glew" = [
{file = "kivy_deps.glew-0.1.12-cp27-cp27m-win32.whl", hash = "sha256:92e72fa2c425887987d1aa861c99537033dc20d68ae1c54864871f0401682586"},
{file = "kivy_deps.glew-0.1.12-cp27-cp27m-win_amd64.whl", hash = "sha256:c843104690c0c8f3a58105c53c57f31506f6f90562c18de00bd19317cc1045a7"},
{file = "kivy_deps.glew-0.1.12-cp35-cp35m-win32.whl", hash = "sha256:ee8ab67abb2c98d84feede657cae472e7723e529af07394244bdd33caafb1a38"},
{file = "kivy_deps.glew-0.1.12-cp35-cp35m-win_amd64.whl", hash = "sha256:ab81783a82bef88a8d2bcf8a93bc21df6b8b0db6ee551eb802727d18f9074b17"},
{file = "kivy_deps.glew-0.1.12-cp36-cp36m-win32.whl", hash = "sha256:45aa7f0e8d9bcf5fc1810c9c38bc20edf7dee61df81ecf62102e0f84153f924a"},
{file = "kivy_deps.glew-0.1.12-cp36-cp36m-win_amd64.whl", hash = "sha256:ef1116d99bd9cc737cb8c0e13e676955c17d6e4d6d1af5cfccef089a430071bb"},
{file = "kivy_deps.glew-0.1.12-cp37-cp37m-win32.whl", hash = "sha256:1e28e40017af9d081fc0fc95b4fadaf31d15e9f63478dcee1c4257d67079894e"},
{file = "kivy_deps.glew-0.1.12-cp37-cp37m-win_amd64.whl", hash = "sha256:6bb435620c3187d2c61054adb9ec277ed487256b457a0a7b1491bc0cb7247e18"},
{file = "kivy_deps.glew-0.1.12-cp38-cp38-win32.whl", hash = "sha256:09f72ee5ef33ff273332e2a229dc97d650d29818a0189339421949e4e0f63d93"},
{file = "kivy_deps.glew-0.1.12-cp38-cp38-win_amd64.whl", hash = "sha256:cf351aad171796f8051af8e49ec430a9aa128d8557d8643e73f2bb1e5f9c2dab"},
]
"kivy-deps.gstreamer" = [
{file = "kivy_deps.gstreamer-0.1.17-cp27-cp27m-win32.whl", hash = "sha256:309eca64dee5939f16f8465e5cbb08bdde7c90ded1af6a00690c7e928326af79"},
{file = "kivy_deps.gstreamer-0.1.17-cp27-cp27m-win_amd64.whl", hash = "sha256:0d9598d2d31c0e780adf4b767fa3a691123621fd0ffef94b83cf82c2da84341b"},
{file = "kivy_deps.gstreamer-0.1.17-cp35-cp35m-win32.whl", hash = "sha256:4f2ddd61d185310258d338ae80a646df7822efdd7d67e57f49dc7b87555c5d7e"},
{file = "kivy_deps.gstreamer-0.1.17-cp35-cp35m-win_amd64.whl", hash = "sha256:6fa9f76afe600baa221abee31ce7dc63e653d0affe0f6c558bfc4f35af96396f"},
{file = "kivy_deps.gstreamer-0.1.17-cp36-cp36m-win32.whl", hash = "sha256:c4709765e2b17c6c96b46a92207b0457def147544d825654077603eaf0d424de"},
{file = "kivy_deps.gstreamer-0.1.17-cp36-cp36m-win_amd64.whl", hash = "sha256:c29cfc63fe70a58dad889e631f1ba4711c9ea80103f2b2b8d670a97f093076c8"},
{file = "kivy_deps.gstreamer-0.1.17-cp37-cp37m-win32.whl", hash = "sha256:4d996377111e854b3dea90846f9b2f98766a44529fd8b72125e18c552381d928"},
{file = "kivy_deps.gstreamer-0.1.17-cp37-cp37m-win_amd64.whl", hash = "sha256:739cd331b9f33a822d700273674a79a3157054e9358a01a0d553f094a5f4a8c9"},
{file = "kivy_deps.gstreamer-0.1.17-cp38-cp38-win_amd64.whl", hash = "sha256:3d53d2c84c0a997c4cac6c239b1e0a6486e533836321003dc365ec42b97a664b"},
]
"kivy-deps.sdl2" = [
{file = "kivy_deps.sdl2-0.1.22-cp27-cp27m-win32.whl", hash = "sha256:1b987bdd4fbbcb31baf0d7fc9584ad99912179b8968311bb7e30fbeb14e98e0d"},
{file = "kivy_deps.sdl2-0.1.22-cp27-cp27m-win_amd64.whl", hash = "sha256:228128cdd8112dc7505ac43027a770476e9ef282e0b84ca68037133cd025960b"},
{file = "kivy_deps.sdl2-0.1.22-cp35-cp35m-win32.whl", hash = "sha256:053f26e8c05d5545bdbc7eeb8c450b8e4410ee355792e9345af536110fe247e2"},
{file = "kivy_deps.sdl2-0.1.22-cp35-cp35m-win_amd64.whl", hash = "sha256:5ce23f1a3286d6288751a12b0eaefd02f947ea101bb807e9781b964e496fc3f3"},
{file = "kivy_deps.sdl2-0.1.22-cp36-cp36m-win32.whl", hash = "sha256:96e1fa89fd8b5351f2d3c26bbffd50df8d554b03fba4025ecc941d773d241698"},
{file = "kivy_deps.sdl2-0.1.22-cp36-cp36m-win_amd64.whl", hash = "sha256:c3ace0ddde0e59cdcaf260eda1daa0c05ca9bf8cd0c4ea404539de25a5dcaec7"},
{file = "kivy_deps.sdl2-0.1.22-cp37-cp37m-win32.whl", hash = "sha256:7928746eaed51944c10d1bb36fcefebe3d1aff1b97ba32359c2c97ba74707e1b"},
{file = "kivy_deps.sdl2-0.1.22-cp37-cp37m-win_amd64.whl", hash = "sha256:2c2fd5a12a7a9afe3bb962b273561099a180edae91bb9c8f8386b72253fcae4a"},
{file = "kivy_deps.sdl2-0.1.22-cp38-cp38-win32.whl", hash = "sha256:9270fa8ed5130074b167a7a3a9c85efc3cfe3c04584ab084cb6ae9e4edfa8168"},
{file = "kivy_deps.sdl2-0.1.22-cp38-cp38-win_amd64.whl", hash = "sha256:92ed97d3247bc8ce98f336cbc940bb889310199326e9ccf251c49ae7e4b80de8"},
]
kivy-garden = [
{file = "Kivy Garden-0.1.4.tar.gz", hash = "sha256:9b7d9de5efacbcd0c4b3dd873b30622a86093c9965aa47b523c7a32f3eb34610"},
{file = "kivy-garden-0.1.4.tar.gz", hash = "sha256:c256f42788421273a08fbb0a228f0fb0e80dd86b629fb8c0920507f645be6c72"},
]
packaging = [
{file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
{file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"},
]
pdf2image = [
{file = "pdf2image-1.12.1.tar.gz", hash = "sha256:a0d9906f5507192210a8d5d7ead63145e9dec4bccc4564b1fb644e923913c31c"},
]
pefile = [
{file = "pefile-2021.9.3.tar.gz", hash = "sha256:344a49e40a94e10849f0fe34dddc80f773a12b40675bf2f7be4b8be578bdd94a"},
]
pillow = [
{file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"},
{file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"},
{file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"},
{file = "Pillow-7.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5"},
{file = "Pillow-7.2.0-cp35-cp35m-win32.whl", hash = "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad"},
{file = "Pillow-7.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f"},
{file = "Pillow-7.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d"},
{file = "Pillow-7.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233"},
{file = "Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f"},
{file = "Pillow-7.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8"},
{file = "Pillow-7.2.0-cp36-cp36m-win32.whl", hash = "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a"},
{file = "Pillow-7.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"},
{file = "Pillow-7.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4"},
{file = "Pillow-7.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727"},
{file = "Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b"},
{file = "Pillow-7.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d"},
{file = "Pillow-7.2.0-cp37-cp37m-win32.whl", hash = "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63"},
{file = "Pillow-7.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1"},
{file = "Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6"},
{file = "Pillow-7.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9"},
{file = "Pillow-7.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41"},
{file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"},
{file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"},
{file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"},
{file = "Pillow-7.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6"},
{file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"},
{file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"},
{file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"},
]
pygments = [
{file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"},
{file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"},
]
pyinstaller = [
{file = "PyInstaller-3.6.tar.gz", hash = "sha256:3730fa80d088f8bb7084d32480eb87cbb4ddb64123363763cf8f2a1378c1c4b7"},
]
pyparsing = [
{file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
{file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
]
pywin32-ctypes = [
{file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"},
{file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"},
]
requests = [
{file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"},
{file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"},
]
urllib3 = [
{file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"},
{file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"},
]
xlrd = [
{file = "xlrd-1.2.0-py2.py3-none-any.whl", hash = "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde"},
{file = "xlrd-1.2.0.tar.gz", hash = "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2"},
]

View File

@ -5,11 +5,13 @@ description = ""
authors = ["Your Name <you@example.com>"] authors = ["Your Name <you@example.com>"]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.8" python = ">=3.8,<3.14"
flake8 = "^4.0.1" flake8 = "^4.0.1"
pyinstaller = "6.10.0"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api" build-backend = "poetry.core.masonry.api"

View File

@ -7,6 +7,6 @@ Kivy-Garden==0.1.4
packaging==20.7 packaging==20.7
pdf2image==1.12.1 pdf2image==1.12.1
Pygments==2.6.1 Pygments==2.6.1
requests==2.24.0 requests==2.32.2
urllib3==1.25.10 urllib3==1.26.19
xlrd==1.2.0 xlrd==1.2.0

View File

@ -30,18 +30,18 @@ pdf2image==1.12.1
pefile==2021.9.3; python_full_version >= '3.6.0' pefile==2021.9.3; python_full_version >= '3.6.0'
pillow==7.2 pillow>=10.2.0
pygments==2.6.1 pygments==2.6.1
pyinstaller==3.6 pyinstaller==6.10.0
pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2' pyparsing==2.4.7; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'
pywin32-ctypes==0.2.0 pywin32-ctypes==0.2.0
requests==2.24.0 requests==2.32.2
urllib3==1.25.9 urllib3==1.26.19
xlrd==1.2.0 xlrd==1.2.0

View File

@ -1,7 +1,7 @@
import fs from 'fs'; import fs from 'fs';
import {HttpClient} from '@actions/http-client'; import {HttpClient} from '@actions/http-client';
import * as ifm from '@actions/http-client/interfaces'; import * as ifm from '@actions/http-client/lib/interfaces';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import * as core from '@actions/core'; import * as core from '@actions/core';
@ -179,7 +179,7 @@ describeSkipOnWindows('findGraalPyVersion', () => {
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson'); spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockImplementation( spyHttpClient.mockImplementation(
async (): Promise<ifm.ITypedResponse<IGraalPyManifestRelease[]>> => { async (): Promise<ifm.TypedResponse<IGraalPyManifestRelease[]>> => {
const result = JSON.stringify(manifestData); const result = JSON.stringify(manifestData);
return { return {
statusCode: 200, statusCode: 200,

View File

@ -2,7 +2,7 @@ import fs from 'fs';
import * as utils from '../src/utils'; import * as utils from '../src/utils';
import {HttpClient} from '@actions/http-client'; import {HttpClient} from '@actions/http-client';
import * as ifm from '@actions/http-client/interfaces'; import * as ifm from '@actions/http-client/lib/interfaces';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import * as core from '@actions/core'; import * as core from '@actions/core';
@ -240,7 +240,7 @@ describe('findPyPyVersion', () => {
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson'); spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockImplementation( spyHttpClient.mockImplementation(
async (): Promise<ifm.ITypedResponse<IPyPyManifestRelease[]>> => { async (): Promise<ifm.TypedResponse<IPyPyManifestRelease[]>> => {
const result = JSON.stringify(manifestData); const result = JSON.stringify(manifestData);
return { return {
statusCode: 200, statusCode: 200,

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);
});
});

View File

@ -56,7 +56,7 @@ describe('Finder tests', () => {
await io.mkdirP(pythonDir); await io.mkdirP(pythonDir);
fs.writeFileSync(`${pythonDir}.complete`, 'hello'); 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) // 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); await finder.useCpythonVersion('3.x', 'x64', true, false, false, false);
expect(spyCoreAddPath).toHaveBeenCalled(); expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith( expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation', 'pythonLocation',
@ -73,7 +73,7 @@ describe('Finder tests', () => {
await io.mkdirP(pythonDir); await io.mkdirP(pythonDir);
fs.writeFileSync(`${pythonDir}.complete`, 'hello'); 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) // 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); await finder.useCpythonVersion('3.x', 'x64', false, false, false, false);
expect(spyCoreAddPath).not.toHaveBeenCalled(); expect(spyCoreAddPath).not.toHaveBeenCalled();
expect(spyCoreExportVariable).not.toHaveBeenCalled(); expect(spyCoreExportVariable).not.toHaveBeenCalled();
}); });
@ -96,7 +96,7 @@ describe('Finder tests', () => {
}); });
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists) // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await expect( await expect(
finder.useCpythonVersion('1.2.3', 'x64', true, false, false) finder.useCpythonVersion('1.2.3', 'x64', true, false, false, false)
).resolves.toEqual({ ).resolves.toEqual({
impl: 'CPython', impl: 'CPython',
version: '1.2.3' version: '1.2.3'
@ -135,7 +135,14 @@ describe('Finder tests', () => {
}); });
// This will throw if it doesn't find it in the manifest (because no such version exists) // This will throw if it doesn't find it in the manifest (because no such version exists)
await expect( await expect(
finder.useCpythonVersion('1.2.4-beta.2', 'x64', false, false, false) finder.useCpythonVersion(
'1.2.4-beta.2',
'x64',
false,
false,
false,
false
)
).resolves.toEqual({ ).resolves.toEqual({
impl: 'CPython', impl: 'CPython',
version: '1.2.4-beta.2' version: '1.2.4-beta.2'
@ -186,7 +193,7 @@ describe('Finder tests', () => {
fs.writeFileSync(`${pythonDir}.complete`, 'hello'); 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) // 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); await finder.useCpythonVersion('1.2', 'x64', true, true, false, false);
expect(infoSpy).toHaveBeenCalledWith("Resolved as '1.2.3'"); expect(infoSpy).toHaveBeenCalledWith("Resolved as '1.2.3'");
expect(infoSpy).toHaveBeenCalledWith( expect(infoSpy).toHaveBeenCalledWith(
@ -197,7 +204,14 @@ describe('Finder tests', () => {
); );
expect(installSpy).toHaveBeenCalled(); expect(installSpy).toHaveBeenCalled();
expect(addPathSpy).toHaveBeenCalledWith(expPath); expect(addPathSpy).toHaveBeenCalledWith(expPath);
await finder.useCpythonVersion('1.2.4-beta.2', 'x64', false, true, false); await finder.useCpythonVersion(
'1.2.4-beta.2',
'x64',
false,
true,
false,
false
);
expect(spyCoreAddPath).toHaveBeenCalled(); expect(spyCoreAddPath).toHaveBeenCalled();
expect(spyCoreExportVariable).toHaveBeenCalledWith( expect(spyCoreExportVariable).toHaveBeenCalledWith(
'pythonLocation', 'pythonLocation',
@ -224,7 +238,7 @@ describe('Finder tests', () => {
}); });
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists) // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await expect( await expect(
finder.useCpythonVersion('1.2', 'x64', false, false, false) finder.useCpythonVersion('1.2', 'x64', false, false, false, false)
).resolves.toEqual({ ).resolves.toEqual({
impl: 'CPython', impl: 'CPython',
version: '1.2.3' version: '1.2.3'
@ -251,17 +265,17 @@ describe('Finder tests', () => {
}); });
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists) // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
await expect( await expect(
finder.useCpythonVersion('1.1', 'x64', false, false, false) finder.useCpythonVersion('1.1', 'x64', false, false, false, false)
).rejects.toThrow(); ).rejects.toThrow();
await expect( await expect(
finder.useCpythonVersion('1.1', 'x64', false, false, true) finder.useCpythonVersion('1.1', 'x64', false, false, true, false)
).resolves.toEqual({ ).resolves.toEqual({
impl: 'CPython', impl: 'CPython',
version: '1.1.0-beta.2' version: '1.1.0-beta.2'
}); });
// Check 1.1.0 version specifier does not fallback to '1.1.0-beta.2' // Check 1.1.0 version specifier does not fallback to '1.1.0-beta.2'
await expect( await expect(
finder.useCpythonVersion('1.1.0', 'x64', false, false, true) finder.useCpythonVersion('1.1.0', 'x64', false, false, true, false)
).rejects.toThrow(); ).rejects.toThrow();
}); });
@ -269,7 +283,14 @@ describe('Finder tests', () => {
// This will throw if it doesn't find it in the cache and in the manifest (because no such version exists) // This will throw if it doesn't find it in the cache and in the manifest (because no such version exists)
let thrown = false; let thrown = false;
try { try {
await finder.useCpythonVersion('3.300000', 'x64', true, false, false); await finder.useCpythonVersion(
'3.300000',
'x64',
true,
false,
false,
false
);
} catch { } catch {
thrown = true; thrown = true;
} }

View File

@ -1,7 +1,7 @@
import fs from 'fs'; import fs from 'fs';
import {HttpClient} from '@actions/http-client'; import {HttpClient} from '@actions/http-client';
import * as ifm from '@actions/http-client/interfaces'; import * as ifm from '@actions/http-client/lib/interfaces';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import * as core from '@actions/core'; import * as core from '@actions/core';
@ -169,7 +169,7 @@ describeSkipOnWindows('installGraalPy', () => {
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson'); spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockImplementation( spyHttpClient.mockImplementation(
async (): Promise<ifm.ITypedResponse<IGraalPyManifestRelease[]>> => { async (): Promise<ifm.TypedResponse<IGraalPyManifestRelease[]>> => {
const result = JSON.stringify(manifestData); const result = JSON.stringify(manifestData);
return { return {
statusCode: 200, statusCode: 200,

View File

@ -1,7 +1,7 @@
import fs from 'fs'; import fs from 'fs';
import {HttpClient} from '@actions/http-client'; import {HttpClient} from '@actions/http-client';
import * as ifm from '@actions/http-client/interfaces'; import * as ifm from '@actions/http-client/lib/interfaces';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import * as core from '@actions/core'; import * as core from '@actions/core';
@ -265,7 +265,7 @@ describe('installPyPy', () => {
spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson'); spyHttpClient = jest.spyOn(HttpClient.prototype, 'getJson');
spyHttpClient.mockImplementation( spyHttpClient.mockImplementation(
async (): Promise<ifm.ITypedResponse<IPyPyManifestRelease[]>> => { async (): Promise<ifm.TypedResponse<IPyPyManifestRelease[]>> => {
const result = JSON.stringify(manifestData); const result = JSON.stringify(manifestData);
return { return {
statusCode: 200, statusCode: 200,

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'
);
});
});

View File

@ -12,7 +12,11 @@ import {
getVersionInputFromFile, getVersionInputFromFile,
getVersionInputFromPlainFile, getVersionInputFromPlainFile,
getVersionInputFromTomlFile, getVersionInputFromTomlFile,
getNextPageUrl getNextPageUrl,
isGhes,
IS_WINDOWS,
getDownloadFileName,
getVersionInputFromToolVersions
} from '../src/utils'; } from '../src/utils';
jest.mock('@actions/cache'); jest.mock('@actions/cache');
@ -136,6 +140,82 @@ describe('Version from file test', () => {
expect(_fn(pythonVersionFilePath)).toEqual([]); 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', () => { describe('getNextPageUrl', () => {
@ -159,3 +239,75 @@ describe('getNextPageUrl', () => {
expect(getNextPageUrl(generateResponse(page2Links))).toBeNull(); 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();
});
});

View File

@ -0,0 +1,3 @@
import sys
if __name__ == '__main__':
print(f"Using GIL: {sys._is_gil_enabled()}\n")

View File

@ -11,7 +11,7 @@ inputs:
description: "Used to specify a package manager for caching in the default directory. Supported values: pip, pipenv, poetry." description: "Used to specify a package manager for caching in the default directory. Supported values: pip, pipenv, poetry."
required: false required: false
architecture: architecture:
description: "The target architecture (x86, x64) of the Python or PyPy interpreter." description: "The target architecture (x86, x64, arm64) of the Python or PyPy interpreter."
check-latest: check-latest:
description: "Set this option if you want the action to check for the latest available version that satisfies the version spec." description: "Set this option if you want the action to check for the latest available version that satisfies the version spec."
default: false default: false
@ -26,6 +26,9 @@ inputs:
allow-prereleases: allow-prereleases:
description: "When 'true', a version range passed to 'python-version' input will match prerelease versions if no GA versions are found. Only 'x.y' version range is supported for CPython." description: "When 'true', a version range passed to 'python-version' input will match prerelease versions if no GA versions are found. Only 'x.y' version range is supported for CPython."
default: false default: false
freethreaded:
description: "When 'true', use the freethreaded version of Python."
default: false
outputs: outputs:
python-version: python-version:
description: "The installed Python or PyPy version. Useful when given a version range as input." description: "The installed Python or PyPy version. Useful when given a version range as input."
@ -34,7 +37,7 @@ outputs:
python-path: python-path:
description: "The absolute path to the Python or PyPy executable." description: "The absolute path to the Python or PyPy executable."
runs: runs:
using: 'node16' using: 'node20'
main: 'dist/setup/index.js' main: 'dist/setup/index.js'
post: 'dist/cache-save/index.js' post: 'dist/cache-save/index.js'
post-if: success() post-if: success()

44102
dist/cache-save/index.js vendored

File diff suppressed because one or more lines are too long

51721
dist/setup/index.js vendored

File diff suppressed because one or more lines are too long

View File

@ -18,7 +18,7 @@ Integration of caching functionality into `actions/setup-python` action will bri
We will add support for Pip and Pipenv dependency caching. We will add support for Pip and Pipenv dependency caching.
We won't pursue the goal to provide wide customization of caching in the scope of `actions/setup-python` action. The purpose of this integration is to cover ~90% of basic use-cases. If users need flexible customization, we will advise them to use `actions/cache` directly. We won't pursue the goal to provide wide customization of caching in the scope of `actions/setup-python` action. The purpose of this integration is to cover ~90% of basic use-cases. The action does not support dependency-specific caching for each job. If different dependencies are installed across jobs the cache from the first job will be used in the second job. To manage this aspect, users should create separate caches for jobs with different requirements. If users need flexible customization, we will advise them to use `actions/cache` directly.
## Decision ## Decision

View File

@ -2,7 +2,7 @@
- [Using the python-version input](advanced-usage.md#using-the-python-version-input) - [Using the python-version input](advanced-usage.md#using-the-python-version-input)
- [Specifying a Python version](advanced-usage.md#specifying-a-python-version) - [Specifying a Python version](advanced-usage.md#specifying-a-python-version)
- [Specifying a PyPy version](advanced-usage.md#specifying-a-pypy-version) - [Specifying a PyPy version](advanced-usage.md#specifying-a-pypy-version)
- [Specifying multiple Python and PyPy versions](advanced-usage.md#specifying-multiple-python/pypy-version) - [Specifying multiple Python/PyPy versions](advanced-usage.md#specifying-multiple-pythonpypy-versions)
- [Matrix Testing](advanced-usage.md#matrix-testing) - [Matrix Testing](advanced-usage.md#matrix-testing)
- [Using the python-version-file input](advanced-usage.md#using-the-python-version-file-input) - [Using the python-version-file input](advanced-usage.md#using-the-python-version-file-input)
- [Check latest version](advanced-usage.md#check-latest-version) - [Check latest version](advanced-usage.md#check-latest-version)
@ -11,9 +11,10 @@
- [Outputs](advanced-usage.md#outputs) - [Outputs](advanced-usage.md#outputs)
- [Environment variables](advanced-usage.md#environment-variables) - [Environment variables](advanced-usage.md#environment-variables)
- [Using update-environment flag](advanced-usage.md#using-update-environment-flag) - [Using update-environment flag](advanced-usage.md#using-update-environment-flag)
- [Available versions of Python and PyPy](advanced-usage.md#available-versions-of-python-and-pypy) - [Available versions of Python and PyPy](advanced-usage.md#available-versions-of-python-pypy-and-graalpy)
- [Python](advanced-usage.md#python) - [Python](advanced-usage.md#python)
- [PyPy](advanced-usage.md#pypy) - [PyPy](advanced-usage.md#pypy)
- [GraalPy](advanced-usage.md#graalpy)
- [Hosted tool cache](advanced-usage.md#hosted-tool-cache) - [Hosted tool cache](advanced-usage.md#hosted-tool-cache)
- [Using `setup-python` with a self-hosted runner](advanced-usage.md#using-setup-python-with-a-self-hosted-runner) - [Using `setup-python` with a self-hosted runner](advanced-usage.md#using-setup-python-with-a-self-hosted-runner)
- [Windows](advanced-usage.md#windows) - [Windows](advanced-usage.md#windows)
@ -26,14 +27,14 @@
### Specifying a Python version ### Specifying a Python version
If there is a specific version of Python that you need and you don't want to worry about any potential breaking changes due to patch updates (going from `3.7.5` to `3.7.6` for example), you should specify the **exact major, minor, and patch version** (such as `3.7.5`): If there is a specific version of Python that you need and you don't want to worry about any potential breaking changes due to patch updates (going from `3.12.6` to `3.12.7` for example), you should specify the **exact major, minor, and patch version** (such as `3.12.6`):
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.7.5' python-version: '3.12.6'
- run: python my_script.py - run: python my_script.py
``` ```
@ -45,9 +46,9 @@ You can specify **only a major and minor version** if you are okay with the most
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.7' python-version: '3.13'
- run: python my_script.py - run: python my_script.py
``` ```
- There will be a single patch version already installed on each runner for every minor version of Python that is supported. - There will be a single patch version already installed on each runner for every minor version of Python that is supported.
@ -59,9 +60,9 @@ You can specify the version with **prerelease tag** to download and set up an ac
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.12.0-alpha.1' python-version: '3.14.0-alpha.1'
- run: python my_script.py - run: python my_script.py
``` ```
@ -70,9 +71,34 @@ It's also possible to use **x.y-dev syntax** to download and set up the latest p
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.12-dev' python-version: '3.14-dev'
- run: python my_script.py
```
You can specify the [free threading](https://docs.python.org/3/howto/free-threading-python.html) version of Python by setting the `freethreaded` input to `true` or by using the special **t** suffix in some cases.
You can use the **t** suffix when specifying the major and minor version (e.g., `3.13t`), with a patch version (e.g., `3.13.1t`), or with the **x.y-dev syntax** (e.g., `3.14t-dev`).
Free threaded Python is only available starting with the 3.13 release.
```yaml
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.13t'
- run: python my_script.py
```
Note that the **t** suffix is not `semver` syntax. If you wish to specify a range, you must use the `freethreaded` input instead of the `t` suffix.
```yaml
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '>=3.13'
freethreaded: true
- run: python my_script.py - run: python my_script.py
``` ```
@ -83,9 +109,9 @@ You can also use several types of ranges that are specified in [semver](https://
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '>=3.9 <3.10' python-version: '>=3.9 <3.14'
- run: python my_script.py - run: python my_script.py
``` ```
@ -94,18 +120,18 @@ steps:
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.12.0-alpha - 3.12.0' python-version: '3.13.0-alpha - 3.13.0'
- run: python my_script.py - run: python my_script.py
``` ```
- **[x-ranges](https://github.com/npm/node-semver#x-ranges-12x-1x-12-)** to specify the latest stable version of Python (for specified major version): - **[x-ranges](https://github.com/npm/node-semver#x-ranges-12x-1x-12-)** to specify the latest stable version of Python (for the specified major version):
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.x' python-version: '3.x'
- run: python my_script.py - run: python my_script.py
@ -117,8 +143,8 @@ The version of PyPy should be specified in the format `pypy<python_version>[-v<p
The `-v<pypy_version>` parameter is optional and can be skipped. The latest PyPy version will be used in this case. The `-v<pypy_version>` parameter is optional and can be skipped. The latest PyPy version will be used in this case.
``` ```
pypy3.10 or pypy-3.10 # the latest available version of PyPy that supports Python 3.10
pypy3.9 or pypy-3.9 # the latest available version of PyPy that supports Python 3.9 pypy3.9 or pypy-3.9 # the latest available version of PyPy that supports Python 3.9
pypy2.7 or pypy-2.7 # the latest available version of PyPy that supports Python 2.7
pypy3.7-v7.3.3 or pypy-3.7-v7.3.3 # Python 3.7 and PyPy 7.3.3 pypy3.7-v7.3.3 or pypy-3.7-v7.3.3 # Python 3.7 and PyPy 7.3.3
pypy3.7-v7.x or pypy-3.7-v7.x # Python 3.7 and the latest available PyPy 7.x pypy3.7-v7.x or pypy-3.7-v7.x # Python 3.7 and the latest available PyPy 7.x
pypy3.7-v7.3.3rc1 or pypy-3.7-v7.3.3rc1 # Python 3.7 and preview version of PyPy pypy3.7-v7.3.3rc1 or pypy-3.7-v7.3.3rc1 # Python 3.7 and preview version of PyPy
@ -134,18 +160,18 @@ jobs:
strategy: strategy:
matrix: matrix:
python-version: python-version:
- 'pypy3.7' # the latest available version of PyPy that supports Python 3.7 - 'pypy3.10' # the latest available version of PyPy that supports Python 3.10
- 'pypy3.7-v7.3.3' # Python 3.7 and PyPy 7.3.3 - 'pypy3.10-v7.3.17' # Python 3.10 and PyPy 7.3.17
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- run: python my_script.py - run: python my_script.py
``` ```
More details on PyPy syntax can be found in the [Available versions of PyPy](#pypy) section. More details on the syntax for PyPy can be found in the [Available versions of PyPy](#pypy) section.
### Specifying multiple Python/PyPy version ### Specifying multiple Python/PyPy versions
The python-version input can get multiple python/pypy versions. The last specified version will be used as a default one. The python-version input can get multiple python/pypy versions. The last specified version will be used as a default one.
Download and set up multiple Python versions: Download and set up multiple Python versions:
@ -156,12 +182,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: | python-version: |
3.8 3.11
3.9 3.12
3.10 3.13
- run: python my_script.py - run: python my_script.py
``` ```
@ -173,12 +199,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: | python-version: |
pypy-3.7-v7.3.x pypy-3.10-v7.3.x
pypy3.9-nightly pypy3.10-nightly
pypy3.8 pypy3.9
- run: python my_script.py - run: python my_script.py
``` ```
@ -190,20 +216,20 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: | python-version: |
3.8 3.11
3.9 3.12
pypy3.9-nightly pypy3.10-nightly
pypy3.8 pypy3.10
3.10 3.13
- run: python my_script.py - run: python my_script.py
``` ```
### Matrix Testing ### Matrix Testing
Using `setup-python` it's possible to use [matrix syntax](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix) to install several versions of Python or PyPy: Using `setup-python` it's possible to use the [matrix syntax](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix) to install several versions of Python or PyPy:
```yaml ```yaml
jobs: jobs:
@ -211,12 +237,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
python-version: [ '2.x', '3.x', 'pypy2.7', 'pypy3.8', 'pypy3.9' ] python-version: ['3.x', 'pypy3.8', 'pypy3.9' ]
name: Python ${{ matrix.python-version }} sample name: Python ${{ matrix.python-version }} sample
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
architecture: x64 architecture: x64
@ -230,21 +256,23 @@ jobs:
build: build:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
fail-fast: false
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
python-version: ['2.7', '3.7', '3.8', '3.9', '3.10', 'pypy2.7', 'pypy3.9'] python-version: ['3.9', '3.10', '3.11', 'pypy3.9']
exclude: exclude:
- os: macos-latest - os: macos-latest
python-version: '3.8' python-version: '3.9'
- os: windows-latest - os: windows-latest
python-version: '3.6' python-version: '3.9'
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v4 uses: actions/setup-python@v5
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- name: Display Python version - name: Display Python version
if: ${{ matrix.python-version != 'pypy3.9' }} # Use single quotes in expressions for input `python-version`
run: python --version run: python --version
``` ```
@ -252,12 +280,12 @@ jobs:
`setup-python` action can read Python or PyPy version from a version file. `python-version-file` input is used for specifying the path to the version file. If the file that was supplied to `python-version-file` input doesn't exist, the action will fail with error. `setup-python` action can read Python or PyPy version from a version file. `python-version-file` input is used for specifying the path to the version file. If the file that was supplied to `python-version-file` input doesn't exist, the action will fail with error.
>In case both `python-version` and `python-version-file` inputs are supplied, the `python-version-file` input will be ignored due to its lower priority. >In case both `python-version` and `python-version-file` inputs are supplied, the `python-version-file` input will be ignored due to its lower priority. The .tool-versions file supports version specifications in accordance with asdf standards, adhering to Semantic Versioning ([semver](https://semver.org)).
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version-file: '.python-version' # Read python version from a file .python-version python-version-file: '.python-version' # Read python version from a file .python-version
- run: python my_script.py - run: python my_script.py
@ -266,12 +294,21 @@ steps:
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version-file: 'pyproject.toml' # Read python version from a file pyproject.toml python-version-file: 'pyproject.toml' # Read python version from a file pyproject.toml
- run: python my_script.py - run: python my_script.py
``` ```
```yaml
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version-file: '.tool-versions' # Read python version from a file .tool-versions
- run: python my_script.py
```
## Check latest version ## Check latest version
The `check-latest` flag defaults to `false`. Use the default or set `check-latest` to `false` if you prefer stability and if you want to ensure a specific `Python or PyPy` version is always used. The `check-latest` flag defaults to `false`. Use the default or set `check-latest` to `false` if you prefer stability and if you want to ensure a specific `Python or PyPy` version is always used.
@ -281,13 +318,13 @@ If `check-latest` is set to `true`, the action first checks if the cached versio
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.7' python-version: '3.13'
check-latest: true check-latest: true
- run: python my_script.py - run: python my_script.py
``` ```
> Setting `check-latest` to `true` has performance implications as downloading `Python or PyPy` versions is slower than using cached versions. > Setting `check-latest` to `true` impacts performance as downloading `Python or PyPy` versions is slower than using cached versions.
## Caching packages ## Caching packages
@ -296,9 +333,9 @@ steps:
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: '3.13'
cache: 'pipenv' cache: 'pipenv'
- name: Install pipenv - name: Install pipenv
run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python run: curl https://raw.githubusercontent.com/pypa/pipenv/master/get-pipenv.py | python
@ -311,21 +348,22 @@ steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Install poetry - name: Install poetry
run: pipx install poetry run: pipx install poetry
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: '3.13'
cache: 'poetry' cache: 'poetry'
- run: poetry install - run: poetry install
- run: poetry run pytest - run: poetry run pytest
``` ```
>**Note:** If the `setup-python` version does not match the version specified in `pyproject.toml` and the python version in `pyproject.toml` is less than the runner's python version, `poetry install` will default to using the runner's Python version.
**Using a list of file paths to cache dependencies** **Using a list of file paths to cache dependencies**
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: '3.13'
cache: 'pipenv' cache: 'pipenv'
cache-dependency-path: | cache-dependency-path: |
server/app/Pipfile.lock server/app/Pipfile.lock
@ -338,9 +376,9 @@ steps:
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: '3.13'
cache: 'pip' cache: 'pip'
cache-dependency-path: '**/requirements-dev.txt' cache-dependency-path: '**/requirements-dev.txt'
- run: pip install -r subdirectory/requirements-dev.txt - run: pip install -r subdirectory/requirements-dev.txt
@ -350,9 +388,9 @@ steps:
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.10' python-version: '3.13'
cache: 'pip' cache: 'pip'
cache-dependency-path: | cache-dependency-path: |
**/setup.cfg **/setup.cfg
@ -365,9 +403,9 @@ steps:
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.11' python-version: '3.13'
cache: 'pip' cache: 'pip'
cache-dependency-path: setup.py cache-dependency-path: setup.py
- run: pip install -e . - run: pip install -e .
@ -380,7 +418,7 @@ steps:
### `python-version` ### `python-version`
Using **python-version** output it's possible to get the installed by action Python or PyPy version. This output is useful when the input `python-version` is given as a range (e.g. 3.8.0 - 3.10.0 ), but down in a workflow you need to operate with the exact installed version (e.g. 3.10.1). Using **python-version** output, it's possible to get the precise Python or PyPy version installed by the action. This output is useful when the input `python-version` is given as a range (e.g. 3.9.0 - 3.12.0, 3.x ), but down the line you need to operate (such as in an `if:` statement) with the exact installed version (e.g. 3.12.0).
```yaml ```yaml
jobs: jobs:
@ -388,16 +426,16 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
id: cp310 id: cp312
with: with:
python-version: "3.8.0 - 3.10.0" python-version: "3.9.0 - 3.12.0"
- run: echo '${{ steps.cp310.outputs.python-version }}' - run: echo '${{ steps.cp312.outputs.python-version }}'
``` ```
### `python-path` ### `python-path`
**python-path** output is available with the absolute path of the Python or PyPy interpreter executable if you need it: **python-path** output is available to get the absolute path of the Python or PyPy interpreter executable:
```yaml ```yaml
jobs: jobs:
@ -405,11 +443,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
id: cp310 id: cp313
with: with:
python-version: "3.10" python-version: "3.13"
- run: pipx run --python '${{ steps.cp310.outputs.python-path }}' nox --version - run: pipx run --python '${{ steps.cp313.outputs.python-path }}' nox --version
``` ```
### `cache-hit` ### `cache-hit`
@ -421,12 +459,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
id: cp310 id: cp313
with: with:
python-version: "3.8.0" python-version: "3.13.0"
cache: "poetry" cache: "poetry"
- run: echo '${{ steps.cp310.outputs.cache-hit }}' # true if cache-hit occurred on the primary key - run: echo '${{ steps.cp313.outputs.cache-hit }}' # true if cache-hit occurred on the primary key
``` ```
## Environment variables ## Environment variables
@ -446,30 +484,30 @@ The `update-environment` flag defaults to `true`.
With this setting, the action will add/update environment variables (e.g. `PATH`, `PKG_CONFIG_PATH`, `pythonLocation`) for Python or PyPy to just work out of the box. With this setting, the action will add/update environment variables (e.g. `PATH`, `PKG_CONFIG_PATH`, `pythonLocation`) for Python or PyPy to just work out of the box.
If `update-environment` is set to `false`, the action will not add/update environment variables. If `update-environment` is set to `false`, the action will not add/update environment variables.
This can prove useful if you want the only side-effect to be to ensure Python or PyPy is installed and rely on the `python-path` output to run executable. This can prove useful if you only want the side-effect to ensure that Python or PyPy is installed and rely on the `python-path` output to run the executable.
Such a requirement on side-effect could be because you don't want your composite action messing with your user's workflows. Such a requirement on side-effect could be because you don't want your composite action messing with your user's workflows.
```yaml ```yaml
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
id: cp310 id: cp313
with: with:
python-version: '3.10' python-version: '3.13'
update-environment: false update-environment: false
- run: ${{ steps.cp310.outputs.python-path }} my_script.py - run: ${{ steps.cp313.outputs.python-path }} my_script.py
``` ```
## Available versions of Python and PyPy ## Available versions of Python, PyPy and GraalPy
### Python ### Python
`setup-python` is able to configure **Python** from two sources: `setup-python` is able to configure **Python** from two sources:
- Preinstalled versions of Python in the tool cache on GitHub-hosted runners. - Preinstalled versions of Python in the tool cache on GitHub-hosted runners.
- For detailed information regarding the available versions of Python that are installed, see [Supported software](https://docs.github.com/en/actions/reference/specifications-for-github-hosted-runners#supported-software). - For detailed information regarding the available versions of Python that are installed, see [Supported software](https://docs.github.com/en/actions/reference/specifications-for-github-hosted-runners#supported-software).
- For every minor version of Python, expect only the latest patch to be preinstalled. - For every minor versions of Python, expect only the latest patch to be preinstalled.
- If `3.8.1` is installed for example, and `3.8.2` is released, expect `3.8.1` to be removed and replaced by `3.8.2` in the tool cache. - If `3.12.1` is installed for example, and `3.12.2` is released, expect `3.12.1` to be removed and replaced by `3.12.2` in the tool cache.
- If the exact patch version doesn't matter to you, specifying just the major and minor versions will get you the latest preinstalled patch version. In the previous example, the version spec `3.8` will use the `3.8.2` Python version found in the cache. - If the exact patch version doesn't matter to you, specifying just the major and minor versions will get you the latest preinstalled patch version. In the previous example, the version spec `3.12` will use the `3.12.2` Python version found in the cache.
- Use `-dev` instead of a patch number (e.g., `3.12-dev`) to install the latest patch version release for a given minor version, *alpha and beta releases included*. - Use `-dev` instead of a patch number (e.g., `3.14-dev`) to install the latest patch version release for a given minor version, *alpha and beta releases included*.
- Downloadable Python versions from GitHub Releases ([actions/python-versions](https://github.com/actions/python-versions/releases)). - Downloadable Python versions from GitHub Releases ([actions/python-versions](https://github.com/actions/python-versions/releases)).
- All available versions are listed in the [version-manifest.json](https://github.com/actions/python-versions/blob/main/versions-manifest.json) file. - All available versions are listed in the [version-manifest.json](https://github.com/actions/python-versions/blob/main/versions-manifest.json) file.
- If there is a specific version of Python that is not available, you can open an issue here - If there is a specific version of Python that is not available, you can open an issue here
@ -483,13 +521,18 @@ Such a requirement on side-effect could be because you don't want your composite
- Preinstalled versions of PyPy in the tool cache on GitHub-hosted runners - Preinstalled versions of PyPy in the tool cache on GitHub-hosted runners
- For detailed information regarding the available versions of PyPy that are installed, see [Supported software](https://docs.github.com/en/actions/reference/specifications-for-github-hosted-runners#supported-software). - For detailed information regarding the available versions of PyPy that are installed, see [Supported software](https://docs.github.com/en/actions/reference/specifications-for-github-hosted-runners#supported-software).
- For the latest PyPy release, all versions of Python are cached. - For the latest PyPy release, all versions of Python are cached.
- Cache is updated with a 1-2 week delay. If you specify the PyPy version as `pypy3.7` or `pypy-3.7`, the cached version will be used although a newer version is available. If you need to start using the recently released version right after release, you should specify the exact PyPy version using `pypy3.7-v7.3.3` or `pypy-3.7-v7.3.3`. - Cache is updated with a 1-2 week delay. If you specify the PyPy version as `pypy3.10` or `pypy-3.10`, the cached version will be used although a newer version is available. If you need to start using the recently released version right after release, you should specify the exact PyPy version using `pypy3.10-v7.3.17` or `pypy-3.10-v7.3.17`.
- Downloadable PyPy versions from the [official PyPy site](https://downloads.python.org/pypy/). - Downloadable PyPy versions from the [official PyPy site](https://downloads.python.org/pypy/).
- All available versions that we can download are listed in [versions.json](https://downloads.python.org/pypy/versions.json) file. - All available versions that we can download are listed in [versions.json](https://downloads.python.org/pypy/versions.json) file.
- PyPy < 7.3.3 are not available to install on-flight. - PyPy < 7.3.3 are not available to install on-flight.
- If some versions are not available, you can open an issue in https://foss.heptapod.net/pypy/pypy/ - If some versions are not available, you can open an issue in https://foss.heptapod.net/pypy/pypy/
### GraalPy
`setup-python` is able to download GraalPy versions from the [official GraalPy repository](https://github.com/oracle/graalpython).
- All available versions that we can download are listed in [releases](https://github.com/oracle/graalpython/releases).
## Hosted tool cache ## Hosted tool cache
GitHub hosted runners have a tool cache that comes with a few versions of Python + PyPy already installed. This tool cache helps speed up runs and tool setup by not requiring any new downloads. There is an environment variable called `RUNNER_TOOL_CACHE` on each runner that describes the location of the tool cache with Python and PyPy installed. `setup-python` works by taking a specific version of Python or PyPy from this tool cache and adding it to PATH. GitHub hosted runners have a tool cache that comes with a few versions of Python + PyPy already installed. This tool cache helps speed up runs and tool setup by not requiring any new downloads. There is an environment variable called `RUNNER_TOOL_CACHE` on each runner that describes the location of the tool cache with Python and PyPy installed. `setup-python` works by taking a specific version of Python or PyPy from this tool cache and adding it to PATH.
@ -526,11 +569,11 @@ If you have a supported self-hosted runner and you would like to use `setup-pyth
### Linux ### Linux
By default runner downloads and installs tools into the folder set up by `RUNNER_TOOL_CACHE` environment variable. The environment variable called `AGENT_TOOLSDIRECTORY` can be set to change this location for Linux self-hosted runners: By default, the runner downloads and installs tools into the folder set up by `RUNNER_TOOL_CACHE` environment variable. The environment variable called `AGENT_TOOLSDIRECTORY` can be set to change this location for Linux self-hosted runners:
- In the same shell that your runner is using, type `export AGENT_TOOLSDIRECTORY=/path/to/folder`. - In the same shell that your runner is using, type `export AGENT_TOOLSDIRECTORY=/path/to/folder`.
- More permanent way of setting the environment variable is to create an `.env` file in the same directory as your runner and to add `AGENT_TOOLSDIRECTORY=/path/to/folder`. This ensures the variable is always set if your runner is configured as a service. - More permanent way of setting the environment variable is to create an `.env` file in the same directory as your runner and to add `AGENT_TOOLSDIRECTORY=/path/to/folder`. This ensures the variable is always set if your runner is configured as a service.
If you're using a non-default tool cache directory be sure that the user starting the runner has write permission to the new tool cache directory. To check the current user and group that the runner belongs type `ls -l` inside the runner's root directory. If you're using a non-default tool cache directory be sure that the user starting the runner has write permission to the new tool cache directory. To check the current user and group that the runner belongs, type `ls -l` inside the runner's root directory.
The runner can be granted write access to any directory using a few techniques: The runner can be granted write access to any directory using a few techniques:
- The user starting the runner is the owner, and the owner has write permission. - The user starting the runner is the owner, and the owner has write permission.
@ -566,29 +609,10 @@ One quick way to grant access is to change the user and group of `/Users/runner/
### Avoiding rate limit issues ### Avoiding rate limit issues
`setup-python` comes pre-installed on the appliance with GHES if Actions is enabled. When dynamically downloading Python distributions, `setup-python` downloads distributions from [`actions/python-versions`](https://github.com/actions/python-versions) on github.com (outside of the appliance). These calls to `actions/python-versions` are by default made via unauthenticated requests, which are limited to [60 requests per hour per IP](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting). If more requests are made within the time frame, then you will start to see rate-limit errors during downloading that look like this: `setup-python` comes pre-installed on the appliance with GHES if Actions is enabled. When dynamically downloading Python distributions, `setup-python` downloads distributions from [`actions/python-versions`](https://github.com/actions/python-versions) on github.com (outside of the appliance). These calls to `actions/python-versions` are by default made via unauthenticated requests, which are limited to [60 requests per hour per IP](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting). If more requests are made within the time frame, then the action leverages the `raw API` to retrieve the version-manifest. This approach does not impose a rate limit and hence facilitates unrestricted consumption. This is particularly beneficial for GHES runners, which often share the same IP due to Network Address Translation (NAT), to avoid the quick exhaustion of the unauthenticated rate limit.
##[error]API rate limit exceeded for YOUR_IP. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)
To get a higher rate limit, you can [generate a personal access token (PAT) on github.com](https://github.com/settings/tokens/new) and pass it as the `token` input for the action. It is important to understand that this needs to be a token from github.com and _not_ from your GHES instance. If you or your colleagues do not yet have a github.com account, you might need to create one.
Here are the steps you need to follow to avoid the rate limit:
1. Create a PAT on any github.com account by using [this link](https://github.com/settings/tokens/new) after logging into github.com (not your Enterprise instance). This PAT does _not_ need any rights, so make sure all the boxes are unchecked.
2. Store this PAT in the repository / organization where you run your workflow, e.g. as `GH_GITHUB_COM_TOKEN`. You can do this by navigating to your repository -> **Settings** -> **Secrets** -> **Actions** -> **New repository secret**.
3. To use this functionality, you need to use any version newer than `v4.3`. Also, change _python-version_ as needed.
```yml
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.8
token: ${{ secrets.GH_GITHUB_COM_TOKEN }}
```
Requests should now be authenticated. To verify that you are getting the higher rate limit, you can call GitHub's [rate limit API](https://docs.github.com/en/rest/rate-limit) from within your workflow ([example](https://github.com/actions/setup-python/pull/443#issuecomment-1206776401)).
### No access to github.com ### No access to github.com
If the runner is not able to access github.com, any Python versions requested during a workflow run must come from the runner's tool cache. See "[Setting up the tool cache on self-hosted runners without internet access](https://docs.github.com/en/enterprise-server/admin/github-actions/managing-access-to-actions-from-githubcom/setting-up-the-tool-cache-on-self-hosted-runners-without-internet-access)" for more information. If the runner is not able to access github.com, any Python versions requested during a workflow run must come from the runner's tool cache. See "[Setting up the tool cache on self-hosted runners without internet access](https://docs.github.com/en/enterprise-server/admin/github-actions/managing-access-to-actions-from-githubcom/setting-up-the-tool-cache-on-self-hosted-runners-without-internet-access)" for more information.
@ -608,11 +632,11 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
os: [Ubuntu, Windows, macOS] os: [Ubuntu, Windows, macOS]
python_version: ["3.11", "3.12"] python_version: ["3.11", "3.12", "3.13"]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: "${{ matrix.python_version }}" python-version: "${{ matrix.python_version }}"
allow-prereleases: true allow-prereleases: true

View File

@ -6,13 +6,13 @@ We have prepared a short guide so that the process of making your contribution i
## How can I contribute... ## How can I contribute...
* [Contribute Documentation:green_book:](#contribute-documentation) * [Contribute Documentation :green_book:](#contribute-documentation)
* [Contribute Code :computer:](#contribute-code) * [Contribute Code :computer:](#contribute-code)
* [Provide Support on Issues:pencil:](#provide-support-on-issues) * [Provide Support on Issues :pencil:](#provide-support-on-issues)
* [Review Pull Requests:mag:](#review-pull-requests) * [Review Pull Requests :mag:](#review-pull-requests)
## Contribute documentation ## Contribute documentation

6242
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "setup-python", "name": "setup-python",
"version": "4.0.0", "version": "5.0.0",
"private": true, "private": true,
"description": "Setup python action", "description": "Setup python action",
"main": "dist/index.js", "main": "dist/index.js",
@ -11,7 +11,7 @@
"lint": "eslint --config ./.eslintrc.js \"**/*.ts\"", "lint": "eslint --config ./.eslintrc.js \"**/*.ts\"",
"lint:fix": "eslint --config ./.eslintrc.js \"**/*.ts\" --fix", "lint:fix": "eslint --config ./.eslintrc.js \"**/*.ts\" --fix",
"release": "ncc build -o dist/setup src/setup-python.ts && ncc build -o dist/cache-save src/cache-save.ts && git add -f dist/", "release": "ncc build -o dist/setup src/setup-python.ts && ncc build -o dist/cache-save src/cache-save.ts && git add -f dist/",
"test": "jest --coverage" "test": "jest --runInBand --coverage"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -25,38 +25,31 @@
"author": "GitHub", "author": "GitHub",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/cache": "^3.0.4", "@actions/cache": "^4.0.3",
"@actions/core": "^1.10.0", "@actions/core": "^1.10.0",
"@actions/exec": "^1.1.0", "@actions/exec": "^1.1.0",
"@actions/glob": "^0.2.0", "@actions/glob": "^0.5.0",
"@actions/http-client": "^1.0.11", "@actions/http-client": "^2.2.3",
"@actions/io": "^1.0.2", "@actions/io": "^1.0.2",
"@actions/tool-cache": "^1.5.5", "@actions/tool-cache": "^2.0.1",
"@iarna/toml": "^2.2.5", "@iarna/toml": "^3.0.0",
"semver": "^7.5.2" "semver": "^7.6.0"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.6", "@types/jest": "^29.5.12",
"@types/node": "^16.11.25", "@types/node": "^20.11.25",
"@types/semver": "^7.1.0", "@types/semver": "^7.5.8",
"@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0", "@typescript-eslint/parser": "^5.54.0",
"@vercel/ncc": "^0.38.0", "@vercel/ncc": "^0.38.3",
"eslint": "^8.35.0", "eslint": "^8.57.0",
"eslint-config-prettier": "^8.6.0", "eslint-config-prettier": "^8.6.0",
"eslint-plugin-jest": "^27.2.1", "eslint-plugin-jest": "^27.9.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"husky": "^7.0.2",
"jest": "^29.7.0", "jest": "^29.7.0",
"jest-circus": "^29.7.0", "jest-circus": "^29.7.0",
"prettier": "^2.8.4", "prettier": "^2.8.4",
"ts-jest": "^29.1.1", "ts-jest": "^29.1.2",
"typescript": "^4.2.3" "typescript": "^5.4.2"
},
"husky": {
"skipCI": true,
"hooks": {
"pre-commit": "npm run build && npm run format-check"
}
} }
} }

View File

@ -67,11 +67,11 @@ class PipCache extends CacheDistributor {
if (IS_LINUX) { if (IS_LINUX) {
const osInfo = await getLinuxInfo(); const osInfo = await getLinuxInfo();
primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}-${hash}`;
restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}`; restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-${osInfo.osVersion}-${osInfo.osName}-python-${this.pythonVersion}-${this.packageManager}`;
} else { } else {
primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-${hash}`;
restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}`; restoreKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}`;
} }
return { return {

View File

@ -32,7 +32,7 @@ class PipenvCache extends CacheDistributor {
protected async computeKeys() { protected async computeKeys() {
const hash = await glob.hashFiles(this.patterns); const hash = await glob.hashFiles(this.patterns);
const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-${hash}`; const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-${hash}`;
const restoreKey = undefined; const restoreKey = undefined;
return { return {
primaryKey, primaryKey,

View File

@ -47,7 +47,7 @@ class PoetryCache extends CacheDistributor {
protected async computeKeys() { protected async computeKeys() {
const hash = await glob.hashFiles(this.patterns); const hash = await glob.hashFiles(this.patterns);
// "v2" is here to invalidate old caches of this cache distributor, which were created broken: // "v2" is here to invalidate old caches of this cache distributor, which were created broken:
const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-python-${this.pythonVersion}-${this.packageManager}-v2-${hash}`; const primaryKey = `${this.CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-python-${this.pythonVersion}-${this.packageManager}-v2-${hash}`;
const restoreKey = undefined; const restoreKey = undefined;
return { return {
primaryKey, primaryKey,

View File

@ -4,11 +4,18 @@ import * as cache from '@actions/cache';
import fs from 'fs'; import fs from 'fs';
import {State} from './cache-distributions/cache-distributor'; import {State} from './cache-distributions/cache-distributor';
export async function run() { // Added early exit to resolve issue with slow post action step:
// - https://github.com/actions/setup-node/issues/878
// https://github.com/actions/cache/pull/1217
export async function run(earlyExit?: boolean) {
try { try {
const cache = core.getInput('cache'); const cache = core.getInput('cache');
if (cache) { if (cache) {
await saveCache(cache); await saveCache(cache);
if (earlyExit) {
process.exit(0);
}
} }
} catch (error) { } catch (error) {
const err = error as Error; const err = error as Error;
@ -34,7 +41,7 @@ async function saveCache(packageManager: string) {
throw new Error( throw new Error(
`Cache folder path is retrieved for ${packageManager} but doesn't exist on disk: ${cachePaths.join( `Cache folder path is retrieved for ${packageManager} but doesn't exist on disk: ${cachePaths.join(
', ' ', '
)}` )}. This likely indicates that there are no dependencies to cache. Consider removing the cache step if it is not needed.`
); );
} }
@ -76,4 +83,4 @@ function isCacheDirectoryExists(cacheDirectory: string[]) {
return result; return result;
} }
run(); run(true);

View File

@ -35,16 +35,28 @@ export async function useCpythonVersion(
architecture: string, architecture: string,
updateEnvironment: boolean, updateEnvironment: boolean,
checkLatest: boolean, checkLatest: boolean,
allowPreReleases: boolean allowPreReleases: boolean,
freethreaded: boolean
): Promise<InstalledVersion> { ): Promise<InstalledVersion> {
let manifest: tc.IToolRelease[] | null = null; let manifest: tc.IToolRelease[] | null = null;
const desugaredVersionSpec = desugarDevVersion(version); const {version: desugaredVersionSpec, freethreaded: versionFreethreaded} =
desugarVersion(version);
let semanticVersionSpec = pythonVersionToSemantic( let semanticVersionSpec = pythonVersionToSemantic(
desugaredVersionSpec, desugaredVersionSpec,
allowPreReleases allowPreReleases
); );
if (versionFreethreaded) {
// Use the freethreaded version if it was specified in the input, e.g., 3.13t
freethreaded = true;
}
core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`); core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`);
if (freethreaded) {
// Free threaded versions use an architecture suffix like `x64-freethreaded`
core.debug(`Using freethreaded version of ${semanticVersionSpec}`);
architecture += '-freethreaded';
}
if (checkLatest) { if (checkLatest) {
manifest = await installer.getManifest(); manifest = await installer.getManifest();
const resolvedVersion = ( const resolvedVersion = (
@ -90,16 +102,22 @@ export async function useCpythonVersion(
if (!installDir) { if (!installDir) {
const osInfo = await getOSInfo(); const osInfo = await getOSInfo();
throw new Error( const msg = [
[ `The version '${version}' with architecture '${architecture}' was not found for ${
`The version '${version}' with architecture '${architecture}' was not found for ${ osInfo
osInfo ? `${osInfo.osName} ${osInfo.osVersion}`
? `${osInfo.osName} ${osInfo.osVersion}` : 'this operating system'
: 'this operating system' }.`
}.`, ];
`The list of all available versions can be found here: ${installer.MANIFEST_URL}` if (freethreaded) {
].join(os.EOL) msg.push(
`Free threaded versions are only available for Python 3.13.0 and later.`
);
}
msg.push(
`The list of all available versions can be found here: ${installer.MANIFEST_URL}`
); );
throw new Error(msg.join(os.EOL));
} }
const _binDir = binDir(installDir); const _binDir = binDir(installDir);
@ -153,10 +171,38 @@ export async function useCpythonVersion(
} }
const installed = versionFromPath(installDir); const installed = versionFromPath(installDir);
core.setOutput('python-version', installed); let pythonVersion = installed;
if (freethreaded) {
// Add the freethreaded suffix to the version (e.g., 3.13.1t)
pythonVersion += 't';
}
core.setOutput('python-version', pythonVersion);
core.setOutput('python-path', pythonPath); core.setOutput('python-path', pythonPath);
return {impl: 'CPython', version: installed}; return {impl: 'CPython', version: pythonVersion};
}
/* Desugar free threaded and dev versions */
export function desugarVersion(versionSpec: string) {
const {version, freethreaded} = desugarFreeThreadedVersion(versionSpec);
return {version: desugarDevVersion(version), freethreaded};
}
/* Identify freethreaded versions like, 3.13t, 3.13.1t, 3.13t-dev.
* Returns the version without the `t` and the architectures suffix, if freethreaded */
function desugarFreeThreadedVersion(versionSpec: string) {
const majorMinor = /^(\d+\.\d+(\.\d+)?)(t)$/;
if (majorMinor.test(versionSpec)) {
return {version: versionSpec.replace(majorMinor, '$1'), freethreaded: true};
}
const devVersion = /^(\d+\.\d+)(t)(-dev)$/;
if (devVersion.test(versionSpec)) {
return {
version: versionSpec.replace(devVersion, '$1$3'),
freethreaded: true
};
}
return {version: versionSpec, freethreaded: false};
} }
/** Convert versions like `3.8-dev` to a version like `~3.8.0-0`. */ /** Convert versions like `3.8-dev` to a version like `~3.8.0-0`. */

View File

@ -4,9 +4,11 @@ import * as core from '@actions/core';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import * as semver from 'semver'; import * as semver from 'semver';
import * as httpm from '@actions/http-client'; import * as httpm from '@actions/http-client';
import * as ifm from '@actions/http-client/interfaces'; import * as ifm from '@actions/http-client/lib/interfaces';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import fs from 'fs'; import fs from 'fs';
import * as http from 'http';
import { import {
IS_WINDOWS, IS_WINDOWS,
@ -108,7 +110,7 @@ export async function installGraalPy(
export async function getAvailableGraalPyVersions() { export async function getAvailableGraalPyVersions() {
const http: httpm.HttpClient = new httpm.HttpClient('tool-cache'); const http: httpm.HttpClient = new httpm.HttpClient('tool-cache');
const headers: ifm.IHeaders = {}; const headers: http.OutgoingHttpHeaders = {};
if (AUTH) { if (AUTH) {
headers.authorization = AUTH; headers.authorization = AUTH;
} }
@ -117,7 +119,7 @@ export async function getAvailableGraalPyVersions() {
'https://api.github.com/repos/oracle/graalpython/releases'; 'https://api.github.com/repos/oracle/graalpython/releases';
const result: IGraalPyManifestRelease[] = []; const result: IGraalPyManifestRelease[] = [];
do { do {
const response: ifm.ITypedResponse<IGraalPyManifestRelease[]> = const response: ifm.TypedResponse<IGraalPyManifestRelease[]> =
await http.getJson(url, headers); await http.getJson(url, headers);
if (!response.result) { if (!response.result) {
throw new Error( throw new Error(

View File

@ -8,13 +8,15 @@ import * as exec from '@actions/exec';
import fs from 'fs'; import fs from 'fs';
import { import {
IS_LINUX,
IS_WINDOWS, IS_WINDOWS,
WINDOWS_PLATFORMS, WINDOWS_PLATFORMS,
IPyPyManifestRelease, IPyPyManifestRelease,
createSymlinkInFolder, createSymlinkInFolder,
isNightlyKeyword, isNightlyKeyword,
writeExactPyPyVersionFile, writeExactPyPyVersionFile,
getBinaryDirectory getBinaryDirectory,
getDownloadFileName
} from './utils'; } from './utils';
export async function installPyPy( export async function installPyPy(
@ -69,7 +71,8 @@ export async function installPyPy(
core.info(`Downloading PyPy from "${downloadUrl}" ...`); core.info(`Downloading PyPy from "${downloadUrl}" ...`);
try { try {
const pypyPath = await tc.downloadTool(downloadUrl); const fileName = getDownloadFileName(downloadUrl);
const pypyPath = await tc.downloadTool(downloadUrl, fileName);
core.info('Extracting downloaded archive...'); core.info('Extracting downloaded archive...');
if (IS_WINDOWS) { if (IS_WINDOWS) {
@ -244,7 +247,7 @@ export function pypyVersionToSemantic(versionSpec: string) {
} }
export function isArchPresentForWindows(item: any, architecture: string) { export function isArchPresentForWindows(item: any, architecture: string) {
architecture = replaceX32toX86(architecture); architecture = pypyArchitecture(architecture);
return item.files.some( return item.files.some(
(file: any) => (file: any) =>
WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture
@ -256,13 +259,14 @@ export function isArchPresentForMacOrLinux(
architecture: string, architecture: string,
platform: string platform: string
) { ) {
architecture = pypyArchitecture(architecture);
return item.files.some( return item.files.some(
(file: any) => file.arch === architecture && file.platform === platform (file: any) => file.arch === architecture && file.platform === platform
); );
} }
export function findAssetForWindows(releases: any, architecture: string) { export function findAssetForWindows(releases: any, architecture: string) {
architecture = replaceX32toX86(architecture); architecture = pypyArchitecture(architecture);
return releases.files.find( return releases.files.find(
(item: any) => (item: any) =>
WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture
@ -274,15 +278,18 @@ export function findAssetForMacOrLinux(
architecture: string, architecture: string,
platform: string platform: string
) { ) {
architecture = pypyArchitecture(architecture);
return releases.files.find( return releases.files.find(
(item: any) => item.arch === architecture && item.platform === platform (item: any) => item.arch === architecture && item.platform === platform
); );
} }
function replaceX32toX86(architecture: string): string { function pypyArchitecture(architecture: string): string {
// convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value. if (IS_WINDOWS && architecture === 'x32') {
if (architecture === 'x32') { // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
architecture = 'x86'; architecture = 'x86';
} else if (IS_LINUX && architecture === 'arm64') {
architecture = 'aarch64';
} }
return architecture; return architecture;
} }

View File

@ -2,8 +2,10 @@ import * as path from 'path';
import * as core from '@actions/core'; import * as core from '@actions/core';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import * as httpm from '@actions/http-client';
import {ExecOptions} from '@actions/exec/lib/interfaces'; import {ExecOptions} from '@actions/exec/lib/interfaces';
import {IS_WINDOWS, IS_LINUX} from './utils'; import {IS_WINDOWS, IS_LINUX, getDownloadFileName} from './utils';
import {IToolRelease} from '@actions/tool-cache';
const TOKEN = core.getInput('token'); const TOKEN = core.getInput('token');
const AUTH = !TOKEN ? undefined : `token ${TOKEN}`; const AUTH = !TOKEN ? undefined : `token ${TOKEN}`;
@ -30,8 +32,47 @@ export async function findReleaseFromManifest(
return foundRelease; return foundRelease;
} }
function isIToolRelease(obj: any): obj is IToolRelease {
return (
typeof obj === 'object' &&
obj !== null &&
typeof obj.version === 'string' &&
typeof obj.stable === 'boolean' &&
Array.isArray(obj.files) &&
obj.files.every(
(file: any) =>
typeof file.filename === 'string' &&
typeof file.platform === 'string' &&
typeof file.arch === 'string' &&
typeof file.download_url === 'string'
)
);
}
export async function getManifest(): Promise<tc.IToolRelease[]> {
try {
const repoManifest = await getManifestFromRepo();
if (
Array.isArray(repoManifest) &&
repoManifest.length &&
repoManifest.every(isIToolRelease)
) {
return repoManifest;
}
throw new Error(
'The repository manifest is invalid or does not include any valid tool release (IToolRelease) entries.'
);
} catch (err) {
core.debug('Fetching the manifest via the API failed.');
if (err instanceof Error) {
core.debug(err.message);
} else {
core.error('An unexpected error occurred while fetching the manifest.');
}
}
return await getManifestFromURL();
}
export function getManifest(): Promise<tc.IToolRelease[]> { export function getManifestFromRepo(): Promise<tc.IToolRelease[]> {
core.debug( core.debug(
`Getting manifest from ${MANIFEST_REPO_OWNER}/${MANIFEST_REPO_NAME}@${MANIFEST_REPO_BRANCH}` `Getting manifest from ${MANIFEST_REPO_OWNER}/${MANIFEST_REPO_NAME}@${MANIFEST_REPO_BRANCH}`
); );
@ -43,6 +84,17 @@ export function getManifest(): Promise<tc.IToolRelease[]> {
); );
} }
export async function getManifestFromURL(): Promise<tc.IToolRelease[]> {
core.debug('Falling back to fetching the manifest using raw URL.');
const http: httpm.HttpClient = new httpm.HttpClient('tool-cache');
const response = await http.getJson<tc.IToolRelease[]>(MANIFEST_URL);
if (!response.result) {
throw new Error(`Unable to get manifest from ${MANIFEST_URL}`);
}
return response.result;
}
async function installPython(workingDirectory: string) { async function installPython(workingDirectory: string) {
const options: ExecOptions = { const options: ExecOptions = {
cwd: workingDirectory, cwd: workingDirectory,
@ -69,12 +121,16 @@ async function installPython(workingDirectory: string) {
} }
export async function installCpythonFromRelease(release: tc.IToolRelease) { export async function installCpythonFromRelease(release: tc.IToolRelease) {
if (!release.files || release.files.length === 0) {
throw new Error('No files found in the release to download.');
}
const downloadUrl = release.files[0].download_url; const downloadUrl = release.files[0].download_url;
core.info(`Download from "${downloadUrl}"`); core.info(`Download from "${downloadUrl}"`);
let pythonPath = ''; let pythonPath = '';
try { try {
pythonPath = await tc.downloadTool(downloadUrl, undefined, AUTH); const fileName = getDownloadFileName(downloadUrl);
pythonPath = await tc.downloadTool(downloadUrl, fileName, AUTH);
core.info('Extract downloaded archive'); core.info('Extract downloaded archive');
let pythonExtractedFolder; let pythonExtractedFolder;
if (IS_WINDOWS) { if (IS_WINDOWS) {
@ -88,9 +144,13 @@ export async function installCpythonFromRelease(release: tc.IToolRelease) {
} catch (err) { } catch (err) {
if (err instanceof tc.HTTPError) { if (err instanceof tc.HTTPError) {
// Rate limit? // Rate limit?
if (err.httpStatusCode === 403 || err.httpStatusCode === 429) { if (err.httpStatusCode === 403) {
core.error(
`Received HTTP status code 403. This indicates a permission issue or restricted access.`
);
} else if (err.httpStatusCode === 429) {
core.info( core.info(
`Received HTTP status code ${err.httpStatusCode}. This usually indicates the rate limit has been exceeded` `Received HTTP status code 429. This usually indicates the rate limit has been exceeded`
); );
} else { } else {
core.info(err.message); core.info(err.message);

View File

@ -92,6 +92,7 @@ async function run() {
const versions = resolveVersionInput(); const versions = resolveVersionInput();
const checkLatest = core.getBooleanInput('check-latest'); const checkLatest = core.getBooleanInput('check-latest');
const allowPreReleases = core.getBooleanInput('allow-prereleases'); const allowPreReleases = core.getBooleanInput('allow-prereleases');
const freethreaded = core.getBooleanInput('freethreaded');
if (versions.length) { if (versions.length) {
let pythonVersion = ''; let pythonVersion = '';
@ -132,7 +133,8 @@ async function run() {
arch, arch,
updateEnvironment, updateEnvironment,
checkLatest, checkLatest,
allowPreReleases allowPreReleases,
freethreaded
); );
pythonVersion = installed.version; pythonVersion = installed.version;
core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); core.info(`Successfully set up ${installed.impl} (${pythonVersion})`);

View File

@ -6,7 +6,9 @@ import * as path from 'path';
import * as semver from 'semver'; import * as semver from 'semver';
import * as toml from '@iarna/toml'; import * as toml from '@iarna/toml';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import * as ifm from '@actions/http-client/interfaces'; import * as ifm from '@actions/http-client/lib/interfaces';
import * as http from 'http';
export const IS_WINDOWS = process.platform === 'win32'; export const IS_WINDOWS = process.platform === 'win32';
export const IS_LINUX = process.platform === 'linux'; export const IS_LINUX = process.platform === 'linux';
@ -114,7 +116,13 @@ export function isGhes(): boolean {
const ghUrl = new URL( const ghUrl = new URL(
process.env['GITHUB_SERVER_URL'] || 'https://github.com' process.env['GITHUB_SERVER_URL'] || 'https://github.com'
); );
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
const hostname = ghUrl.hostname.trimEnd().toUpperCase();
const isGitHubHost = hostname === 'GITHUB.COM';
const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM');
const isLocalHost = hostname.endsWith('.LOCALHOST');
return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost;
} }
export function isCacheFeatureAvailable(): boolean { export function isCacheFeatureAvailable(): boolean {
@ -222,7 +230,10 @@ function extractValue(obj: any, keys: string[]): string | undefined {
export function getVersionInputFromTomlFile(versionFile: string): string[] { export function getVersionInputFromTomlFile(versionFile: string): string[] {
core.debug(`Trying to resolve version form ${versionFile}`); core.debug(`Trying to resolve version form ${versionFile}`);
const pyprojectFile = fs.readFileSync(versionFile, 'utf8'); let pyprojectFile = fs.readFileSync(versionFile, 'utf8');
// Normalize the line endings in the pyprojectFile
pyprojectFile = pyprojectFile.replace(/\r\n/g, '\n');
const pyprojectConfig = toml.parse(pyprojectFile); const pyprojectConfig = toml.parse(pyprojectFile);
let keys = []; let keys = [];
@ -268,11 +279,45 @@ export function getVersionInputFromPlainFile(versionFile: string): string[] {
} }
/** /**
* Python version extracted from a plain or TOML file. * Python version extracted from a .tool-versions file.
*/
export function getVersionInputFromToolVersions(versionFile: string): string[] {
if (!fs.existsSync(versionFile)) {
core.warning(`File ${versionFile} does not exist.`);
return [];
}
try {
const fileContents = fs.readFileSync(versionFile, 'utf8');
const lines = fileContents.split('\n');
for (const line of lines) {
// Skip commented lines
if (line.trim().startsWith('#')) {
continue;
}
const match = line.match(/^\s*python\s*v?\s*(?<version>[^\s]+)\s*$/);
if (match) {
return [match.groups?.version.trim() || ''];
}
}
core.warning(`No Python version found in ${versionFile}`);
return [];
} catch (error) {
core.error(`Error reading ${versionFile}: ${(error as Error).message}`);
return [];
}
}
/**
* Python version extracted from a plain, .tool-versions or TOML file.
*/ */
export function getVersionInputFromFile(versionFile: string): string[] { export function getVersionInputFromFile(versionFile: string): string[] {
if (versionFile.endsWith('.toml')) { if (versionFile.endsWith('.toml')) {
return getVersionInputFromTomlFile(versionFile); return getVersionInputFromTomlFile(versionFile);
} else if (versionFile.match('.tool-versions')) {
return getVersionInputFromToolVersions(versionFile);
} else { } else {
return getVersionInputFromPlainFile(versionFile); return getVersionInputFromPlainFile(versionFile);
} }
@ -290,8 +335,8 @@ export function getBinaryDirectory(installDir: string) {
/** /**
* Extract next page URL from a HTTP response "link" header. Such headers are used in GitHub APIs. * Extract next page URL from a HTTP response "link" header. Such headers are used in GitHub APIs.
*/ */
export function getNextPageUrl<T>(response: ifm.ITypedResponse<T>) { export function getNextPageUrl<T>(response: ifm.TypedResponse<T>) {
const responseHeaders = <ifm.IHeaders>response.headers; const responseHeaders = <http.OutgoingHttpHeaders>response.headers;
const linkHeader = responseHeaders.link; const linkHeader = responseHeaders.link;
if (typeof linkHeader === 'string') { if (typeof linkHeader === 'string') {
for (const link of linkHeader.split(/\s*,\s*/)) { for (const link of linkHeader.split(/\s*,\s*/)) {
@ -308,3 +353,17 @@ export function getNextPageUrl<T>(response: ifm.ITypedResponse<T>) {
} }
return null; return null;
} }
/**
* Add temporary fix for Windows
* On Windows, it is necessary to retain the .zip extension for proper extraction.
* because the tc.extractZip() failure due to tc.downloadTool() not adding .zip extension.
* Related issue: https://github.com/actions/toolkit/issues/1179
* Related issue: https://github.com/actions/setup-python/issues/819
*/
export function getDownloadFileName(downloadUrl: string): string | undefined {
const tempDir = process.env.RUNNER_TEMP || '.';
return IS_WINDOWS
? path.join(tempDir, path.basename(downloadUrl))
: undefined;
}