Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/index_503/wheel_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ def from_wheel(
metadata_string = extract_metadata_from_wheel_file(wheel_path)
if not metadata_string:
return None
metadata_path.write_text(metadata_string)
metadata_path.write_text(metadata_string, encoding="utf-8")
wheel_metadata = metadata.loads(metadata_string)
wheel_file_name = wheel_path.name
metadata_name = wheel_metadata["Name"]
Expand Down
25 changes: 24 additions & 1 deletion tests/test_wheelfile.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from pathlib import Path
from unittest.mock import ANY
from unittest.mock import ANY, patch

from index_503.util import get_mtime_and_size_from_path
from index_503.wheel_file import WHEEL_FILE_VERSION, WheelFile
Expand Down Expand Up @@ -41,3 +41,26 @@ def test_wheel_file_with_missing_metadata(tmp_path: Path) -> None:
wheel_path = FIXTURES.joinpath("sphinxcontrib.applehelp-1.0.3-py3-none-any.whl")
wheel_file_obj = WheelFile.from_wheel(wheel_path, metadata_path)
assert wheel_file_obj is None


def test_wheel_file_metadata_written_as_utf8(tmp_path: Path) -> None:
"""METADATA with non-ASCII content must be written as UTF-8 regardless of locale."""
metadata_path = tmp_path.joinpath("metadata")
wheel_path = FIXTURES.joinpath("CO2Signal-0.4.2-py3-none-any.whl")
# Simulate METADATA carrying non-ASCII characters (author names, descriptions).
fake_metadata = (
"Metadata-Version: 2.1\n"
"Name: CO2Signal\n"
"Version: 0.4.2\n"
"Author: Héllo Wörld\n"
"\n"
"Description with em dash — and curly quotes “like this”.\n"
)
with patch(
"index_503.wheel_file.extract_metadata_from_wheel_file",
return_value=fake_metadata,
):
wheel_file_obj = WheelFile.from_wheel(wheel_path, metadata_path)
assert wheel_file_obj is not None
# Reading the bytes back as UTF-8 must round-trip cleanly.
assert metadata_path.read_bytes() == fake_metadata.encode("utf-8")