summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnderson Bravalheri <andersonbravalheri@gmail.com>2022-11-09 19:37:05 +0000
committerGitHub <noreply@github.com>2022-11-09 21:37:05 +0200
commit3f8bdf1eb67ead22b857445c7c9aa4751ea6bd9a (patch)
tree1e18445470e79233a23714f2b733cedff8b9bb68
parentdaeb157c8207b1459fc7baa5f234c165a7a5faf4 (diff)
downloadwheel-git-3f8bdf1eb67ead22b857445c7c9aa4751ea6bd9a.tar.gz
Allow `METADATA` file to contain UTF-8 chars (#489)
-rw-r--r--src/wheel/bdist_wheel.py8
-rw-r--r--tests/test_bdist_wheel.py39
2 files changed, 46 insertions, 1 deletions
diff --git a/src/wheel/bdist_wheel.py b/src/wheel/bdist_wheel.py
index 4754fd1..7fcf4a3 100644
--- a/src/wheel/bdist_wheel.py
+++ b/src/wheel/bdist_wheel.py
@@ -15,6 +15,7 @@ import sysconfig
import warnings
from collections import OrderedDict
from email.generator import BytesGenerator, Generator
+from email.policy import EmailPolicy
from glob import iglob
from io import BytesIO
from shutil import rmtree
@@ -534,8 +535,13 @@ class bdist_wheel(Command):
adios(dependency_links_path)
pkg_info_path = os.path.join(distinfo_path, "METADATA")
+ serialization_policy = EmailPolicy(
+ utf8=True,
+ mangle_from_=False,
+ max_line_length=0,
+ )
with open(pkg_info_path, "w", encoding="utf-8") as out:
- Generator(out, mangle_from_=False, maxheaderlen=0).flatten(pkg_info)
+ Generator(out, policy=serialization_policy).flatten(pkg_info)
for license_path in self.license_paths:
filename = os.path.basename(license_path)
diff --git a/tests/test_bdist_wheel.py b/tests/test_bdist_wheel.py
index 531d9e6..5a6db16 100644
--- a/tests/test_bdist_wheel.py
+++ b/tests/test_bdist_wheel.py
@@ -72,6 +72,45 @@ def test_unicode_record(wheel_paths):
assert "åäö_日本語.py".encode() in record
+UTF8_PKG_INFO = """\
+Metadata-Version: 2.1
+Name: helloworld
+Version: 42
+Author-email: "John X. Ãørçeč" <john@utf8.org>, Γαμα קּ 東 <gama@utf8.org>
+
+
+UTF-8 描述 説明
+"""
+
+
+def test_preserve_unicode_metadata(monkeypatch, tmp_path):
+ monkeypatch.chdir(tmp_path)
+ egginfo = tmp_path / "dummy_dist.egg-info"
+ distinfo = tmp_path / "dummy_dist.dist-info"
+
+ egginfo.mkdir()
+ (egginfo / "PKG-INFO").write_text(UTF8_PKG_INFO, encoding="utf-8")
+ (egginfo / "dependency_links.txt").touch()
+
+ class simpler_bdist_wheel(bdist_wheel):
+ """Avoid messing with setuptools/distutils internals"""
+
+ def __init__(self):
+ pass
+
+ @property
+ def license_paths(self):
+ return []
+
+ cmd_obj = simpler_bdist_wheel()
+ cmd_obj.egg2dist(egginfo, distinfo)
+
+ metadata = (distinfo / "METADATA").read_text(encoding="utf-8")
+ assert 'Author-email: "John X. Ãørçeč"' in metadata
+ assert "Γαμα קּ 東 " in metadata
+ assert "UTF-8 描述 説明" in metadata
+
+
def test_licenses_default(dummy_dist, monkeypatch, tmpdir):
monkeypatch.chdir(dummy_dist)
subprocess.check_call(