Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix parsing of metadata attribute, add test
Browse files Browse the repository at this point in the history
radoering committed Nov 19, 2023
1 parent fdba582 commit 09b8bab
Showing 2 changed files with 72 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/poetry/repositories/link_sources/html.py
Original file line number Diff line number Diff line change
@@ -42,7 +42,18 @@ def _link_cache(self) -> LinkCache:
yanked = unescape(yanked_value)
else:
yanked = "data-yanked" in anchor
metadata = anchor.get("data-dist-info-metadata")

# see https://peps.python.org/pep-0714/#clients
# and https://peps.python.org/pep-0658/#specification
metadata: str | bool
for metadata_key in ("data-core-metadata", "data-dist-info-metadata"):
metadata_value = anchor.get(metadata_key)
if metadata_value:
metadata = unescape(metadata_value)
else:
metadata = metadata_key in anchor
if metadata:
break
link = Link(
url, requires_python=pyrequire, yanked=yanked, metadata=metadata
)
60 changes: 60 additions & 0 deletions tests/repositories/link_sources/test_html.py
Original file line number Diff line number Diff line change
@@ -91,6 +91,66 @@ def test_yanked(
assert page.yanked(canonicalize_name("demo"), Version.parse("0.1")) == expected


@pytest.mark.parametrize(
"metadata, expected_has_metadata, expected_hash_name, expected_hash",
[
("", False, None, None),
# new
("data-core-metadata", True, None, None),
("data-core-metadata=''", True, None, None),
("data-core-metadata='foo'", True, None, None),
("data-core-metadata='sha256=abcd'", True, "sha256", "abcd"),
# old
("data-dist-info-metadata", True, None, None),
("data-dist-info-metadata=''", True, None, None),
("data-dist-info-metadata='foo'", True, None, None),
("data-dist-info-metadata='sha256=abcd'", True, "sha256", "abcd"),
# conflicting (new wins)
("data-core-metadata data-dist-info-metadata='sha256=abcd'", True, None, None),
("data-dist-info-metadata='sha256=abcd' data-core-metadata", True, None, None),
(
"data-core-metadata='sha256=abcd' data-dist-info-metadata",
True,
"sha256",
"abcd",
),
(
"data-dist-info-metadata data-core-metadata='sha256=abcd'",
True,
"sha256",
"abcd",
),
(
"data-core-metadata='sha256=abcd' data-dist-info-metadata='sha256=1234'",
True,
"sha256",
"abcd",
),
(
"data-dist-info-metadata='sha256=1234' data-core-metadata='sha256=abcd'",
True,
"sha256",
"abcd",
),
],
)
def test_metadata(
html_page_content: HTMLPageGetter,
metadata: str,
expected_has_metadata: bool,
expected_hash_name: str | None,
expected_hash: str | None,
) -> None:
anchors = f'<a href="https://example.org/demo-0.1.whl" {metadata}>demo-0.1.whl</a>'
content = html_page_content(anchors)
page = HTMLPage("https://example.org", content)

link = next(page.links)
assert link.has_metadata is expected_has_metadata
assert link.metadata_hash_name == expected_hash_name
assert link.metadata_hash == expected_hash


@pytest.mark.parametrize(
"anchor, base_url, expected",
(

0 comments on commit 09b8bab

Please sign in to comment.