Add graph generation & PR fetch
This commit is contained in:
parent
10f0c47be7
commit
76eb258296
2 changed files with 66 additions and 0 deletions
0
github_pr_delay/__init__,py
Normal file
0
github_pr_delay/__init__,py
Normal file
66
github_pr_delay/pr_delay.py
Normal file
66
github_pr_delay/pr_delay.py
Normal file
|
@ -0,0 +1,66 @@
|
|||
import json
|
||||
import requests
|
||||
import datetime
|
||||
from matplotlib import pyplot as plt
|
||||
|
||||
PULLS_URL = "https://api.github.com/repos/{owner}/{repo}/pulls"
|
||||
|
||||
|
||||
class TooManyRequests(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class RepoPulls:
|
||||
def __init__(self, owner, repo, user=None, token=None):
|
||||
self.owner = owner
|
||||
self.repo = repo
|
||||
self.url = PULLS_URL.format(owner=self.owner, repo=self.repo)
|
||||
self.auth = None
|
||||
if user and token:
|
||||
self.auth = requests.auth.HTTPBasicAuth(user, token)
|
||||
self._pulls = {"open": None, "close": None}
|
||||
|
||||
def get_pulls(self, state="open", verbose=True):
|
||||
assert state in self._pulls
|
||||
if self._pulls[state] is None:
|
||||
pulls = []
|
||||
with requests.Session() as session:
|
||||
if self.auth:
|
||||
session.auth = self.auth
|
||||
cur_page = 1
|
||||
while True:
|
||||
if verbose:
|
||||
print("Requesting page {}...".format(cur_page))
|
||||
req = session.get(
|
||||
self.url,
|
||||
params={"state": state, "page": cur_page, "per_page": 100},
|
||||
)
|
||||
if req.status_code in (403, 429):
|
||||
raise TooManyRequests(
|
||||
"GitHub doesn't want to hear from us anymore :c"
|
||||
)
|
||||
cur_pulls = req.json()
|
||||
if len(cur_pulls) == 0:
|
||||
break
|
||||
cur_page += 1
|
||||
pulls += cur_pulls
|
||||
|
||||
self._pulls[state] = pulls
|
||||
|
||||
return self._pulls[state]
|
||||
|
||||
def get_open_ages(self):
|
||||
pulls = self.get_pulls("open")
|
||||
created_dates = [
|
||||
datetime.date.fromisoformat(pull["created_at"][:10]) for pull in pulls
|
||||
]
|
||||
today = datetime.date.today()
|
||||
ages = [(today - created_on).days for created_on in created_dates]
|
||||
|
||||
return ages
|
||||
|
||||
def plot_ages(self, *args, show=False, **kwargs):
|
||||
ages = self.get_open_ages()
|
||||
plt.hist(ages, *args, **kwargs)
|
||||
if show:
|
||||
plt.show()
|
Loading…
Reference in a new issue