11import os
22import sys
3+ import re
34from pathlib import Path
45from github import Github
56from typing import List , Dict
67import itertools
78import requests
9+ import hashlib
810
911HTML_TEMPLATE = """<!DOCTYPE html>
1012 <html>
1719 </body>
1820 </html>
1921"""
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 ()
2032
2133class PackageIndexBuilder :
2234 def __init__ (self , token : str , repo_name : str , output_dir : str ):
2335 self .github = Github (token )
24- self .repo_name = repo_name
36+ self .repo = self . github . get_repo ( repo_name )
2537 self .output_dir = Path (output_dir )
2638 self .packages : Dict [str , List [Dict ]] = {}
2739
@@ -35,12 +47,11 @@ def __init__(self, token: str, repo_name: str, output_dir: str):
3547 def collect_packages (self ):
3648
3749 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 ():
4152 for asset in release .get_assets ():
4253 if asset .name .endswith (('.whl' , '.tar.gz' )):
43- package_name = asset .name .split ('-' )[0 ]. replace ( '_' , '-' )
54+ package_name = normalize ( asset .name .split ('-' )[0 ])
4455 if package_name not in self .packages :
4556 self .packages [package_name ] = []
4657
@@ -71,7 +82,6 @@ def generate_index_html(self):
7182 file_links = []
7283 assets = sorted (assets , key = lambda x : x ["filename" ])
7384 for filename , items in itertools .groupby (assets , key = lambda x : x ["filename" ]):
74- file_links .append (f'<a href="./{ filename } ">{ filename } </a><br/>' )
7585 url = next (items )['url' ]
7686
7787 # Download the file
@@ -83,8 +93,11 @@ def generate_index_html(self):
8393 if chunk :
8494 f .write (chunk )
8595
96+ sha256_hash = calculate_sha256 (package_dir / filename )
97+ file_links .append (f'<a href="{ filename } #sha256={ sha256_hash } ">{ filename } </a><br/>' )
98+
8699 package_index = HTML_TEMPLATE .format (
87- package_name = package ,
100+ package_name = f"Links for { package } " ,
88101 package_links = "\n " .join (file_links )
89102 )
90103
0 commit comments