Skip to content

Commit 48fd9ba

Browse files
committed
Test metadata roundtrip when using pypa/wheel parsing techniques
1 parent 2b6dfd0 commit 48fd9ba

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

setuptools/tests/test_core_metadata.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import importlib
55
import io
66
from email import message_from_string
7+
from email.generator import Generator
78
from email.message import Message
9+
from email.parser import Parser
10+
from email.policy import EmailPolicy
811
from pathlib import Path
912
from unittest.mock import Mock
1013

@@ -403,6 +406,31 @@ def test_equivalent_output(self, tmp_path, dist):
403406
# Compare setuptools PKG-INFO x pypa/wheel METADATA
404407
assert metadata_str == pkg_info_str
405408

409+
# Make sure it parses/serializes well in pypa/wheel
410+
_assert_roundtrip_message(pkg_info)
411+
412+
413+
def _assert_roundtrip_message(metadata: str) -> None:
414+
"""Emulate the way wheel.bdist_wheel parses and regenerates the message,
415+
then ensures the metadata generated by setuptools is compatible.
416+
"""
417+
with io.StringIO(metadata) as buffer:
418+
msg = Parser().parse(buffer)
419+
420+
serialization_policy = EmailPolicy(
421+
utf8=True,
422+
mangle_from_=False,
423+
max_line_length=0,
424+
)
425+
with io.BytesIO() as buffer:
426+
out = io.TextIOWrapper(buffer, encoding="utf-8")
427+
Generator(out, policy=serialization_policy).flatten(msg)
428+
out.flush()
429+
regenerated = buffer.getvalue()
430+
431+
raw_metadata = bytes(metadata, "utf-8")
432+
assert regenerated == raw_metadata
433+
406434

407435
def _normalize_metadata(msg: Message) -> str:
408436
"""Allow equivalent metadata to be compared directly"""

0 commit comments

Comments
 (0)