|
2 | 2 |
|
3 | 3 | import json |
4 | 4 | from datetime import datetime |
| 5 | +import urllib.request |
| 6 | +import urllib.parse |
5 | 7 |
|
6 | | -import httpx |
| 8 | +# https://api.github.com/search/issues?q=repo:rdflib/rdflib+is:pr+merged:%3E=2023-08-02&per_page=300&page=1 |
| 9 | +LAST_RELEASE_DATE = "2023-08-02" |
| 10 | +ISSUES_URL = "https://api.github.com/search/issues" |
| 11 | +ITEMS = [] |
| 12 | +PAGE = 1 |
7 | 13 |
|
8 | | -r = httpx.get( |
9 | | - "https://api.github.com/repos/rdflib/rdflib/pulls", |
10 | | - params={ |
11 | | - "state": "closed", |
| 14 | +# make sequential requests for each page of PRs |
| 15 | +while True: |
| 16 | + params = { |
| 17 | + "q": f"repo:rdflib/rdflib+is:pr+merged:>={LAST_RELEASE_DATE}", |
12 | 18 | "per_page": 100, |
13 | | - "page": 0, # must get all pages up to date of last release |
14 | | - }, |
15 | | -) |
16 | | -prs = [] |
17 | | -if r.status_code == 200: |
18 | | - for pr in r.json(): |
19 | | - if pr["merged_at"] is not None: |
20 | | - d = datetime.strptime(pr["merged_at"], "%Y-%m-%dT%H:%M:%SZ") |
21 | | - if isinstance(d, datetime): |
22 | | - if d > datetime.strptime("2021-10-10", "%Y-%m-%d"): |
23 | | - prs.append( |
24 | | - { |
25 | | - "url": pr["url"], |
26 | | - "title": pr["title"], |
27 | | - "merged_at": pr["merged_at"], |
28 | | - } |
29 | | - ) |
30 | | - with open("prs.json", "w") as f: |
31 | | - json.dump(sorted(prs, key=lambda d: d["merged_at"], reverse=True), f) |
32 | | -else: |
33 | | - print("ERROR") |
| 19 | + "page": PAGE, |
| 20 | + } |
| 21 | + query_string = "&".join([f'{k}={v}' for k, v in params.items()]) |
| 22 | + url = ISSUES_URL + "?" + query_string |
| 23 | + |
| 24 | + print(f"Getting {url}") |
| 25 | + with urllib.request.urlopen(url) as response: |
| 26 | + response_text = response.read() |
| 27 | + link_headers = response.info()["link"].split(",") |
| 28 | + |
| 29 | + json_data = json.loads(response_text) |
| 30 | + ITEMS.extend(json_data["items"]) |
| 31 | + |
| 32 | + keep_going = False |
| 33 | + for link in link_headers: |
| 34 | + if 'rel="next"' in link: |
| 35 | + # url = link.strip("<").split(">")[0] |
| 36 | + PAGE += 1 |
| 37 | + keep_going = True |
| 38 | + |
| 39 | + if not keep_going: |
| 40 | + break |
| 41 | + |
| 42 | +with open("merged_prs.json", "w") as f: |
| 43 | + json.dump(ITEMS, f, indent=4) |
| 44 | + |
| 45 | +# split interesting and boring PRs into two lists |
| 46 | +good_prs = [] |
| 47 | +boring_prs = [] |
| 48 | +for pr in sorted(ITEMS, key=lambda k: k["closed_at"], reverse=True): |
| 49 | + matches = ["bump", "pre-commit.ci"] |
| 50 | + if any(x in pr['title'] for x in matches): |
| 51 | + boring_prs.append(f"""* {pr['closed_at'][:10]} - {pr['title']}\n [PR #{pr['number']}]({pr['html_url']})""") |
| 52 | + else: |
| 53 | + good_prs.append(f"""* {pr['closed_at'][:10]} - {pr['title']}\n [PR #{pr['number']}]({pr['html_url']})""") |
| 54 | + |
| 55 | +for pr in good_prs: |
| 56 | + print(pr) |
| 57 | + |
| 58 | +print() |
| 59 | +print() |
| 60 | + |
| 61 | +for pr in boring_prs: |
| 62 | + print(pr) |
0 commit comments