| 211 | |
| 212 | @staticmethod |
| 213 | def home_add_releases(context): |
| 214 | context["releases"] = [] |
| 215 | |
| 216 | github_repo_url = context["main"]["github_repo_url"] |
| 217 | resp = requests.get( |
| 218 | f"https://api.github.com/repos/{github_repo_url}/releases", |
| 219 | headers=GITHUB_API_HEADERS, |
| 220 | timeout=5, |
| 221 | ) |
| 222 | if resp.status_code == 403: |
| 223 | sys.stderr.write("WARN: GitHub API quota exceeded when fetching releases\n") |
| 224 | resp_bkp = requests.get( |
| 225 | context["main"]["production_url"] + "releases.json", timeout=5 |
| 226 | ) |
| 227 | resp_bkp.raise_for_status() |
| 228 | releases = resp_bkp.json() |
| 229 | else: |
| 230 | resp.raise_for_status() |
| 231 | releases = resp.json() |
| 232 | |
| 233 | with open( |
| 234 | pathlib.Path(context["target_path"]) / "releases.json", |
| 235 | "w", |
| 236 | encoding="utf-8", |
| 237 | ) as f: |
| 238 | json.dump(releases, f, default=datetime.datetime.isoformat) |
| 239 | |
| 240 | for release in releases: |
| 241 | if release["prerelease"]: |
| 242 | continue |
| 243 | published = datetime.datetime.strptime( |
| 244 | release["published_at"], "%Y-%m-%dT%H:%M:%SZ" |
| 245 | ) |
| 246 | context["releases"].append( |
| 247 | { |
| 248 | "name": release["tag_name"].lstrip("v"), |
| 249 | "parsed_version": version.parse(release["tag_name"].lstrip("v")), |
| 250 | "tag": release["tag_name"], |
| 251 | "published": published, |
| 252 | "url": ( |
| 253 | release["assets"][0]["browser_download_url"] |
| 254 | if release["assets"] |
| 255 | else "" |
| 256 | ), |
| 257 | } |
| 258 | ) |
| 259 | # sorting out obsolete versions |
| 260 | grouped_releases = itertools.groupby( |
| 261 | context["releases"], |
| 262 | key=lambda r: (r["parsed_version"].major, r["parsed_version"].minor), |
| 263 | ) |
| 264 | context["releases"] = [ |
| 265 | max(release_group, key=lambda r: r["parsed_version"].minor) |
| 266 | for _, release_group in grouped_releases |
| 267 | ] |
| 268 | # sorting releases by version number |
| 269 | context["releases"].sort(key=lambda r: r["parsed_version"], reverse=True) |
| 270 | return context |