generate-appstream-releases.py (43 lines of code) (raw):

#! /usr/bin/env python3 # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import argparse import os import sys import json from packaging.version import Version from xml.etree import ElementTree class release: def __init__(self, version, js): self.version = version self.json = js self.platforms = [x.lower() for x in js['platforms']] def matches(self, platform): return platform.lower() in self.platforms def toxml(self): attrs = { 'version': self.version, 'date': self.json['date'] } xml = ElementTree.Element('release', attrib=attrs) # Add the details URL which should point to github xurl = ElementTree.Element('url', attrib={'type': 'details'}) xurl.text = f"https://github.com/mozilla-mobile/mozilla-vpn-client/releases/v{self.version}" xml.append(xurl) # TODO: It is recommended to include a release description in the Appstream # manifest too. We could fetch this from the Github releases API, but they # aren't very well formatted for this purpose. return xml if __name__ == "__main__": ## Parse arguments to locate the input files and options. parser = argparse.ArgumentParser( description='Generate Appstream releases information from JSON') parser.add_argument('source', metavar='SOURCE', type=str, action='store', help='JSON releases file to parse') parser.add_argument('--platform', metavar='PLATFORM', type=str, action='store', default='LINUX', help='Target platform for appstream releases') args = parser.parse_args() # Parse the JSON releases file with open(args.source, 'r') as fp: data = json.load(fp) # Build the Appstream releases XML document. root = ElementTree.Element('releases') versions = list(data['releases'].keys()) versions.sort(key=Version, reverse=True) for version in versions: info = release(version, data['releases'][version]) if info.matches(args.platform): root.append(info.toxml()) # Dump the XML data to stdout ElementTree.indent(root, space=" ") ElementTree.dump(root)