Skip to content

Commit c2f726c

Browse files
committed
timeline: test the release filters; make get-releases.py importable
1 parent 50f4043 commit c2f726c

2 files changed

Lines changed: 80 additions & 9 deletions

File tree

‎scripts/get-releases.py‎

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,17 @@ def format_releases(releases):
5858
]
5959

6060

61-
data_folder = Path(__file__).parent.parent / "_data"
62-
for repo, filename in [
63-
("activitywatch", "releases.yml"),
64-
("aw-android", "releases_android.yml"),
65-
]:
66-
formatted_releases = format_releases(fetch_all_releases(owner, repo))
67-
with open(data_folder / filename, "w") as f:
68-
yaml.dump(formatted_releases, f, sort_keys=False)
69-
print(f"Saved {len(formatted_releases)} {repo} releases to {filename}")
61+
def main():
62+
data_folder = Path(__file__).parent.parent / "_data"
63+
for repo, filename in [
64+
("activitywatch", "releases.yml"),
65+
("aw-android", "releases_android.yml"),
66+
]:
67+
formatted_releases = format_releases(fetch_all_releases(owner, repo))
68+
with open(data_folder / filename, "w") as f:
69+
yaml.dump(formatted_releases, f, sort_keys=False)
70+
print(f"Saved {len(formatted_releases)} {repo} releases to {filename}")
71+
72+
73+
if __name__ == "__main__":
74+
main()

‎scripts/test_get_releases.py‎

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/usr/bin/env python3
2+
"""Unit tests for get-releases.py release filtering."""
3+
4+
import importlib.util
5+
import unittest
6+
from pathlib import Path
7+
8+
_SCRIPT = Path(__file__).resolve().parent / "get-releases.py"
9+
_spec = importlib.util.spec_from_file_location("get_releases", _SCRIPT)
10+
gr = importlib.util.module_from_spec(_spec)
11+
assert _spec.loader is not None
12+
_spec.loader.exec_module(gr)
13+
14+
15+
def _release(tag: str, created: str, name=None, draft=False) -> dict:
16+
return {
17+
"name": tag if name is None else name,
18+
"tag_name": tag,
19+
"created_at": created,
20+
"html_url": f"https://example.test/{tag}",
21+
"draft": draft,
22+
}
23+
24+
25+
class FormatReleasesTest(unittest.TestCase):
26+
def test_keeps_stable_and_beta_releases(self):
27+
out = gr.format_releases(
28+
[
29+
_release("v0.14.0", "2026-10-06T00:00:00Z"),
30+
_release("v0.14.0b8", "2026-09-18T00:00:00Z"),
31+
_release("v0.13.2", "2024-10-05T00:00:00Z"),
32+
]
33+
)
34+
self.assertEqual([r["tag"] for r in out], ["v0.14.0", "v0.14.0b8", "v0.13.2"])
35+
36+
def test_skips_drafts_nightlies_and_research_builds(self):
37+
out = gr.format_releases(
38+
[
39+
_release("v0.14.0b9", "2026-10-06T00:00:00Z", draft=True),
40+
_release("v0.14.0dev20260723", "2026-07-23T00:00:00Z"),
41+
_release("v0.14.0dev202607121", "2026-07-12T00:00:00Z"),
42+
_release("v0.14.0b5-research", "2026-09-09T00:00:00Z"),
43+
_release("v0.14.0b5", "2026-09-07T00:00:00Z"),
44+
]
45+
)
46+
self.assertEqual([r["tag"] for r in out], ["v0.14.0b5"])
47+
48+
def test_sorted_newest_first(self):
49+
out = gr.format_releases(
50+
[
51+
_release("v0.12.0", "2023-09-26T00:00:00Z"),
52+
_release("v0.14.2", "2026-09-22T00:00:00Z"),
53+
]
54+
)
55+
self.assertEqual([r["tag"] for r in out], ["v0.14.2", "v0.12.0"])
56+
57+
def test_empty_name_falls_back_to_tag(self):
58+
out = gr.format_releases([_release("v0.4.12", "2019-08-13T00:00:00Z", name="")])
59+
self.assertEqual(out[0]["title"], "v0.4.12")
60+
self.assertEqual(
61+
set(out[0]), {"title", "tag", "date", "url"}
62+
)
63+
64+
65+
if __name__ == "__main__":
66+
unittest.main()

0 commit comments

Comments
 (0)