Skip to content

Commit b3a547f

Browse files
authored
Merge pull request #788 from tiran/sdist-metadata-validation
fix: don't treat bad sdist metadata as fatal error
2 parents fbf8f78 + d2a5c8b commit b3a547f

File tree

3 files changed

+56
-9
lines changed

3 files changed

+56
-9
lines changed

src/fromager/dependencies.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
BUILD_SDIST_REQ_FILE_NAME = "build-sdist-requirements.txt"
3434
INSTALL_REQ_FILE_NAME = "requirements.txt"
3535

36+
# marker for Fromager's stub PKG-INFO
37+
STUB_PKG_INFO_SUMMARY = "Fromage stub PKG-INFO"
38+
3639

3740
def get_build_system_dependencies(
3841
*,
@@ -314,14 +317,28 @@ def default_get_install_dependencies_of_sdist(
314317
config_settings=config_settings,
315318
validate=True,
316319
)
317-
validate_dist_name_version(
318-
req=req,
319-
version=version,
320-
what="sdist metadata",
321-
# Metadata name is a non-normalized string
322-
dist_name=canonicalize_name(metadata.name),
323-
dist_version=metadata.version,
324-
)
320+
if metadata.summary is None or STUB_PKG_INFO_SUMMARY not in metadata.summary:
321+
# Do not attempt to validate stub metadata. Version may be incorrect.
322+
# Treat other validation errors as non-fatal errors.
323+
try:
324+
validate_dist_name_version(
325+
req=req,
326+
version=version,
327+
what="sdist metadata",
328+
# Metadata name is a non-normalized string
329+
dist_name=canonicalize_name(metadata.name),
330+
dist_version=metadata.version,
331+
)
332+
except Exception as e:
333+
logger.error(
334+
"metadata for %s==%s in %r failed to validate: %s",
335+
req.name,
336+
version,
337+
sdist_root_dir,
338+
e,
339+
)
340+
else:
341+
logger.debug("Fromager stub metadata detected, not validating name and version")
325342
if not metadata.requires_dist:
326343
return set()
327344
return set(metadata.requires_dist)

src/fromager/sources.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ def pep517_build_sdist(
692692
Metadata-Version: 1.0
693693
Name: {name}
694694
Version: {version}
695-
Summary: Fromage stub PKG-INFO
695+
Summary: {summary}
696696
"""
697697

698698

@@ -726,6 +726,7 @@ def ensure_pkg_info(
726726
PKG_INFO_CONTENT.format(
727727
name=req.name,
728728
version=str(version),
729+
summary=dependencies.STUB_PKG_INFO_SUMMARY,
729730
)
730731
)
731732
had_pkg_info = False

tests/test_dependencies.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ def test_default_get_install_dependencies_of_sdist(
217217
m_pep517_metadata_of_sdist: Mock,
218218
tmp_context: context.WorkContext,
219219
tmp_path: pathlib.Path,
220+
caplog: pytest.LogCaptureFixture,
220221
) -> None:
221222
req = Requirement("huggingface-hub")
222223
version = Version("1.2.3")
@@ -245,6 +246,34 @@ def test_default_get_install_dependencies_of_sdist(
245246
)
246247
assert requirements == {Requirement("filelock"), Requirement("requests")}
247248

249+
# bad metadata (version mismatch) is treated as non-fatal error
250+
metadata_txt = textwrap.dedent(
251+
"""\
252+
Metadata-Version: 2.3
253+
Name: HuggingFace_Hub
254+
Version: 1.2a0
255+
Requires-Dist: filelock
256+
Requires-Dist: requests
257+
"""
258+
)
259+
metadata = Metadata.from_email(metadata_txt)
260+
m_pep517_metadata_of_sdist.return_value = metadata
261+
requirements = dependencies.default_get_install_dependencies_of_sdist(
262+
ctx=tmp_context,
263+
req=req,
264+
version=version,
265+
sdist_root_dir=tmp_path,
266+
build_env=Mock(),
267+
extra_environ={},
268+
build_dir=tmp_path,
269+
config_settings={},
270+
)
271+
assert requirements == {Requirement("filelock"), Requirement("requests")}
272+
assert (
273+
"sdist metadata '1.2a0' does not match public version '1.2.3'"
274+
in caplog.messages[-1]
275+
)
276+
248277

249278
@pytest.mark.parametrize(
250279
"req_str,version_str,dist_name_str,dist_version_str,exc",

0 commit comments

Comments
 (0)