Skip to content

Commit 2d8e929

Browse files
committed
add a latest closed issues util
1 parent 4c21f4a commit 2d8e929

File tree

5 files changed

+88
-40
lines changed

5 files changed

+88
-40
lines changed

noxfile.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,13 @@ def latest_pull_requests(session: Session) -> None:
182182
session.run("python", "scripts/latest_pull_requests.py", *session.posargs)
183183

184184

185+
@nox.session(reuse_venv=True)
186+
def latest_closed_issues(session: Session) -> None:
187+
"""A basic script for outputing changelog info"""
188+
session.install("requests", "python-dateutil")
189+
session.run("python", "scripts/latest_closed_issues.py", *session.posargs)
190+
191+
185192
def install_requirements_file(session: Session, name: str) -> None:
186193
file_path = HERE / "requirements" / (name + ".txt")
187194
assert file_path.exists(), f"requirements file {file_path} does not exist"

scripts/common/__init__.py

Whitespace-only changes.

scripts/common/github_utils.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from __future__ import annotations
2+
3+
from datetime import datetime
4+
from typing import Any, Iterator
5+
6+
import requests
7+
from dateutil.parser import isoparse
8+
9+
10+
REPO_NAME = "idom-team/idom"
11+
STR_DATE_FORMAT = r"%Y-%m-%d"
12+
13+
14+
def last_release_date() -> datetime:
15+
response = requests.get(f"https://api.github.com/repos/{REPO_NAME}/releases/latest")
16+
return isoparse(response.json()["published_at"])
17+
18+
19+
def date_range_query(start: datetime, stop: datetime = datetime.now()) -> str:
20+
return start.strftime(STR_DATE_FORMAT) + ".." + stop.strftime(STR_DATE_FORMAT)
21+
22+
23+
def search_idom_repo(query: str) -> Iterator[Any]:
24+
page = 0
25+
while True:
26+
page += 1
27+
response = requests.get(
28+
"https://api.github.com/search/issues",
29+
{"q": f"repo:{REPO_NAME} " + query, "per_page": 15, "page": page},
30+
)
31+
32+
response_json = response.json()
33+
34+
try:
35+
if response_json["incomplete_results"]:
36+
raise RuntimeError(response)
37+
except KeyError:
38+
raise RuntimeError(response_json)
39+
40+
items = response_json["items"]
41+
if items:
42+
yield from items
43+
else:
44+
break

scripts/latest_closed_issues.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from __future__ import annotations
2+
3+
import sys
4+
5+
from common.github_utils import (
6+
REPO_NAME,
7+
date_range_query,
8+
last_release_date,
9+
search_idom_repo,
10+
)
11+
12+
13+
FORMAT_TEMPLATES = {
14+
"md": f"- {{title}} - [#{{number}}](https://github.com/{REPO_NAME}/issues/{{number}})",
15+
"rst": "- {title} - :issue:`{number}`",
16+
"text": "- {title} - #{number}",
17+
}
18+
19+
20+
def main(format: str = "text"):
21+
template = FORMAT_TEMPLATES[format]
22+
query = f"type:issue closed:{date_range_query(last_release_date())}"
23+
for pr in search_idom_repo(query):
24+
print(template.format(**pr))
25+
26+
27+
if __name__ == "__main__":
28+
main(*sys.argv[1:])

scripts/latest_pull_requests.py

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,26 @@
11
from __future__ import annotations
22

33
import sys
4-
from datetime import datetime
5-
from typing import Any, Iterator
64

7-
import requests
8-
from dateutil.parser import isoparse
9-
10-
11-
REPO = "idom-team/idom"
12-
STR_DATE_FORMAT = r"%Y-%m-%d"
13-
14-
15-
def last_release() -> datetime:
16-
response = requests.get(f"https://api.github.com/repos/{REPO}/releases/latest")
17-
return isoparse(response.json()["published_at"])
18-
19-
20-
def pull_requests_after(date: datetime) -> Iterator[Any]:
21-
then = date.strftime(STR_DATE_FORMAT)
22-
now = datetime.now().strftime(STR_DATE_FORMAT)
23-
query = f"repo:{REPO} type:pr merged:{then}..{now}"
24-
25-
page = 0
26-
while True:
27-
page += 1
28-
response = requests.get(
29-
"https://api.github.com/search/issues",
30-
{"q": query, "per_page": 15, "page": page},
31-
)
32-
33-
response_json = response.json()
34-
35-
if response_json["incomplete_results"]:
36-
raise RuntimeError(response)
37-
38-
items = response_json["items"]
39-
if items:
40-
yield from items
41-
else:
42-
break
5+
from common.github_utils import (
6+
REPO_NAME,
7+
date_range_query,
8+
last_release_date,
9+
search_idom_repo,
10+
)
4311

4412

4513
FORMAT_TEMPLATES = {
46-
"md": f"- {{title}} - [#{{number}}](https://github.com/{REPO}/pull/{{number}})",
14+
"md": f"- {{title}} - [#{{number}}](https://github.com/{REPO_NAME}/pull/{{number}})",
4715
"rst": "- {title} - :pull:`{number}`",
4816
"text": "- {title} - #{number}",
4917
}
5018

5119

5220
def main(format: str = "text"):
5321
template = FORMAT_TEMPLATES[format]
54-
for pr in pull_requests_after(last_release()):
22+
query = f"type:pr merged:{date_range_query(last_release_date())}"
23+
for pr in search_idom_repo(query):
5524
print(template.format(**pr))
5625

5726

0 commit comments

Comments
 (0)