#!/usr/bin/python # Copyright (c) 2014, Jakub Wilk # Copyright (c) 2014, Ximin Luo # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. from __future__ import print_function import argparse import os import sys import urllib2 import xml.etree.cElementTree as etree URL_TEMPLATE = "https://addons.mozilla.org/en-US/addon/{ext}/versions/format:rss" def main(): parser = argparse.ArgumentParser( description="fetch Version History of an addon from the Mozilla Extensions website.") parser.add_argument("extension", help="Extension short-name, as used on addons.mozilla.org.") options = parser.parse_args() url = URL_TEMPLATE.format(ext=options.extension) try: fp = urllib2.urlopen(url) except urllib2.HTTPError as error: print("%s: For extension '%s', error fetching '%s': %s" % (os.path.basename(sys.argv[0]), options.extension, url, error), file=sys.stderr) return 1 try: for _, element in etree.iterparse(fp): if element.tag != "item": continue title = element.find("title").text print(title) print("=" * len(title)) descel = element.find("description") if descel is not None and descel.text: print(descel.text.rstrip("\n")) else: print("[no description]") print("") finally: fp.close() if __name__ == "__main__": sys.exit(main())