-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmain.py
64 lines (48 loc) · 2.35 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import datetime
import json
import os
import sys
from distutils.util import strtobool
import requests
from packaging import version as semver
GHA_PYTHON_VERSIONS_URL = 'https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json'
EOL_PYTHON_VERSIONS_URL = 'https://endoflife.date/api/python.json'
def main(min_version: str, max_version: str, include_prereleases: str) -> None:
"""
Set a LATEST_PYTHON_VERSIONS environment variable, and a latest-python-versions output,
containing the latest Python versions found within the specified bounds.
:param min_version: The major.minor version lower bound or 'EOL'.
:param max_version: The major.minor version upper bound or 'latest'.
:param include_prereleases: Whether to include pre-releases. Defaults to false on an action level.
"""
if min_version.upper() == 'EOL':
future = datetime.date.today() + datetime.timedelta(3650)
for release in requests.get(EOL_PYTHON_VERSIONS_URL).json():
if (
datetime.date.today() < datetime.date.fromisoformat(release['eol'])
and datetime.date.fromisoformat(release['eol']) < future
):
future = datetime.date.fromisoformat(release['eol'])
min_version = semver.parse(release['cycle'])
else:
min_version = semver.parse(min_version)
max_version = semver.parse(max_version) if max_version != 'latest' else semver.parse('4.0')
parsed_include_prereleases = strtobool(include_prereleases) == 1
stable_versions = requests.get(GHA_PYTHON_VERSIONS_URL).json()
versions = {}
for version_object in stable_versions:
version = version_object['version']
if not parsed_include_prereleases:
if semver.parse(version).is_prerelease:
continue
if (major_minor := semver.parse('.'.join(version.split('.')[:2]))) not in versions:
if min_version <= major_minor <= max_version:
versions[major_minor] = version
version_json = json.dumps(list(versions.values()))
with open(os.environ['GITHUB_ENV'], 'a') as f:
f.write(f'LATEST_PYTHON_VERSIONS={version_json}')
with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
f.write(f'latest-python-versions={version_json}')
print(version_json)
if __name__ == '__main__':
main(*sys.argv[1:])