Created
May 4, 2022 22:08
-
-
Save darth-veitcher/2f0b6cc8f4b17acdaecf1defc5c30f27 to your computer and use it in GitHub Desktop.
Find the latest NodeJS release available (LTS or All)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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).