Skip to content

Commit 93625a4

Browse files
refactor(metadata): use Metadata.from_email() directly
Replace parse_email() + Metadata.from_raw() with Metadata.from_email() for simpler code and proper validation. Use parse_metadata() helper where appropriate and fix empty metadata error handling. Fixes: #561 Signed-off-by: Lalatendu Mohanty <lmohanty@redhat.com>
1 parent 1bef76d commit 93625a4

File tree

3 files changed

+12
-17
lines changed

3 files changed

+12
-17
lines changed

src/fromager/bootstrapper.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import zipfile
1313
from urllib.parse import urlparse
1414

15-
from packaging.metadata import Metadata, parse_email
1615
from packaging.requirements import Requirement
1716
from packaging.utils import NormalizedName, canonicalize_name
1817
from packaging.version import Version
@@ -907,9 +906,7 @@ def _get_version_from_package_metadata(
907906
config_settings=pbi.config_settings,
908907
)
909908
metadata_filename = source_dir.parent / metadata_dir_base / "METADATA"
910-
with open(metadata_filename, "rb") as f:
911-
raw_metadata, _ = parse_email(f.read())
912-
metadata = Metadata.from_raw(raw_metadata)
909+
metadata = dependencies.parse_metadata(metadata_filename)
913910
return metadata.version
914911

915912
def _resolve_prebuilt_with_history(

src/fromager/candidate.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from io import BytesIO
66
from zipfile import ZipFile
77

8-
from packaging.metadata import Metadata, parse_email
8+
from packaging.metadata import Metadata
99
from packaging.requirements import Requirement
1010
from packaging.utils import BuildTag, canonicalize_name
1111
from packaging.version import Version
@@ -14,6 +14,7 @@
1414

1515
logger = logging.getLogger(__name__)
1616

17+
1718
@dataclasses.dataclass(frozen=True, order=True, slots=True, repr=False, kw_only=True)
1819
class Candidate:
1920
name: str
@@ -109,8 +110,7 @@ def get_metadata_for_wheel(url: str, metadata_url: str | None = None) -> Metadat
109110
response.raise_for_status()
110111

111112
# Parse metadata directly from the response content
112-
raw_metadata, _ = parse_email(response.content)
113-
metadata = Metadata.from_raw(raw_metadata)
113+
metadata = Metadata.from_email(response.content)
114114
logger.debug(f"Successfully retrieved metadata via PEP 658 for {url}")
115115
return metadata
116116

@@ -127,10 +127,7 @@ def get_metadata_for_wheel(url: str, metadata_url: str | None = None) -> Metadat
127127
for n in z.namelist():
128128
if n.endswith(".dist-info/METADATA"):
129129
metadata_content = z.read(n)
130-
raw_metadata, _ = parse_email(metadata_content)
131-
metadata = Metadata.from_raw(raw_metadata)
132-
return metadata
130+
return Metadata.from_email(metadata_content)
133131

134-
# If we didn't find the metadata, return an empty metadata object
135-
raw_metadata, _ = parse_email(b"")
136-
return Metadata.from_raw(raw_metadata)
132+
# If we didn't find the metadata, raise an error
133+
raise ValueError(f"Could not find METADATA file in wheel: {url}")

tests/test_pep658_support.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ def test_get_metadata_with_pep658_success(self, mock_session) -> None:
5656
metadata = get_metadata_for_wheel(wheel_url, metadata_url)
5757

5858
# Verify the metadata was parsed correctly
59-
assert metadata["Name"] == "test-package"
60-
assert metadata["Version"] == "1.0.0"
61-
assert metadata["Summary"] == "A test package"
62-
assert "requests >= 2.0.0" in metadata.get_all("Requires-Dist", [])
59+
assert metadata.name == "test-package"
60+
assert str(metadata.version) == "1.0.0"
61+
assert metadata.summary == "A test package"
62+
assert metadata.requires_dist is not None
63+
assert any(str(req) == "requests>=2.0.0" for req in metadata.requires_dist)
6364

6465
# Verify only the metadata URL was called, not the wheel URL
6566
mock_session.get.assert_called_once_with(metadata_url)

0 commit comments

Comments
 (0)