1
1
import os
2
2
import sys
3
+ import re
3
4
from pathlib import Path
4
5
from github import Github
5
6
from typing import List , Dict
6
7
import itertools
7
8
import requests
9
+ import hashlib
8
10
9
11
HTML_TEMPLATE = """<!DOCTYPE html>
10
12
<html>
17
19
</body>
18
20
</html>
19
21
"""
22
+
23
+ def normalize (name ):
24
+ """Normalize package name according to PEP 503."""
25
+ return re .sub (r"[-_.]+" , "-" , name ).lower ()
26
+
27
+ def calculate_sha256 (file_path ):
28
+ with open (file_path , "rb" ) as f :
29
+ digest = hashlib .file_digest (f , "sha256" )
30
+
31
+ return digest .hexdigest ()
20
32
21
33
class PackageIndexBuilder :
22
34
def __init__ (self , token : str , repo_name : str , output_dir : str ):
23
35
self .github = Github (token )
24
- self .repo_name = repo_name
36
+ self .repo = self . github . get_repo ( repo_name )
25
37
self .output_dir = Path (output_dir )
26
38
self .packages : Dict [str , List [Dict ]] = {}
27
39
@@ -35,12 +47,11 @@ def __init__(self, token: str, repo_name: str, output_dir: str):
35
47
def collect_packages (self ):
36
48
37
49
print ("Query release assets" )
38
- repo = self .github .get_repo (self .repo_name )
39
-
40
- for release in repo .get_releases ():
50
+
51
+ for release in self .repo .get_releases ():
41
52
for asset in release .get_assets ():
42
53
if asset .name .endswith (('.whl' , '.tar.gz' )):
43
- package_name = asset .name .split ('-' )[0 ]. replace ( '_' , '-' )
54
+ package_name = normalize ( asset .name .split ('-' )[0 ])
44
55
if package_name not in self .packages :
45
56
self .packages [package_name ] = []
46
57
@@ -71,7 +82,6 @@ def generate_index_html(self):
71
82
file_links = []
72
83
assets = sorted (assets , key = lambda x : x ["filename" ])
73
84
for filename , items in itertools .groupby (assets , key = lambda x : x ["filename" ]):
74
- file_links .append (f'<a href="./{ filename } ">{ filename } </a><br/>' )
75
85
url = next (items )['url' ]
76
86
77
87
# Download the file
@@ -83,8 +93,11 @@ def generate_index_html(self):
83
93
if chunk :
84
94
f .write (chunk )
85
95
96
+ sha256_hash = calculate_sha256 (package_dir / filename )
97
+ file_links .append (f'<a href="{ filename } #sha256={ sha256_hash } ">{ filename } </a><br/>' )
98
+
86
99
package_index = HTML_TEMPLATE .format (
87
- package_name = package ,
100
+ package_name = f"Links for { package } " ,
88
101
package_links = "\n " .join (file_links )
89
102
)
90
103
0 commit comments