import json import py import textwrap issues_url = "https://api.github.com/repos/pytest-dev/pytest/issues" import requests def get_issues(): issues = [] url = issues_url while 1: get_data = {"state": "all"} r = requests.get(url, params=get_data) data = r.json() if r.status_code == 403: # API request limit exceeded print(data['message']) exit(1) issues.extend(data) # Look for next page links = requests.utils.parse_header_links(r.headers['Link']) another_page = False for link in links: if link['rel'] == 'next': url = link['url'] another_page = True if not another_page: return issues def main(args): cachefile = py.path.local(args.cache) if not cachefile.exists() or args.refresh: issues = get_issues() cachefile.write(json.dumps(issues)) else: issues = json.loads(cachefile.read()) open_issues = [x for x in issues if x["state"] == "open"] open_issues.sort(key=lambda x: x["number"]) report(open_issues) def _get_kind(issue): labels = [l['name'] for l in issue['labels']] for key in ('bug', 'enhancement', 'proposal'): if key in labels: return key return 'issue' def report(issues): for issue in issues: title = issue["title"] body = issue["body"] kind = _get_kind(issue) status = issue["state"] number = issue["number"] link = "https://github.com/pytest-dev/pytest/issues/%s/" % number print("----") print(status, kind, link) print(title) #print() #lines = body.split("\n") #print ("\n".join(lines[:3])) #if len(lines) > 3 or len(body) > 240: # print ("...") print("\n\nFound %s open issues" % len(issues)) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser("process bitbucket issues") parser.add_argument("--refresh", action="store_true", help="invalidate cache, refresh issues") parser.add_argument("--cache", action="store", default="issues.json", help="cache file") args = parser.parse_args() main(args)