|
| 1 | +import email.message |
1 | 2 | import itertools
|
2 | 3 | from typing import List, cast
|
3 | 4 | from unittest import mock
|
4 | 5 |
|
5 | 6 | import pytest
|
6 |
| - |
7 |
| -from pip._internal.metadata.pkg_resources import Distribution, Environment |
| 7 | +from pip._vendor.packaging.specifiers import SpecifierSet |
| 8 | +from pip._vendor.packaging.version import parse as parse_version |
| 9 | + |
| 10 | +from pip._internal.exceptions import UnsupportedWheel |
| 11 | +from pip._internal.metadata.pkg_resources import ( |
| 12 | + Distribution, |
| 13 | + Environment, |
| 14 | + WheelMetadata, |
| 15 | +) |
8 | 16 |
|
9 | 17 | pkg_resources = pytest.importorskip("pip._vendor.pkg_resources")
|
10 | 18 |
|
@@ -68,3 +76,48 @@ def test_get_distribution(ws: _MockWorkingSet, req_name: str) -> None:
|
68 | 76 | def test_get_distribution_nonexist() -> None:
|
69 | 77 | dist = Environment(workingset).get_distribution("non-exist")
|
70 | 78 | assert dist is None
|
| 79 | + |
| 80 | + |
| 81 | +def test_wheel_metadata_works() -> None: |
| 82 | + name = "simple" |
| 83 | + version = "0.1.0" |
| 84 | + require_a = "a==1.0" |
| 85 | + require_b = 'b==1.1; extra == "also_b"' |
| 86 | + requires = [require_a, require_b, 'c==1.2; extra == "also_c"'] |
| 87 | + extras = ["also_b", "also_c"] |
| 88 | + requires_python = ">=3" |
| 89 | + |
| 90 | + metadata = email.message.Message() |
| 91 | + metadata["Name"] = name |
| 92 | + metadata["Version"] = version |
| 93 | + for require in requires: |
| 94 | + metadata["Requires-Dist"] = require |
| 95 | + for extra in extras: |
| 96 | + metadata["Provides-Extra"] = extra |
| 97 | + metadata["Requires-Python"] = requires_python |
| 98 | + |
| 99 | + dist = Distribution( |
| 100 | + pkg_resources.DistInfoDistribution( |
| 101 | + location="<in-memory>", |
| 102 | + metadata=WheelMetadata({"METADATA": metadata.as_bytes()}, "<in-memory>"), |
| 103 | + project_name=name, |
| 104 | + ), |
| 105 | + ) |
| 106 | + |
| 107 | + assert name == dist.canonical_name == dist.raw_name |
| 108 | + assert parse_version(version) == dist.version |
| 109 | + assert set(extras) == set(dist.iter_provided_extras()) |
| 110 | + assert [require_a] == [str(r) for r in dist.iter_dependencies()] |
| 111 | + assert [require_a, require_b] == [ |
| 112 | + str(r) for r in dist.iter_dependencies(["also_b"]) |
| 113 | + ] |
| 114 | + assert metadata.as_string() == dist.metadata.as_string() |
| 115 | + assert SpecifierSet(requires_python) == dist.requires_python |
| 116 | + |
| 117 | + |
| 118 | +def test_wheel_metadata_throws_on_bad_unicode() -> None: |
| 119 | + metadata = WheelMetadata({"METADATA": b"\xff"}, "<in-memory>") |
| 120 | + |
| 121 | + with pytest.raises(UnsupportedWheel) as e: |
| 122 | + metadata.get_metadata("METADATA") |
| 123 | + assert "METADATA" in str(e.value) |
0 commit comments