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