70 lines
1.9 KiB
Python
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()
|