|
4 | 4 | import importlib
|
5 | 5 | import io
|
6 | 6 | from email import message_from_string
|
| 7 | +from email.generator import Generator |
7 | 8 | from email.message import Message
|
| 9 | +from email.parser import Parser |
| 10 | +from email.policy import EmailPolicy |
8 | 11 | from pathlib import Path
|
9 | 12 | from unittest.mock import Mock
|
10 | 13 |
|
@@ -403,6 +406,31 @@ def test_equivalent_output(self, tmp_path, dist):
|
403 | 406 | # Compare setuptools PKG-INFO x pypa/wheel METADATA
|
404 | 407 | assert metadata_str == pkg_info_str
|
405 | 408 |
|
| 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 | + |
406 | 434 |
|
407 | 435 | def _normalize_metadata(msg: Message) -> str:
|
408 | 436 | """Allow equivalent metadata to be compared directly"""
|
|
0 commit comments