diff --git a/src/poetry/repositories/pypi_repository.py b/src/poetry/repositories/pypi_repository.py index dd9bb7295b8..327e24f69cc 100644 --- a/src/poetry/repositories/pypi_repository.py +++ b/src/poetry/repositories/pypi_repository.py @@ -1,5 +1,6 @@ from __future__ import annotations +import contextlib import logging from typing import TYPE_CHECKING @@ -9,9 +10,11 @@ import requests.adapters from cachecontrol.controller import logger as cache_control_logger +from poetry.core.packages.dependency import Dependency from poetry.core.packages.package import Package from poetry.core.packages.utils.link import Link from poetry.core.version.exceptions import InvalidVersionError +from poetry.core.version.requirements import InvalidRequirementError from poetry.repositories.exceptions import PackageNotFoundError from poetry.repositories.http_repository import HTTPRepository @@ -76,6 +79,18 @@ def search(self, query: str | list[str]) -> list[Package]: level="debug", ) + if not results: + # in cases like PyPI search might not be available, we fallback to explicit searches + # to allow for a nicer ux rather than finding nothing at all + # see: https://discuss.python.org/t/fastly-interfering-with-pypi-search/73597/6 + # + tokens = query if isinstance(query, list) else [query] + for token in tokens: + with contextlib.suppress(InvalidRequirementError): + results.extend( + self.find_packages(Dependency.create_from_pep_508(token)) + ) + return results def get_package_info(self, name: NormalizedName) -> dict[str, Any]: diff --git a/tests/console/commands/test_search.py b/tests/console/commands/test_search.py index 2fbc577ea7c..d440dcfa1cb 100644 --- a/tests/console/commands/test_search.py +++ b/tests/console/commands/test_search.py @@ -2,7 +2,6 @@ import re -from pathlib import Path from typing import TYPE_CHECKING import pytest @@ -19,10 +18,7 @@ from poetry.repositories.legacy_repository import LegacyRepository from tests.types import CommandTesterFactory -TESTS_DIRECTORY = Path(__file__).parent.parent.parent -FIXTURES_DIRECTORY = ( - TESTS_DIRECTORY / "repositories" / "fixtures" / "pypi.org" / "search" -) + SQLALCHEMY_SEARCH_OUTPUT_PYPI = """\ Package Version Source Description broadway-sqlalchemy 0.0.1 PyPI A broadway extension wrapping Flask-SQLAlchemy diff --git a/tests/repositories/fixtures/pypi.org/search/search-disallowed.html b/tests/repositories/fixtures/pypi.org/search/search-disallowed.html new file mode 100644 index 00000000000..25305b1c201 --- /dev/null +++ b/tests/repositories/fixtures/pypi.org/search/search-disallowed.html @@ -0,0 +1,89 @@ + + +
+ + + + + + + + +