Skip to content

Instantly share code, notes, and snippets.

@Tethik
Created May 8, 2018 22:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tethik/2bc35820e4568caedc15e4d4107c2b26 to your computer and use it in GitHub Desktop.
Save Tethik/2bc35820e4568caedc15e4d4107c2b26 to your computer and use it in GitHub Desktop.
import os
from collections import defaultdict
import requests # get from pypi
import crayons # get from pypi
pagination = "null"
query = """
query($orderBy: LanguageOrder!, $pagination: String) {
viewer {
name
pullRequests(first: 100, after: $pagination, states: MERGED) {
totalCount
pageInfo {
hasNextPage
endCursor
}
nodes {
url
state
additions
deletions
author {
login
}
repository {
nameWithOwner
}
createdAt
repository {
stargazers {
totalCount
}
languages(first: 3, orderBy: $orderBy) {
nodes {
name
}
}
}
}
}
}
}
"""
GITHUB_GRAPHQL_URL = "https://api.github.com/graphql"
GITHUB_ACCESS_TOKEN = "" # Personal access token goes here
blacklist = set([]) # Add repo owner names here
variables = {
"orderBy": {
"field": "SIZE",
"direction": "DESC"
}
}
pullrequests = []
pagination = ""
while True:
resp = requests.post(GITHUB_GRAPHQL_URL, \
json={"query": query, "variables": variables}, \
headers={"Authorization": f"Bearer {GITHUB_ACCESS_TOKEN}"})
data = resp.json()
pullrequests += data["data"]["viewer"]["pullRequests"]["nodes"]
if not data["data"]["viewer"]["pullRequests"]["pageInfo"]["hasNextPage"]:
break
variables["pagination"] = data["data"]["viewer"]["pullRequests"]["pageInfo"]["endCursor"]
# print("next page")
contributions = defaultdict(list)
for pullrequest in pullrequests:
contributions[pullrequest["repository"]["nameWithOwner"]].append(pullrequest)
summaries = []
for repo, prs in contributions.items():
repoOwner = repo.split('/')[0]
if repoOwner in blacklist:
continue
additions = sum(pr["additions"] for pr in prs)
deletions = sum(pr["deletions"] for pr in prs)
stars = prs[0]["repository"]["stargazers"]["totalCount"]
languages = "/".join(map(lambda i: i["name"], prs[0]["repository"]["languages"]["nodes"]))
summaries.append({
'repo': repo,
'additions': additions,
'deletions': deletions,
'stars': stars,
'languages': languages,
'prs': len(prs)
})
for summary in sorted(summaries, key=lambda i: i["stars"], reverse=True):
locals().update(summary)
print(repo.ljust(60), \
str(languages).ljust(50), \
crayons.green(f'+{additions}').ljust(7), \
crayons.red(f'-{deletions}').ljust(7), \
str(prs).ljust(5), \
crayons.yellow(f'⭐ {stars}').ljust(7))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment