8000 Merge pull request #1621 from stonebig/master · winpython/winpython@573a386 · GitHub
[go: up one dir, main page]

Skip to content

Commit 573a386

Browse files
authored
Merge pull request #1621 from stonebig/master
more checks, less bagages
2 parents fbc603e + e9da3e5 commit 573a386

File tree

5 files changed

+47
-17
lines changed

5 files changed

+47
-17
lines changed

winpython/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@
2828
OTHER DEALINGS IN THE SOFTWARE.
2929
"""
3030

31-
__version__ = '16.1.20250525'
31+
__version__ = '16.2.20250529'
3232
__license__ = __doc__
3333
__project_url__ = 'http://winpython.github.io/'

winpython/piptree.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from pip._vendor.packaging.markers import Marker
1818
from importlib.metadata import Distribution, distributions
1919
from pathlib import Path
20-
from winpython import utils
20+
from . import utils
2121

2222
logging.basicConfig(level=logging.INFO)
2323
logger = logging.getLogger(__name__)

winpython/utils.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import re
1919
import tarfile
2020
import zipfile
21-
import atexit
22-
import winreg
2321

2422
# SOURCE_PATTERN defines what an acceptable source package name is
2523
SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)'

winpython/wheelhouse.py

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from email.policy import default
1818
from . import utils
1919

20-
from packaging.utils import canonicalize_name
20+
from packaging.utils import canonicalize_name, parse_wheel_filename, parse_sdist_filename
2121

2222
# Use tomllib if available (Python 3.11+), otherwise fall back to tomli
2323
try:
@@ -193,32 +193,64 @@ def get_pylock_wheels(wheelhouse: Path, lockfile: Path, wheelorigin: Optional[Pa
193193
print(f"\n\n*** We can't install {filename} ! ***\n\n")
194194

195195
def extract_metadata_from_wheel(filepath: Path) -> Optional[Tuple[str, str, str]]:
196-
"get metadata from a wheel package"
196+
"Extract package metadata from a .whl file and validate it matches the filename"
197+
wheel_name = filepath.name
198+
try:
199+
name, version, build, tags = parse_wheel_filename(wheel_name)
200+
filename_name = canonicalize_name(name)
201+
filename_version = str(version)
202+
except Exception as e:
203+
print(f"❌ Could not parse filename: {wheel_name}", e)
204+
return None
205+
197206
with zipfile.ZipFile(filepath, 'r') as z:
198207
# Locate *.dist-info/METADATA file inside but not in a vendored directory (flit-core)
199208
for name in z.namelist():
200209
if name.endswith(r'.dist-info/METADATA') and name.split("/")[1] == "METADATA":
201210
with z.open(name) as meta_file:
202211
metadata = BytesParser(policy=default).parse(meta_file)
203-
name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type
204-
version = str(metadata.get('Version', 'unknown'))
212+
meta_name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type
213+
meta_version = str(metadata.get('Version', 'unknown'))
205214
summary = utils.sum_up(str(metadata.get('Summary', '')))
206-
return name, version, summary
215+
# Assert consistency
216+
if meta_name != filename_name or meta_version != filename_version:
217+
print(f"⚠️ Mismatch in {wheel_name}: filename says {filename_name}=={filename_version}, "
218+
f"but METADATA says {meta_name}=={meta_version}")
219+
return None
220+
return meta_name, meta_version , summary
207221
return None
208222

209223
def extract_metadata_from_sdist(filepath: Path) -> Optional[Tuple[str, str, str]]:
210224
"get metadata from a tar.gz or .zip package"
211225
open_func = tarfile.open if filepath.suffixes[-2:] == ['.tar', '.gz'] else zipfile.ZipFile
226+
sdist_name = filepath.name
227+
try:
228+
name, version = parse_sdist_filename(sdist_name)
229+
filename_name = canonicalize_name(name)
230+
filename_version = str(version)
231+
except Exception as e:
232+
print(f"❌ Could not parse filename: {sdist_name}", e)
233+
return None
234+
212235
with open_func(filepath, 'r') as archive:
213236
namelist = archive.getnames() if isinstance(archive, tarfile.TarFile) else archive.namelist()
214237
for name in namelist:
215238
if name.endswith('PKG-INFO'):
216-
content = archive.extractfile(name).read() if isinstance(archive, tarfile.TarFile) else archive.open(name).read()
217-
metadata = message_from_bytes(content)
218-
name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type
219-
version = str(metadata.get('Version', 'unknown'))
220-
summary = utils.sum_up(str(metadata.get('Summary', '')))
221-
return name, version, summary
239+
if isinstance(archive, tarfile.TarFile):
240+
content = archive.extractfile(name)
241+
else:
242+
content = archive.open(name)
243+
if content:
244+
metadata = BytesParser(policy=default).parse(content)
245+
meta_name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type
246+
meta_version = str(metadata.get('Version', 'unknown'))
247+
summary = utils.sum_up(str(metadata.get('Summary', '')))
248+
# Assert consistency
249+
if meta_name != filename_name or meta_version != filename_version:
250+
print(f"⚠️ Mismatch in {sdist_name}: filename says {filename_name}=={filename_version}, "
251+
f"but METADATA says {meta_name}=={meta_version}")
252+
return None
253+
return meta_name, meta_version, summary
222254
return None
223255

224256
def list_packages_with_metadata(directory: str) -> List[Tuple[str, str, str]]:

winpython/wppm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import json
1515
from pathlib import Path
1616
from argparse import ArgumentParser, RawTextHelpFormatter
17-
from winpython import utils, piptree, associate
18-
from winpython import wheelhouse as wh
17+
from . import utils, piptree, associate
18+
from . import wheelhouse as wh
1919
from operator import itemgetter
2020
# Workaround for installing PyVISA on Windows from source:
2121
os.environ["HOME"] = os.environ["USERPROFILE"]

0 commit comments

Comments
 (0)
0