Skip to content

Commit c448f05

Browse files
committed
stop using the json API at pypi
1 parent 8a8f21b commit c448f05

File tree

63 files changed

+70
-5604
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+70
-5604
lines changed

src/poetry/repositories/http_repository.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737

3838
if TYPE_CHECKING:
3939
from packaging.utils import NormalizedName
40+
from poetry.core.constraints.version import Version
41+
from poetry.core.packages.package import Package
4042
from poetry.core.packages.utils.link import Link
4143

4244
from poetry.repositories.link_sources.base import LinkSource
@@ -91,6 +93,36 @@ def certificates(self) -> RepositoryCertificateConfig:
9193
def authenticated_url(self) -> str:
9294
return self._authenticator.authenticated_url(url=self.url)
9395

96+
def find_links_for_package(self, package: Package) -> list[Link]:
97+
try:
98+
page = self.get_page(package.name)
99+
except PackageNotFound:
100+
return []
101+
102+
return list(page.links_for_version(package.name, package.version))
103+
104+
def _get_release_info(
105+
self, name: NormalizedName, version: Version
106+
) -> dict[str, Any]:
107+
page = self.get_page(name)
108+
109+
links = list(page.links_for_version(name, version))
110+
yanked = page.yanked(name, version)
111+
112+
return self._links_to_data(
113+
links,
114+
PackageInfo(
115+
name=name,
116+
version=version.text,
117+
summary="",
118+
requires_dist=[],
119+
requires_python=None,
120+
files=[],
121+
yanked=yanked,
122+
cache_version=str(self.CACHE_VERSION),
123+
),
124+
)
125+
94126
def _download(
95127
self, url: str, dest: Path, *, raise_accepts_ranges: bool = False
96128
) -> None:

src/poetry/repositories/legacy_repository.py

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
from contextlib import suppress
44
from functools import cached_property
55
from typing import TYPE_CHECKING
6-
from typing import Any
76

87
import requests.adapters
98

109
from poetry.core.packages.package import Package
1110

12-
from poetry.inspection.info import PackageInfo
1311
from poetry.repositories.exceptions import PackageNotFound
1412
from poetry.repositories.http_repository import HTTPRepository
1513
from poetry.repositories.link_sources.html import SimpleRepositoryPage
@@ -20,7 +18,6 @@
2018
from packaging.utils import NormalizedName
2119
from poetry.core.constraints.version import Version
2220
from poetry.core.constraints.version import VersionConstraint
23-
from poetry.core.packages.utils.link import Link
2421

2522
from poetry.config.config import Config
2623

@@ -65,14 +62,6 @@ def package(
6562

6663
return package
6764

68-
def find_links_for_package(self, package: Package) -> list[Link]:
69-
try:
70-
page = self.get_page(package.name)
71-
except PackageNotFound:
72-
return []
73-
74-
return list(page.links_for_version(package.name, package.version))
75-
7665
def _find_packages(
7766
self, name: NormalizedName, constraint: VersionConstraint
7867
) -> list[Package]:
@@ -103,28 +92,6 @@ def _find_packages(
10392
for version, yanked in versions
10493
]
10594

106-
def _get_release_info(
107-
self, name: NormalizedName, version: Version
108-
) -> dict[str, Any]:
109-
page = self.get_page(name)
110-
111-
links = list(page.links_for_version(name, version))
112-
yanked = page.yanked(name, version)
113-
114-
return self._links_to_data(
115-
links,
116-
PackageInfo(
117-
name=name,
118-
version=version.text,
119-
summary="",
120-
requires_dist=[],
121-
requires_python=None,
122-
files=[],
123-
yanked=yanked,
124-
cache_version=str(self.CACHE_VERSION),
125-
),
126-
)
127-
12895
def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage:
12996
if not (response := self._get_response(f"/{name}/")):
13097
raise PackageNotFound(f"Package [{name}] not found.")

src/poetry/repositories/link_sources/json.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,13 @@ def _link_cache(self) -> LinkCache:
4141
metadata = bool(metadata_value)
4242
break
4343

44+
hashes = file.get("hashes")
4445
link = Link(
45-
url, requires_python=requires_python, yanked=yanked, metadata=metadata
46+
url,
47+
requires_python=requires_python,
48+
hashes=hashes,
49+
yanked=yanked,
50+
metadata=metadata,
4651
)
4752

4853
if link.ext not in self.SUPPORTED_FORMATS:

src/poetry/repositories/pypi_repository.py

Lines changed: 0 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
from cachecontrol.controller import logger as cache_control_logger
1212
from poetry.core.packages.package import Package
13-
from poetry.core.packages.utils.link import Link
1413
from poetry.core.version.exceptions import InvalidVersion
1514

1615
from poetry.repositories.exceptions import PackageNotFound
@@ -26,18 +25,14 @@
2625

2726
if TYPE_CHECKING:
2827
from packaging.utils import NormalizedName
29-
from poetry.core.constraints.version import Version
3028
from poetry.core.constraints.version import VersionConstraint
3129

32-
SUPPORTED_PACKAGE_TYPES = {"sdist", "bdist_wheel"}
33-
3430

3531
class PyPiRepository(HTTPRepository):
3632
def __init__(
3733
self,
3834
url: str = "https://pypi.org/",
3935
disable_cache: bool = False,
40-
fallback: bool = True,
4136
pool_size: int = requests.adapters.DEFAULT_POOLSIZE,
4237
) -> None:
4338
super().__init__(
@@ -48,7 +43,6 @@ def __init__(
4843
)
4944

5045
self._base_url = url
51-
self._fallback = fallback
5246

5347
def search(self, query: str) -> list[Package]:
5448
results = []
@@ -110,79 +104,6 @@ def _get_package_info(self, name: NormalizedName) -> dict[str, Any]:
110104

111105
return info
112106

113-
def find_links_for_package(self, package: Package) -> list[Link]:
114-
json_data = self._get(f"pypi/{package.name}/{package.version}/json")
115-
if json_data is None:
116-
return []
117-
118-
links = []
119-
for url in json_data["urls"]:
120-
if url["packagetype"] in SUPPORTED_PACKAGE_TYPES:
121-
h = f"sha256={url['digests']['sha256']}"
122-
links.append(Link(url["url"] + "#" + h, yanked=self._get_yanked(url)))
123-
124-
return links
125-
126-
def _get_release_info(
127-
self, name: NormalizedName, version: Version
128-
) -> dict[str, Any]:
129-
from poetry.inspection.info import PackageInfo
130-
131-
self._log(f"Getting info for {name} ({version}) from PyPI", "debug")
132-
133-
json_data = self._get(f"pypi/{name}/{version}/json")
134-
if json_data is None:
135-
raise PackageNotFound(f"Package [{name}] not found.")
136-
137-
info = json_data["info"]
138-
139-
data = PackageInfo(
140-
name=info["name"],
141-
version=info["version"],
142-
summary=info["summary"],
143-
requires_dist=info["requires_dist"],
144-
requires_python=info["requires_python"],
145-
yanked=self._get_yanked(info),
146-
cache_version=str(self.CACHE_VERSION),
147-
)
148-
149-
try:
150-
version_info = json_data["urls"]
151-
except KeyError:
152-
version_info = []
153-
154-
files = info.get("files", [])
155-
for file_info in version_info:
156-
if file_info["packagetype"] in SUPPORTED_PACKAGE_TYPES:
157-
files.append(
158-
{
159-
"file": file_info["filename"],
160-
"hash": "sha256:" + file_info["digests"]["sha256"],
161-
}
162-
)
163-
data.files = files
164-
165-
if self._fallback and data.requires_dist is None:
166-
self._log(
167-
"No dependencies found, downloading metadata and/or archives",
168-
level="debug",
169-
)
170-
# No dependencies set (along with other information)
171-
# This might be due to actually no dependencies
172-
# or badly set metadata when uploading.
173-
# So, we need to make sure there is actually no
174-
# dependencies by introspecting packages.
175-
page = self.get_page(name)
176-
links = list(page.links_for_version(name, version))
177-
info = self._get_info_from_links(links)
178-
179-
data.requires_dist = info.requires_dist
180-
181-
if not data.requires_python:
182-
data.requires_python = info.requires_python
183-
184-
return data.asdict()
185-
186107
def _get_page(self, name: NormalizedName) -> SimpleJsonPage:
187108
source = self._base_url + f"simple/{name}/"
188109
info = self.get_package_info(name)

tests/installation/fixtures/with-pypi-repository.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ name = "pluggy"
4747
version = "0.6.0"
4848
description = "plugin and hook calling mechanisms for python"
4949
optional = false
50-
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
50+
python-versions = ">=2.7,<3.0.dev0 || >=3.4.dev0"
5151
files = [
5252
{file = "pluggy-0.6.0-py2-none-any.whl", hash = "sha256:9b835f86bfe5498c87ace7f4899cb1b0c40e71c9277377f6851c74a307879285"},
5353
{file = "pluggy-0.6.0-py3-none-any.whl", hash = "sha256:8c646771f5eab7557d1f3924077c55408e86bdfb700f7d86a6d83abeabff4c66"},

tests/installation/test_executor.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ def io_not_decorated() -> BufferedIO:
126126
def pool(pypi_repository: PyPiRepository) -> RepositoryPool:
127127
pool = RepositoryPool()
128128

129-
pypi_repository._fallback = True
130129
pool.add_repository(pypi_repository)
131130

132131
return pool

tests/installation/test_installer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from poetry.repositories import RepositoryPool
2929
from poetry.repositories.installed_repository import InstalledRepository
3030
from poetry.toml.file import TOMLFile
31+
from poetry.utils._compat import WINDOWS
3132
from poetry.utils.env import MockEnv
3233
from poetry.utils.env import NullEnv
3334
from tests.helpers import MOCK_DEFAULT_GIT_REVISION
@@ -1900,8 +1901,6 @@ def test_installer_required_extras_should_not_be_removed_when_updating_single_de
19001901
config: Config,
19011902
pypi_repository: PyPiRepository,
19021903
) -> None:
1903-
mocker.patch("sys.platform", "darwin")
1904-
19051904
pool = RepositoryPool()
19061905
pool.add_repository(pypi_repository)
19071906

@@ -1954,7 +1953,8 @@ def test_installer_required_extras_should_not_be_removed_when_updating_single_de
19541953
result = installer.run()
19551954
assert result == 0
19561955

1957-
assert installer.executor.installations_count == 7
1956+
installations = 8 if WINDOWS else 7
1957+
assert installer.executor.installations_count == installations
19581958
assert installer.executor.updates_count == 0
19591959
assert installer.executor.removals_count == 0
19601960

tests/puzzle/test_solver.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,25 +3016,6 @@ def test_solver_can_solve_with_legacy_repository_using_proper_python_compatible_
30163016
)
30173017

30183018

3019-
def test_solver_skips_invalid_versions(
3020-
package: ProjectPackage, io: NullIO, pypi_repository: PyPiRepository
3021-
) -> None:
3022-
package.python_versions = "^3.9"
3023-
3024-
pool = RepositoryPool([pypi_repository])
3025-
3026-
solver = Solver(package, pool, [], [], io)
3027-
3028-
package.add_dependency(Factory.create_dependency("six-unknown-version", "^1.11"))
3029-
3030-
transaction = solver.solve()
3031-
3032-
check_solver_result(
3033-
transaction,
3034-
[{"job": "install", "package": get_package("six-unknown-version", "1.11.0")}],
3035-
)
3036-
3037-
30383019
def test_multiple_constraints_on_root(
30393020
package: ProjectPackage, solver: Solver, repo: Repository
30403021
) -> None:
@@ -4707,6 +4688,25 @@ def test_solver_resolves_duplicate_dependency_in_extra(
47074688
)
47084689

47094690

4691+
def test_solver_skips_invalid_versions(
4692+
package: ProjectPackage, io: NullIO, pypi_repository: PyPiRepository
4693+
) -> None:
4694+
package.python_versions = "^3.9"
4695+
4696+
pool = RepositoryPool([pypi_repository])
4697+
4698+
solver = Solver(package, pool, [], [], io)
4699+
4700+
package.add_dependency(Factory.create_dependency("six-unknown-version", "^1.11"))
4701+
4702+
transaction = solver.solve()
4703+
4704+
check_solver_result(
4705+
transaction,
4706+
[{"job": "install", "package": get_package("six-unknown-version", "1.11.0")}],
4707+
)
4708+
4709+
47104710
def test_solver_resolves_duplicate_dependencies_with_restricted_extras(
47114711
package: ProjectPackage,
47124712
pool: RepositoryPool,

0 commit comments

Comments
 (0)