r-builds/test/get_r_versions.py
2023-04-18 18:57:51 -05:00

70 lines
1.9 KiB
Python

import argparse
import json
import re
import urllib.request
VERSIONS_URL = 'https://cdn.posit.co/r/versions.json'
# Minimum R version for "all"
MIN_ALL_VERSION = '3.1.0'
def main():
parser = argparse.ArgumentParser(description="Print R-builds R versions as JSON.")
parser.add_argument(
'versions',
type=str,
nargs='?',
default='last-5,devel',
help="""Comma-separated list of R versions. Specify "last-N" to use the
last N minor R versions, or "all" to use all minor R versions since R 3.1.
Defaults to "last-5,devel".
"""
)
args = parser.parse_args()
versions = _get_versions(which=args.versions)
print(json.dumps(versions))
def _get_versions(which='all'):
supported_versions = sorted(_get_supported_versions(), reverse=True)
versions = []
for version in which.split(','):
versions.extend(_expand_version(version, supported_versions))
return versions
def _expand_version(which, supported_versions):
last_n_versions = None
if which.startswith('last-'):
last_n_versions = int(which.replace('last-', ''))
elif which != 'all':
return [which] if which in supported_versions else []
versions = {}
for ver in supported_versions:
# Skip unreleased versions (e.g., devel, next)
if not re.match(r'[\d.]', ver):
continue
if ver < MIN_ALL_VERSION:
continue
minor_ver = tuple(ver.split('.')[0:2])
if minor_ver not in versions:
versions[minor_ver] = ver
versions = sorted(list(versions.values()), reverse=True)
if last_n_versions:
return versions[0:last_n_versions]
return versions
def _get_supported_versions():
request = urllib.request.Request(VERSIONS_URL)
response = urllib.request.urlopen(request)
data = response.read()
result = json.loads(data)
return result['r_versions']
if __name__ == '__main__':
main()