Skip to content

Instantly share code, notes, and snippets.

@RosaWagner
Created October 4, 2023 11:25
Show Gist options
  • Save RosaWagner/8477494328b1f004bb3c4698e196de26 to your computer and use it in GitHub Desktop.
Save RosaWagner/8477494328b1f004bb3c4698e196de26 to your computer and use it in GitHub Desktop.
# modified from https://gist.github.com/simoncozens/699aa96e98321e19a0a2cccbce994c47
# python3 activity.py DDMMYY DDMMYY
import sys
import requests
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta, FR
from datetime import datetime
import os
headers = {"Authorization": "bearer " + os.environ["GH_TOKEN"]}
def run_query(query):
request = requests.post('https://api.github.com/graphql', json={'query': query}, headers=headers)
if request.status_code == 200:
return request.json()
else:
raise Exception("Query failed to run by returning code of {}. {}".format(request.status_code, query))
def get_date_range(start_date, end_date):
start_date = parse(start_date, dayfirst=True)
end_date = parse(end_date, dayfirst=True) + relativedelta(days=1)
return start_date.isoformat(), end_date.isoformat()
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python activity.py <start_date> <end_date>")
sys.exit(1)
start_date, end_date = get_date_range(sys.argv[1], sys.argv[2])
query = """
query{
viewer {
contributionsCollection(from: "%s", to: "%s") {
totalRepositoryContributions
totalIssueContributions
totalPullRequestContributions
totalPullRequestReviewContributions
totalCommitContributions
commitContributionsByRepository {
repository {
owner {
login
}
name
}
url
contributions(first: 100, orderBy: {field: COMMIT_COUNT, direction: DESC}) {
nodes {
commitCount
user {
login
}
occurredAt
}
}
}
issueContributionsByRepository {
repository {
owner {
login
}
name
}
contributions(first: 100) {
nodes {
issue {
number
title
closed
}
}
}
}
pullRequestContributionsByRepository {
repository {
owner {
login
}
name
}
contributions(first: 100) {
nodes {
pullRequest {
number
title
state
}
}
}
}
pullRequestReviewContributionsByRepository {
repository {
owner {
login
}
name
}
contributions(first: 100) {
nodes {
pullRequestReview {
pullRequest {
number
title
}
state
}
}
}
}
repositoryContributions(first: 20) {
nodes {
repository {
name
description
createdAt
url
}
}
}
}
}
}
""" % (start_date, end_date)
result = run_query(query)["data"]["viewer"]["contributionsCollection"]
commit_total = sum([sum([x["commitCount"] for x in repo["contributions"]["nodes"]]) for repo in result["commitContributionsByRepository"]])
print(f"Commits: {commit_total}")
for repo in result["commitContributionsByRepository"]:
repo_name = repo["repository"]["owner"]["login"]+"/"+repo["repository"]["name"]
contributions = sum([x["commitCount"] for x in repo["contributions"]["nodes"]])
print(f"- {repo_name}: {contributions}")
issue_total = sum([len(repo["contributions"]["nodes"]) for repo in result["issueContributionsByRepository"]])
print(f"\nCreated issues: {issue_total}")
for repo in result["issueContributionsByRepository"]:
repo_name = repo["repository"]["owner"]["login"]+"/"+repo["repository"]["name"]
for c in repo["contributions"]["nodes"]:
issue_number = c["issue"]["number"]
issue_title = c["issue"]["title"]
issue_status = "OPEN" if not c["issue"]["closed"] else "CLOSED"
print(f"- {repo_name}#{issue_number}: {issue_title} (Status: {issue_status})")
pr_total = sum([len(repo["contributions"]["nodes"]) for repo in result["pullRequestContributionsByRepository"]])
print(f"\nPRs opened: {pr_total}")
for repo in result["pullRequestContributionsByRepository"]:
repo_name = repo["repository"]["owner"]["login"]+"/"+repo["repository"]["name"]
for c in repo["contributions"]["nodes"]:
pr_number = c["pullRequest"]["number"]
pr_title = c["pullRequest"]["title"]
pr_status = c["pullRequest"]["state"]
print(f"- {repo_name}#{pr_number}: {pr_title} (Status: {pr_status})")
review_total = sum([len(repo["contributions"]["nodes"]) for repo in result["pullRequestReviewContributionsByRepository"]])
print(f"\nPR Reviews: {review_total}")
for repo in result["pullRequestReviewContributionsByRepository"]:
repo_name = repo["repository"]["owner"]["login"]+"/"+repo["repository"]["name"]
for c in repo["contributions"]["nodes"]:
pr_number = c["pullRequestReview"]["pullRequest"]["number"]
pr_title = c["pullRequestReview"]["pullRequest"]["title"]
review_state = c["pullRequestReview"]["state"]
print(f"- {repo_name}#{pr_number}: {pr_title} (Review state: {review_state})")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment