Commit bfd490c2 by Randy Döring Committed by Bjorn Neergaard

refactor(repository): always raise PackageNotFound in _get_page instead of…

refactor(repository): always raise PackageNotFound in _get_page instead of returning None; remove unsuccessful attempt to get pretty name via json-based simple API
parent a013c5c0
...@@ -296,8 +296,8 @@ class HTTPRepository(CachedRepository): ...@@ -296,8 +296,8 @@ class HTTPRepository(CachedRepository):
) )
return response return response
def _get_page(self, name: NormalizedName) -> LinkSource | None: def _get_page(self, name: NormalizedName) -> LinkSource:
response = self._get_response(f"/{name}/") response = self._get_response(f"/{name}/")
if not response: if not response:
return None raise PackageNotFound(f"Package [{name}] not found.")
return HTMLPage(response.url, response.text) return HTMLPage(response.url, response.text)
...@@ -72,8 +72,9 @@ class LegacyRepository(HTTPRepository): ...@@ -72,8 +72,9 @@ class LegacyRepository(HTTPRepository):
return package return package
def find_links_for_package(self, package: Package) -> list[Link]: def find_links_for_package(self, package: Package) -> list[Link]:
try:
page = self.get_page(package.name) page = self.get_page(package.name)
if page is None: except PackageNotFound:
return [] return []
return list(page.links_for_version(package.name, package.version)) return list(page.links_for_version(package.name, package.version))
...@@ -84,14 +85,9 @@ class LegacyRepository(HTTPRepository): ...@@ -84,14 +85,9 @@ class LegacyRepository(HTTPRepository):
""" """
Find packages on the remote server. Find packages on the remote server.
""" """
versions: list[tuple[Version, str | bool]] try:
key: str = name
if not constraint.is_any():
key = f"{key}:{constraint!s}"
page = self.get_page(name) page = self.get_page(name)
if page is None: except PackageNotFound:
self._log(f"No packages found for {name}", level="debug") self._log(f"No packages found for {name}", level="debug")
return [] return []
...@@ -117,8 +113,6 @@ class LegacyRepository(HTTPRepository): ...@@ -117,8 +113,6 @@ class LegacyRepository(HTTPRepository):
self, name: NormalizedName, version: Version self, name: NormalizedName, version: Version
) -> dict[str, Any]: ) -> dict[str, Any]:
page = self.get_page(name) page = self.get_page(name)
if page is None:
raise PackageNotFound(f'No package named "{name}"')
links = list(page.links_for_version(name, version)) links = list(page.links_for_version(name, version))
yanked = page.yanked(name, version) yanked = page.yanked(name, version)
...@@ -138,8 +132,8 @@ class LegacyRepository(HTTPRepository): ...@@ -138,8 +132,8 @@ class LegacyRepository(HTTPRepository):
), ),
) )
def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage | None: def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage:
response = self._get_response(f"/{name}/") response = self._get_response(f"/{name}/")
if not response: if not response:
return None raise PackageNotFound(f"Package [{name}] not found.")
return SimpleRepositoryPage(response.url, response.text) return SimpleRepositoryPage(response.url, response.text)
...@@ -115,13 +115,6 @@ class PyPiRepository(HTTPRepository): ...@@ -115,13 +115,6 @@ class PyPiRepository(HTTPRepository):
except PackageNotFound: except PackageNotFound:
self._log(f"No packages found for {name}", level="debug") self._log(f"No packages found for {name}", level="debug")
return [] return []
assert isinstance(json_page, SimpleJsonPage)
versions: list[tuple[Version, str | bool]]
key: str = name
if not constraint.is_any():
key = f"{key}:{constraint!s}"
versions = [ versions = [
(version, json_page.yanked(name, version)) (version, json_page.yanked(name, version))
...@@ -129,12 +122,7 @@ class PyPiRepository(HTTPRepository): ...@@ -129,12 +122,7 @@ class PyPiRepository(HTTPRepository):
if constraint.allows(version) if constraint.allows(version)
] ]
pretty_name = json_page.content["name"] return [Package(name, version, yanked=yanked) for version, yanked in versions]
packages = [
Package(pretty_name, version, yanked=yanked) for version, yanked in versions
]
return packages
def _get_package_info(self, name: str) -> dict[str, Any]: def _get_package_info(self, name: str) -> dict[str, Any]:
headers = {"Accept": "application/vnd.pypi.simple.v1+json"} headers = {"Accept": "application/vnd.pypi.simple.v1+json"}
......
...@@ -2,6 +2,7 @@ from __future__ import annotations ...@@ -2,6 +2,7 @@ from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from poetry.repositories.exceptions import PackageNotFound
from poetry.repositories.legacy_repository import LegacyRepository from poetry.repositories.legacy_repository import LegacyRepository
from poetry.repositories.link_sources.html import SimpleRepositoryPage from poetry.repositories.link_sources.html import SimpleRepositoryPage
...@@ -11,11 +12,11 @@ if TYPE_CHECKING: ...@@ -11,11 +12,11 @@ if TYPE_CHECKING:
class SinglePageRepository(LegacyRepository): class SinglePageRepository(LegacyRepository):
def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage | None: def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage:
""" """
Single page repositories only have one page irrespective of endpoint. Single page repositories only have one page irrespective of endpoint.
""" """
response = self._get_response("") response = self._get_response("")
if not response: if not response:
return None raise PackageNotFound(f"Package [{name}] not found.")
return SimpleRepositoryPage(response.url, response.text) return SimpleRepositoryPage(response.url, response.text)
...@@ -46,10 +46,10 @@ class MockRepository(LegacyRepository): ...@@ -46,10 +46,10 @@ class MockRepository(LegacyRepository):
def __init__(self) -> None: def __init__(self) -> None:
super().__init__("legacy", url="http://legacy.foo.bar", disable_cache=True) super().__init__("legacy", url="http://legacy.foo.bar", disable_cache=True)
def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage | None: def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage:
fixture = self.FIXTURES / (name + ".html") fixture = self.FIXTURES / (name + ".html")
if not fixture.exists(): if not fixture.exists():
return None raise PackageNotFound(f"Package [{name}] not found.")
with fixture.open(encoding="utf-8") as f: with fixture.open(encoding="utf-8") as f:
return SimpleRepositoryPage(self._url + f"/{name}/", f.read()) return SimpleRepositoryPage(self._url + f"/{name}/", f.read())
...@@ -432,7 +432,7 @@ def test_package_yanked( ...@@ -432,7 +432,7 @@ def test_package_yanked(
def test_package_partial_yank(): def test_package_partial_yank():
class SpecialMockRepository(MockRepository): class SpecialMockRepository(MockRepository):
def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage | None: def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage:
return super()._get_page(canonicalize_name(f"{name}-partial-yank")) return super()._get_page(canonicalize_name(f"{name}-partial-yank"))
repo = MockRepository() repo = MockRepository()
...@@ -490,7 +490,8 @@ def test_get_40x_and_returns_none( ...@@ -490,7 +490,8 @@ def test_get_40x_and_returns_none(
) -> None: ) -> None:
repo = MockHttpRepository({"/foo/": status_code}, http) repo = MockHttpRepository({"/foo/": status_code}, http)
assert repo.get_page("foo") is None with pytest.raises(PackageNotFound):
repo.get_page("foo")
def test_get_5xx_raises(http: type[httpretty.httpretty]) -> None: def test_get_5xx_raises(http: type[httpretty.httpretty]) -> None:
......
...@@ -332,14 +332,6 @@ def test_urls() -> None: ...@@ -332,14 +332,6 @@ def test_urls() -> None:
assert repository.authenticated_url == "https://pypi.org/simple/" assert repository.authenticated_url == "https://pypi.org/simple/"
def test_use_pypi_pretty_name() -> None:
repo = MockRepository(fallback=True)
package = repo.find_packages(Factory.create_dependency("twisted", "*"))
assert len(package) == 1
assert package[0].pretty_name == "Twisted"
def test_find_links_for_package_of_supported_types(): def test_find_links_for_package_of_supported_types():
repo = MockRepository() repo = MockRepository()
package = repo.find_packages(Factory.create_dependency("hbmqtt", "0.9.6")) package = repo.find_packages(Factory.create_dependency("hbmqtt", "0.9.6"))
......
...@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING ...@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING
from poetry.core.packages.dependency import Dependency from poetry.core.packages.dependency import Dependency
from poetry.repositories.exceptions import PackageNotFound
from poetry.repositories.link_sources.html import SimpleRepositoryPage from poetry.repositories.link_sources.html import SimpleRepositoryPage
from poetry.repositories.single_page_repository import SinglePageRepository from poetry.repositories.single_page_repository import SinglePageRepository
...@@ -25,10 +26,10 @@ class MockSinglePageRepository(SinglePageRepository): ...@@ -25,10 +26,10 @@ class MockSinglePageRepository(SinglePageRepository):
disable_cache=True, disable_cache=True,
) )
def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage | None: def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage:
fixture = self.FIXTURES / self.url.rsplit("/", 1)[-1] fixture = self.FIXTURES / self.url.rsplit("/", 1)[-1]
if not fixture.exists(): if not fixture.exists():
return raise PackageNotFound(f"Package [{name}] not found.")
with fixture.open(encoding="utf-8") as f: with fixture.open(encoding="utf-8") as f:
return SimpleRepositoryPage(self._url, f.read()) return SimpleRepositoryPage(self._url, f.read())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment