#!/usr/bin/python import os import tempfile import sys import optparse import re import time, datetime try: from simplemediawiki import MediaWiki except ImportError: print "Unable to import simplemediawiki. Is python-simpemediawiki installed?" sys.exit(1) time_fmt = "%Y-%m-%dT%H:%M:%SZ" def parse_args(): '''Set up the option parser''' parser = optparse.OptionParser(usage="%prog [options]", description="Display wiki tests for a specified set of packages") parser.add_option('-d', '--debug', action='store_true', default=False, help='Enable debug output') parser.add_option('-c', '--critpath', action='store_true', default=False, help='Limit results to only critical path tests') parser.add_option('-l', '--limit', action='store', default=3, type="int", help='Limit recursion depth (%default)') parser.add_option('-v', '--verbose', action='store_true', default=False, help='Show details for any tests found') parser.add_option('-p', '--package', dest="packages", action='append', default=[], help='Display any tests for the provided Package source name') parser.add_option('-w', '--url', action='store', default='https://fedoraproject.org/w/api.php', help='Mediawiki API URL') (opts, args) = parser.parse_args() # Validate inputs if len(opts.packages) == 0: parser.error("No action specified") return (opts, args) def parse(wiki, page): '''Parse a page and return content''' # Build query arguments and call wiki query = dict(action='parse', page=page) if opts.debug: print query response = wiki.call(query) return response.get('parse',{}).get('text',{}).get('*','') def list_categorymembers(wiki, cat_page, limit=5): '''Return a list of pages belonging to category page''' # Add 'Category:' prefix if not given if not cat_page.startswith("Category:"): cat_page = "Category:%s" % cat_page # Build query arguments and call wiki query = dict(action='query', list='categorymembers', cmtitle=cat_page) if opts.debug: print query response = wiki.call(query) members = [entry.get('title') for entry in response.get('query',{}).get('categorymembers',{}) if entry.has_key('title')] # Determine whether we need to recurse idx = 0 while True: if idx >= len(members) or limit <= 0: break # Recurse? if members[idx].startswith('Category:') and limit > 0: members.extend(list_categorymembers(wiki, members[idx], limit-1)) members.remove(members[idx]) # remove Category from list else: idx += 1 return members if __name__ == "__main__": (opts,action) = parse_args() # Create mediawiki handle wiki = MediaWiki(opts.url) # Grab the list of critical path pages once crit_path_pages = list() if opts.critpath: crit_path_pages = list_categorymembers(wiki, 'Category:Critical_path_test_cases', opts.limit) # Find tests for the provided list of packages for package in opts.packages: cat_page = 'Category:Package %s test cases' % package pages = list_categorymembers(wiki, cat_page, opts.limit) # Limit results to critpath only? if opts.critpath: crit_path_pages = list_categorymembers(wiki, 'Category:Critical_path_test_cases', opts.limit) pages = list(set(pages) & set(crit_path_pages)) # Display results if pages: if not opts.verbose: print "\n".join(pages) else: print "= %s%s test cases =" % (opts.critpath and "Critical Path " or "", package) for page in pages: print "== %s ==" % page buf = parse(wiki, page) os.system("cat <