from collections import Counter import datetime import os import pprint import requests github_token = os.getenv('GITHUB_TOKEN') headers=dict(Authorization='token {}'.format(github_token)) all_pr_url = 'https://api.github.com/repos/theorchard/{repo}/pulls?sort=updated&direction=desc&state=closed&per_page=100' review_state = ('APPROVED', 'DISMISSED', 'CHANGES_REQUESTED') def count_output(count, header=None): sorted_count = count.most_common() if header: print(header) print('-------------') for item, num in sorted_count: print('{},{}'.format(item, num)) print("\n") repos = [ 'graphql-product', # code owners added 03/06/2020 'graphql-knowledge', # code owners added 11/12/2020 (only /src/schema/ reviews) 'graphql-participant', # code owners added 11/03/2020 (only /src/schema/ reviews) 'graphql-podcast', # code owners added 11/20/2020 (only schema reviews) 'graphql-user', # code owners added 12/01/2020 (only schema reviews) 'graphql-abacus', # Missing 'graphql-publishing', # code owners added 11/09/2020 (only schema reviews) 'graphql-sr-delivery'] # need to add repos = ['terraform-infra'] # repos = ['graphql-sr-delivery'] pr_to_investigate = list() all_authors = list() all_pr_states = list() all_approved_reviewers = list() all_commented_reviewers = list() all_reviewers = list() min_merge = None max_merge = None for repo in repos: print('Analyzing {}'.format(repo)) url = all_pr_url.format(repo=repo) response = requests.get(url, headers=headers) prs = response.json() for pr in prs: if pr['merged_at']: merged_at_date = datetime.datetime.strptime(pr['merged_at'], "%Y-%m-%dT%H:%M:%SZ") if min_merge is None or min_merge > merged_at_date: min_merge = merged_at_date if max_merge is None or max_merge < merged_at_date: max_merge =merged_at_date all_authors.append(pr['user']['login']) pr_reviews_response = requests.get(pr['url'] + '/reviews', headers=headers) pr_reviews = pr_reviews_response.json() reviewers = list() approved_reviewers = list() commented_reviewers = list() for pr_review in pr_reviews: all_pr_states.append(pr_review['state']) if pr_review['state'] == 'APPROVED': approved_reviewers.append(pr_review['user']['login']) all_approved_reviewers.append(pr_review['user']['login']) if pr_review['state'] == 'COMMENTED': commented_reviewers.append(pr_review['user']['login']) all_commented_reviewers.append(pr_review['user']['login']) if pr_review['state'] in review_state: reviewers.append(pr_review['user']['login']) all_reviewers.append(pr_review['user']['login']) pr_to_investigate.append( dict( pr_no=pr['number'], url=pr['url'], author=pr['user']['login'], state=pr['state'], created_at=pr['created_at'], merged_at=pr['merged_at'], approved_reviewers=list(dict.fromkeys(approved_reviewers)), commented_reviewers=list(dict.fromkeys(commented_reviewers)))) authors_counts = Counter(all_authors) state_counts = Counter(all_pr_states) approved_counts = Counter(all_approved_reviewers) comment_counts = Counter(all_commented_reviewers) reviewers_counts = Counter(all_reviewers) print('Total {} PRs: {} ({}-{})\n'.format(repo, len(pr_to_investigate), min_merge.strftime("%Y-%m-%d"), max_merge.strftime("%Y-%m-%d"))) count_output(authors_counts, 'Authors') count_output(state_counts, 'Review States') count_output(reviewers_counts, 'PR Reviews') count_output(comment_counts, 'PR Comments')