mirror of
https://github.com/pypa/pip
synced 2023-12-13 21:30:23 +01:00
6a6561c2cb
Use the tool com2ann to automatically convert most type comments to type annotations. Some type comments continue to exist where any work beyond the automatic conversion was required (for example, additional formatting or circular references). For additional information on the com2ann tool, see: https://github.com/ilevkivskyi/com2ann
238 lines
7 KiB
Python
238 lines
7 KiB
Python
"""Tests for wheel helper.
|
|
"""
|
|
import csv
|
|
from email import message_from_string
|
|
from email.message import Message
|
|
from functools import partial
|
|
from zipfile import ZipFile
|
|
|
|
from tests.lib.wheel import (
|
|
_default,
|
|
make_metadata_file,
|
|
make_wheel,
|
|
make_wheel_metadata_file,
|
|
message_from_dict,
|
|
)
|
|
|
|
|
|
def test_message_from_dict_one_value():
|
|
message = message_from_dict({"a": "1"})
|
|
assert set(message.get_all("a")) == {"1"}
|
|
|
|
|
|
def test_message_from_dict_multiple_values():
|
|
message = message_from_dict({"a": ["1", "2"]})
|
|
assert set(message.get_all("a")) == {"1", "2"}
|
|
|
|
|
|
def message_from_bytes(contents: bytes) -> Message:
|
|
return message_from_string(contents.decode("utf-8"))
|
|
|
|
|
|
default_make_metadata = partial(
|
|
make_metadata_file,
|
|
name="simple",
|
|
value=_default,
|
|
version="0.1.0",
|
|
updates=_default,
|
|
body=_default,
|
|
)
|
|
|
|
|
|
def default_metadata_checks(f):
|
|
assert f.name == "simple-0.1.0.dist-info/METADATA"
|
|
message = message_from_bytes(f.contents)
|
|
assert message.get_all("Metadata-Version") == ["2.1"]
|
|
assert message.get_all("Name") == ["simple"]
|
|
assert message.get_all("Version") == ["0.1.0"]
|
|
return message
|
|
|
|
|
|
def test_make_metadata_file_defaults():
|
|
f = default_make_metadata()
|
|
default_metadata_checks(f)
|
|
|
|
|
|
def test_make_metadata_file_custom_value():
|
|
f = default_make_metadata(updates={"a": "1"})
|
|
message = default_metadata_checks(f)
|
|
assert message.get_all("a") == ["1"]
|
|
|
|
|
|
def test_make_metadata_file_custom_value_list():
|
|
f = default_make_metadata(updates={"a": ["1", "2"]})
|
|
message = default_metadata_checks(f)
|
|
assert set(message.get_all("a")) == {"1", "2"}
|
|
|
|
|
|
def test_make_metadata_file_custom_value_overrides():
|
|
f = default_make_metadata(updates={"Metadata-Version": "2.2"})
|
|
message = message_from_bytes(f.contents)
|
|
assert message.get_all("Metadata-Version") == ["2.2"]
|
|
|
|
|
|
def test_make_metadata_file_custom_contents():
|
|
value = b"hello"
|
|
f = default_make_metadata(value=value)
|
|
assert f.contents == value
|
|
|
|
|
|
tags = [("py2", "none", "any"), ("py3", "none", "any")]
|
|
default_make_wheel_metadata = partial(
|
|
make_wheel_metadata_file,
|
|
name="simple",
|
|
version="0.1.0",
|
|
value=_default,
|
|
tags=tags,
|
|
updates=_default,
|
|
)
|
|
|
|
|
|
def default_wheel_metadata_checks(f):
|
|
assert f.name == "simple-0.1.0.dist-info/WHEEL"
|
|
message = message_from_bytes(f.contents)
|
|
assert message.get_all("Wheel-Version") == ["1.0"]
|
|
assert message.get_all("Generator") == ["pip-test-suite"]
|
|
assert message.get_all("Root-Is-Purelib") == ["true"]
|
|
assert set(message.get_all("Tag")) == {"py2-none-any", "py3-none-any"}
|
|
return message
|
|
|
|
|
|
def test_make_wheel_metadata_file_defaults():
|
|
f = default_make_wheel_metadata()
|
|
default_wheel_metadata_checks(f)
|
|
|
|
|
|
def test_make_wheel_metadata_file_custom_value():
|
|
f = default_make_wheel_metadata(updates={"a": "1"})
|
|
message = default_wheel_metadata_checks(f)
|
|
assert message.get_all("a") == ["1"]
|
|
|
|
|
|
def test_make_wheel_metadata_file_custom_value_list():
|
|
f = default_make_wheel_metadata(updates={"a": ["1", "2"]})
|
|
message = default_wheel_metadata_checks(f)
|
|
assert set(message.get_all("a")) == {"1", "2"}
|
|
|
|
|
|
def test_make_wheel_metadata_file_custom_value_override():
|
|
f = default_make_wheel_metadata(updates={"Wheel-Version": "1.1"})
|
|
message = message_from_bytes(f.contents)
|
|
assert message.get_all("Wheel-Version") == ["1.1"]
|
|
|
|
|
|
def test_make_wheel_metadata_file_custom_contents():
|
|
value = b"hello"
|
|
f = default_make_wheel_metadata(value=value)
|
|
|
|
assert f.name == "simple-0.1.0.dist-info/WHEEL"
|
|
assert f.contents == value
|
|
|
|
|
|
def test_make_wheel_metadata_file_no_contents():
|
|
f = default_make_wheel_metadata(value=None)
|
|
assert f is None
|
|
|
|
|
|
def test_make_wheel_basics(tmpdir):
|
|
make_wheel(name="simple", version="0.1.0").save_to_dir(tmpdir)
|
|
|
|
expected_wheel_path = tmpdir / "simple-0.1.0-py2.py3-none-any.whl"
|
|
assert expected_wheel_path.exists()
|
|
|
|
with ZipFile(expected_wheel_path) as z:
|
|
names = z.namelist()
|
|
assert set(names) == {
|
|
"simple-0.1.0.dist-info/METADATA",
|
|
"simple-0.1.0.dist-info/RECORD",
|
|
"simple-0.1.0.dist-info/WHEEL",
|
|
}
|
|
|
|
|
|
def test_make_wheel_default_record():
|
|
with make_wheel(
|
|
name="simple",
|
|
version="0.1.0",
|
|
extra_files={"simple/__init__.py": "a"},
|
|
extra_metadata_files={"LICENSE": "b"},
|
|
extra_data_files={"purelib/info.txt": "c"},
|
|
).as_zipfile() as z:
|
|
record_bytes = z.read("simple-0.1.0.dist-info/RECORD")
|
|
record_text = record_bytes.decode()
|
|
record_rows = list(csv.reader(record_text.splitlines()))
|
|
records = {row[0]: row[1:] for row in record_rows}
|
|
|
|
expected = {
|
|
"simple/__init__.py": [
|
|
"sha256=ypeBEsobvcr6wjGzmiPcTaeG7_gUfE5yuYB3ha_uSLs",
|
|
"1",
|
|
],
|
|
"simple-0.1.0.data/purelib/info.txt": [
|
|
"sha256=Ln0sA6lQeuJl7PW1NWiFpTOTogKdJBOUmXJloaJa78Y",
|
|
"1",
|
|
],
|
|
"simple-0.1.0.dist-info/LICENSE": [
|
|
"sha256=PiPoFgA5WUoziU9lZOGxNIu9egCI1CxKy3PurtWcAJ0",
|
|
"1",
|
|
],
|
|
"simple-0.1.0.dist-info/RECORD": ["", ""],
|
|
}
|
|
for name, values in expected.items():
|
|
assert records[name] == values, name
|
|
|
|
# WHEEL and METADATA aren't constructed in a stable way, so just spot
|
|
# check.
|
|
expected_variable = {
|
|
"simple-0.1.0.dist-info/METADATA": "51",
|
|
"simple-0.1.0.dist-info/WHEEL": "104",
|
|
}
|
|
for name, length in expected_variable.items():
|
|
assert records[name][0].startswith("sha256="), name
|
|
assert records[name][1] == length, name
|
|
|
|
|
|
def test_make_wheel_extra_files():
|
|
with make_wheel(
|
|
name="simple",
|
|
version="0.1.0",
|
|
extra_files={"simple/__init__.py": "a"},
|
|
extra_metadata_files={"LICENSE": "b"},
|
|
extra_data_files={"info.txt": "c"},
|
|
).as_zipfile() as z:
|
|
names = z.namelist()
|
|
assert set(names) == {
|
|
"simple/__init__.py",
|
|
"simple-0.1.0.data/info.txt",
|
|
"simple-0.1.0.dist-info/LICENSE",
|
|
"simple-0.1.0.dist-info/METADATA",
|
|
"simple-0.1.0.dist-info/RECORD",
|
|
"simple-0.1.0.dist-info/WHEEL",
|
|
}
|
|
|
|
assert z.read("simple/__init__.py") == b"a"
|
|
assert z.read("simple-0.1.0.dist-info/LICENSE") == b"b"
|
|
assert z.read("simple-0.1.0.data/info.txt") == b"c"
|
|
|
|
|
|
def test_make_wheel_no_files():
|
|
with make_wheel(
|
|
name="simple",
|
|
version="0.1.0",
|
|
wheel_metadata=None,
|
|
metadata=None,
|
|
record=None,
|
|
).as_zipfile() as z:
|
|
assert not z.namelist()
|
|
|
|
|
|
def test_make_wheel_custom_files():
|
|
with make_wheel(
|
|
name="simple",
|
|
version="0.1.0",
|
|
wheel_metadata=b"a",
|
|
metadata=b"b",
|
|
record=b"c",
|
|
).as_zipfile() as z:
|
|
assert z.read("simple-0.1.0.dist-info/WHEEL") == b"a"
|
|
assert z.read("simple-0.1.0.dist-info/METADATA") == b"b"
|
|
assert z.read("simple-0.1.0.dist-info/RECORD") == b"c"
|