Skip to content

Commit 46158f0

Browse files
committed
Remove the html5lib deprecated feature flag.
1 parent 534262d commit 46158f0

File tree

14 files changed

+21
-135
lines changed

14 files changed

+21
-135
lines changed

news/10825.removal.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove the ``html5lib`` deprecated feature flag.

src/pip/_internal/cli/cmdoptions.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,6 @@ def check_list_path_option(options: Values) -> None:
10131013
default=[],
10141014
choices=[
10151015
"legacy-resolver",
1016-
"html5lib",
10171016
],
10181017
help=("Enable deprecated functionality, that will be removed in the future."),
10191018
)

src/pip/_internal/cli/req_command.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,5 +499,4 @@ def _build_package_finder(
499499
link_collector=link_collector,
500500
selection_prefs=selection_prefs,
501501
target_python=target_python,
502-
use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled,
503502
)

src/pip/_internal/commands/index.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ def _build_package_finder(
9797
link_collector=link_collector,
9898
selection_prefs=selection_prefs,
9999
target_python=target_python,
100-
use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled,
101100
)
102101

103102
def get_available_package_versions(self, options: Values, args: List[Any]) -> None:

src/pip/_internal/commands/list.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ def _build_package_finder(
149149
return PackageFinder.create(
150150
link_collector=link_collector,
151151
selection_prefs=selection_prefs,
152-
use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled,
153152
)
154153

155154
def run(self, options: Values, args: List[str]) -> int:

src/pip/_internal/index/collector.py

Lines changed: 8 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
Union,
2929
)
3030

31-
from pip._vendor import html5lib, requests
31+
from pip._vendor import requests
3232
from pip._vendor.requests import Response
3333
from pip._vendor.requests.exceptions import RetryError, SSLError
3434

@@ -163,27 +163,6 @@ def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]:
163163
return None
164164

165165

166-
def _determine_base_url(document: HTMLElement, page_url: str) -> str:
167-
"""Determine the HTML document's base URL.
168-
169-
This looks for a ``<base>`` tag in the HTML document. If present, its href
170-
attribute denotes the base URL of anchor tags in the document. If there is
171-
no such tag (or if it does not have a valid href attribute), the HTML
172-
file's URL is used as the base URL.
173-
174-
:param document: An HTML document representation. The current
175-
implementation expects the result of ``html5lib.parse()``.
176-
:param page_url: The URL of the HTML document.
177-
178-
TODO: Remove when `html5lib` is dropped.
179-
"""
180-
for base in document.findall(".//base"):
181-
href = base.get("href")
182-
if href is not None:
183-
return href
184-
return page_url
185-
186-
187166
def _clean_url_path_part(part: str) -> str:
188167
"""
189168
Clean a "part" of a URL path (i.e. after splitting on "@" characters).
@@ -285,9 +264,7 @@ def __hash__(self) -> int:
285264

286265

287266
class ParseLinks(Protocol):
288-
def __call__(
289-
self, page: "HTMLPage", use_deprecated_html5lib: bool
290-
) -> Iterable[Link]:
267+
def __call__(self, page: "HTMLPage") -> Iterable[Link]:
291268
...
292269

293270

@@ -299,55 +276,24 @@ def with_cached_html_pages(fn: ParseLinks) -> ParseLinks:
299276
"""
300277

301278
@functools.lru_cache(maxsize=None)
302-
def wrapper(
303-
cacheable_page: CacheablePageContent, use_deprecated_html5lib: bool
304-
) -> List[Link]:
305-
return list(fn(cacheable_page.page, use_deprecated_html5lib))
279+
def wrapper(cacheable_page: CacheablePageContent) -> List[Link]:
280+
return list(fn(cacheable_page.page))
306281

307282
@functools.wraps(fn)
308-
def wrapper_wrapper(page: "HTMLPage", use_deprecated_html5lib: bool) -> List[Link]:
283+
def wrapper_wrapper(page: "HTMLPage") -> List[Link]:
309284
if page.cache_link_parsing:
310-
return wrapper(CacheablePageContent(page), use_deprecated_html5lib)
311-
return list(fn(page, use_deprecated_html5lib))
285+
return wrapper(CacheablePageContent(page))
286+
return list(fn(page))
312287

313288
return wrapper_wrapper
314289

315290

316-
def _parse_links_html5lib(page: "HTMLPage") -> Iterable[Link]:
317-
"""
318-
Parse an HTML document, and yield its anchor elements as Link objects.
319-
320-
TODO: Remove when `html5lib` is dropped.
321-
"""
322-
document = html5lib.parse(
323-
page.content,
324-
transport_encoding=page.encoding,
325-
namespaceHTMLElements=False,
326-
)
327-
328-
url = page.url
329-
base_url = _determine_base_url(document, url)
330-
for anchor in document.findall(".//a"):
331-
link = _create_link_from_element(
332-
anchor.attrib,
333-
page_url=url,
334-
base_url=base_url,
335-
)
336-
if link is None:
337-
continue
338-
yield link
339-
340-
341291
@with_cached_html_pages
342-
def parse_links(page: "HTMLPage", use_deprecated_html5lib: bool) -> Iterable[Link]:
292+
def parse_links(page: "HTMLPage") -> Iterable[Link]:
343293
"""
344294
Parse an HTML document, and yield its anchor elements as Link objects.
345295
"""
346296

347-
if use_deprecated_html5lib:
348-
yield from _parse_links_html5lib(page)
349-
return
350-
351297
parser = HTMLLinkParser(page.url)
352298
encoding = page.encoding or "utf-8"
353299
parser.feed(page.content.decode(encoding))

src/pip/_internal/index/package_finder.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,6 @@ def __init__(
598598
link_collector: LinkCollector,
599599
target_python: TargetPython,
600600
allow_yanked: bool,
601-
use_deprecated_html5lib: bool,
602601
format_control: Optional[FormatControl] = None,
603602
candidate_prefs: Optional[CandidatePreferences] = None,
604603
ignore_requires_python: Optional[bool] = None,
@@ -623,7 +622,6 @@ def __init__(
623622
self._ignore_requires_python = ignore_requires_python
624623
self._link_collector = link_collector
625624
self._target_python = target_python
626-
self._use_deprecated_html5lib = use_deprecated_html5lib
627625

628626
self.format_control = format_control
629627

@@ -640,8 +638,6 @@ def create(
640638
link_collector: LinkCollector,
641639
selection_prefs: SelectionPreferences,
642640
target_python: Optional[TargetPython] = None,
643-
*,
644-
use_deprecated_html5lib: bool,
645641
) -> "PackageFinder":
646642
"""Create a PackageFinder.
647643
@@ -666,7 +662,6 @@ def create(
666662
allow_yanked=selection_prefs.allow_yanked,
667663
format_control=selection_prefs.format_control,
668664
ignore_requires_python=selection_prefs.ignore_requires_python,
669-
use_deprecated_html5lib=use_deprecated_html5lib,
670665
)
671666

672667
@property
@@ -796,7 +791,7 @@ def process_project_url(
796791
if html_page is None:
797792
return []
798793

799-
page_links = list(parse_links(html_page, self._use_deprecated_html5lib))
794+
page_links = list(parse_links(html_page))
800795

801796
with indent_log():
802797
package_links = self.evaluate_links(

src/pip/_internal/self_outdated_check.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,6 @@ def _get_current_remote_pip_version(
173173
finder = PackageFinder.create(
174174
link_collector=link_collector,
175175
selection_prefs=selection_prefs,
176-
use_deprecated_html5lib=("html5lib" in options.deprecated_features_enabled),
177176
)
178177
best_candidate = finder.find_best_candidate("pip").best_candidate
179178
if best_candidate is None:

tests/functional/test_build_env.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ def run_with_build_env(
4949
finder = PackageFinder.create(
5050
link_collector=link_collector,
5151
selection_prefs=selection_prefs,
52-
use_deprecated_html5lib=False,
5352
)
5453
5554
with global_tempdir_manager():

tests/lib/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ def make_test_finder(
115115
allow_all_prereleases: bool = False,
116116
session: Optional[PipSession] = None,
117117
target_python: Optional[TargetPython] = None,
118-
use_deprecated_html5lib: bool = False,
119118
) -> PackageFinder:
120119
"""
121120
Create a PackageFinder for testing purposes.
@@ -134,7 +133,6 @@ def make_test_finder(
134133
link_collector=link_collector,
135134
selection_prefs=selection_prefs,
136135
target_python=target_python,
137-
use_deprecated_html5lib=use_deprecated_html5lib,
138136
)
139137

140138

tests/unit/resolution_resolvelib/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def finder(data: TestData) -> Iterator[PackageFinder]:
2626
scope = SearchScope([str(data.packages)], [])
2727
collector = LinkCollector(session, scope)
2828
prefs = SelectionPreferences(allow_yanked=False)
29-
finder = PackageFinder.create(collector, prefs, use_deprecated_html5lib=False)
29+
finder = PackageFinder.create(collector, prefs)
3030
yield finder
3131

3232

tests/unit/test_collector.py

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@
99
from unittest import mock
1010

1111
import pytest
12-
from pip._vendor import html5lib, requests
12+
from pip._vendor import requests
1313

1414
from pip._internal.exceptions import NetworkConnectionError
1515
from pip._internal.index.collector import (
1616
HTMLPage,
1717
LinkCollector,
1818
_clean_link,
1919
_clean_url_path,
20-
_determine_base_url,
2120
_get_html_page,
2221
_get_html_response,
2322
_make_html_page,
@@ -232,33 +231,6 @@ def test_get_html_response_dont_log_clear_text_password(
232231
]
233232

234233

235-
@pytest.mark.parametrize(
236-
("html", "url", "expected"),
237-
[
238-
(b"<html></html>", "https://example.com/", "https://example.com/"),
239-
(
240-
b'<html><head><base href="https://foo.example.com/"></head></html>',
241-
"https://example.com/",
242-
"https://foo.example.com/",
243-
),
244-
(
245-
b"<html><head>"
246-
b'<base><base href="https://foo.example.com/">'
247-
b"</head></html>",
248-
"https://example.com/",
249-
"https://foo.example.com/",
250-
),
251-
],
252-
)
253-
def test_determine_base_url(html: bytes, url: str, expected: str) -> None:
254-
document = html5lib.parse(
255-
html,
256-
transport_encoding=None,
257-
namespaceHTMLElements=False,
258-
)
259-
assert _determine_base_url(document, url) == expected
260-
261-
262234
@pytest.mark.parametrize(
263235
("path", "expected"),
264236
[
@@ -433,7 +405,7 @@ def _test_parse_links_data_attribute(
433405
# the page content isn't cached.
434406
url=f"https://example.com/simple-{uuid.uuid4()}/",
435407
)
436-
links = list(parse_links(page, use_deprecated_html5lib=False))
408+
links = list(parse_links(page))
437409
(link,) = links
438410
actual = getattr(link, attr)
439411
assert actual == expected
@@ -525,14 +497,14 @@ def test_parse_links_caches_same_page_by_url() -> None:
525497
cache_link_parsing=False,
526498
)
527499

528-
parsed_links_1 = list(parse_links(page_1, use_deprecated_html5lib=False))
500+
parsed_links_1 = list(parse_links(page_1))
529501
assert len(parsed_links_1) == 1
530502
assert "pkg1" in parsed_links_1[0].url
531503

532-
parsed_links_2 = list(parse_links(page_2, use_deprecated_html5lib=False))
504+
parsed_links_2 = list(parse_links(page_2))
533505
assert parsed_links_2 == parsed_links_1
534506

535-
parsed_links_3 = list(parse_links(page_3, use_deprecated_html5lib=False))
507+
parsed_links_3 = list(parse_links(page_3))
536508
assert len(parsed_links_3) == 1
537509
assert parsed_links_3 != parsed_links_1
538510
assert "pkg2" in parsed_links_3[0].url
@@ -543,7 +515,7 @@ def test_parse_link_handles_deprecated_usage_properly() -> None:
543515
url = "https://example.com/simple/"
544516
page = HTMLPage(html, encoding=None, url=url, cache_link_parsing=False)
545517

546-
parsed_links = list(parse_links(page, use_deprecated_html5lib=True))
518+
parsed_links = list(parse_links(page))
547519

548520
assert len(parsed_links) == 2
549521
assert "pkg1-1.0" in parsed_links[0].url

tests/unit/test_finder.py

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,7 @@ def test_incorrect_case_file_index(data: TestData) -> None:
8080

8181

8282
@pytest.mark.network
83-
@pytest.mark.parametrize("use_deprecated_html5lib", [False, True])
84-
def test_finder_detects_latest_already_satisfied_find_links(
85-
data: TestData, use_deprecated_html5lib: bool
86-
) -> None:
83+
def test_finder_detects_latest_already_satisfied_find_links(data: TestData) -> None:
8784
"""Test PackageFinder detects latest already satisfied using find-links"""
8885
req = install_req_from_line("simple", None)
8986
# the latest simple in local pkgs is 3.0
@@ -93,19 +90,14 @@ def test_finder_detects_latest_already_satisfied_find_links(
9390
version=parse_version(latest_version),
9491
)
9592
req.satisfied_by = satisfied_by
96-
finder = make_test_finder(
97-
find_links=[data.find_links], use_deprecated_html5lib=use_deprecated_html5lib
98-
)
93+
finder = make_test_finder(find_links=[data.find_links])
9994

10095
with pytest.raises(BestVersionAlreadyInstalled):
10196
finder.find_requirement(req, True)
10297

10398

10499
@pytest.mark.network
105-
@pytest.mark.parametrize("use_deprecated_html5lib", [False, True])
106-
def test_finder_detects_latest_already_satisfied_pypi_links(
107-
use_deprecated_html5lib: bool,
108-
) -> None:
100+
def test_finder_detects_latest_already_satisfied_pypi_links() -> None:
109101
"""Test PackageFinder detects latest already satisfied using pypi links"""
110102
req = install_req_from_line("initools", None)
111103
# the latest initools on PyPI is 0.3.1
@@ -115,10 +107,7 @@ def test_finder_detects_latest_already_satisfied_pypi_links(
115107
version=parse_version(latest_version),
116108
)
117109
req.satisfied_by = satisfied_by
118-
finder = make_test_finder(
119-
index_urls=["http://pypi.org/simple/"],
120-
use_deprecated_html5lib=use_deprecated_html5lib,
121-
)
110+
finder = make_test_finder(index_urls=["http://pypi.org/simple/"])
122111

123112
with pytest.raises(BestVersionAlreadyInstalled):
124113
finder.find_requirement(req, True)

0 commit comments

Comments
 (0)