Skip to content

Instantly share code, notes, and snippets.

@darth-veitcher
Created May 4, 2022 22:08
Show Gist options
  • Save darth-veitcher/2f0b6cc8f4b17acdaecf1defc5c30f27 to your computer and use it in GitHub Desktop.
Save darth-veitcher/2f0b6cc8f4b17acdaecf1defc5c30f27 to your computer and use it in GitHub Desktop.
Find the latest NodeJS release available (LTS or All)
#!/user/env python3
# Script to determine the latest NodeJS release available.
# Written in pure python 3 with no additional dependencies.
from urllib import request
from typing import List
import json
import logging
import argparse
format = '%(asctime)s - %(levelname)s - %(message)s'
logging.basicConfig(format=format)
log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
# Find the latest LTS version based on release date
RELEASES_URL = "https://nodejs.org/download/release/index.json"
def _extract_version_segments(version: str) -> tuple[str, str, str]:
major = version[1:].split('.')[0].zfill(2)
minor = version[1:].split('.')[1].zfill(2)
patch = version[1:].split('.')[2].zfill(2)
segments = (major, minor, patch)
log.debug(f'Version Segments: {segments}')
return segments
def _create_version_number(version: str) -> int:
segments = _extract_version_segments(version)
version_number = int(f'{segments[0]}{segments[1]}{segments[2]}')
log.debug(f'Version Number: {version_number}')
return version_number
def _obtain_sorted_releases(lts_only: bool = True) -> List[dict]:
log.debug(f'Querying for versions, LTS only: {lts_only}')
data = json.loads(request.urlopen(RELEASES_URL).read())
data.sort(key=lambda release: _create_version_number(release['version']), reverse=True)
if lts_only:
data = [i for i in data if i['lts'] != False]
return data
def get_latest_release(lts: bool = True) -> str:
latest = _obtain_sorted_releases(lts)[0]
log.info(f'Version: {latest["version"]} ({latest["lts"] if lts else "Latest"}), released ({latest["date"]}).')
return latest["version"]
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Obtain NodeJS latest release information.')
freshness = parser.add_mutually_exclusive_group()
freshness.add_argument(
'--lts', action="store_true", dest="lts", default=True,
help='Only search for LTS versions.')
freshness.add_argument(
'--latest', action="store_false", dest="lts",
help='Pull back the latest, bleeding edge, version.')
verbosity = parser.add_mutually_exclusive_group()
verbosity.add_argument(
'-v', '--verbose', action="store_true",
help='Increase script logging verbosity.')
verbosity.add_argument(
'-q', '--quiet', action="store_true",
help='Run script without any output.')
parser.add_argument_group(freshness)
parser.add_argument_group(verbosity)
args = parser.parse_args()
# Logging
if args.verbose:
log.setLevel(logging.DEBUG)
log.info("Set logging level to DEBUG")
if args.quiet:
log.setLevel(logging.NOTSET)
# Script
get_latest_release(args.lts)
@darth-veitcher
Copy link
Author

darth-veitcher commented May 4, 2022

At time of testing:

# Get LTS version (default)
➜ python find-latest-nodejs.py
2022-05-04 23:07:07,710 - INFO - Version: v16.15.0 (Gallium), released (2022-04-26).
# Get latest bleeding edge
➜ python find-latest-nodejs.py --latest
2022-05-04 23:07:18,703 - INFO - Version: v18.1.0 (Latest), released (2022-05-03).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment