forked from virtool/virtool-website
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrelease.py
130 lines (91 loc) · 3.04 KB
/
release.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import argparse
import json
import os
import requests
import semver
MIN_VERSIONS = [
("virtool", "4.0.0"),
("ref-plant-viruses", "1.0.0"),
("virtool-hmm", "0.2.0"),
]
RELEASE_FILE_NUMBER = 4
RELEASE_KEYS = [
"id",
"name",
"body",
"prerelease",
"published_at",
"html_url"
]
def get_latest(releases):
for release in releases:
if release["prerelease"] is False:
return release
def format_release(release):
"""
Format a raw GitHub release object (dict) to something that can be sent to clients.
:param release: a raw GitHub release object
:type release: dict
:return: a formatted release
:rtype: dict
"""
formatted = {key: release[key] for key in RELEASE_KEYS}
asset_error = False
try:
asset = release["assets"][0]
formatted.update(
{
"filename": asset["name"],
"content_type": asset["content_type"],
"size": asset["size"],
"download_url": asset["browser_download_url"],
}
)
except (KeyError, IndexError):
asset_error = True
formatted["asset_error"] = asset_error
return formatted
def get_release_data(username, token):
release_data = dict()
for repo, min_version in MIN_VERSIONS:
repo_key = repo.replace("-", "_")
repo_releases = list()
for page in range(1, 5):
url = f"https://api.github.com/repos/virtool/{repo}/releases?per_page=100&page={page}"
body = requests.get(url, auth=(username, token)).json()
if not body:
break
for release in body:
release_name: str = release["name"]
if repo_key == "virtool" and not release_name.startswith("v4"):
continue
if semver.compare(release_name.replace("v", ""), min_version) > -1:
repo_releases.append(release)
release_data[repo_key] = [
format_release(r) for r in repo_releases if r["assets"] and not r["draft"]
]
return release_data
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-u",
dest="github_username",
help="username for accessing github API",
default=os.environ["GITHUB_USERNAME"],
)
parser.add_argument(
"-t",
dest="github_token",
help="personal auth token for querying API",
default=os.environ["GITHUB_TOKEN"],
)
args = parser.parse_args()
downloaded = get_release_data(args.github_username, args.github_token)
data = dict()
for key in ["ref_plant_viruses", "virtool_hmm", "virtool"]:
releases = downloaded[key]
data[key] = {"latest": get_latest(releases), "releases": releases}
with open(f"data/releases{RELEASE_FILE_NUMBER}.json", "w") as f:
json.dump(data, f, indent=4)
with open(f"static/releases{RELEASE_FILE_NUMBER}", "w") as f:
json.dump({key: data[key]["releases"] for key in data}, f)