Commit c2b1fb3d by Chad Crawford Committed by Bjorn Neergaard

Migrate codebase from `cachy` to `poetry.utils.cache`.

parent e512cbee
...@@ -51,7 +51,6 @@ poetry-core = "^1.3.2" ...@@ -51,7 +51,6 @@ poetry-core = "^1.3.2"
poetry-plugin-export = "^1.1.2" poetry-plugin-export = "^1.1.2"
"backports.cached-property" = { version = "^1.0.2", python = "<3.8" } "backports.cached-property" = { version = "^1.0.2", python = "<3.8" }
cachecontrol = { version = "^0.12.9", extras = ["filecache"] } cachecontrol = { version = "^0.12.9", extras = ["filecache"] }
cachy = "^0.3.0"
cleo = "^1.0.0a5" cleo = "^1.0.0a5"
crashtest = "^0.3.0" crashtest = "^0.3.0"
dulwich = "^0.20.46" dulwich = "^0.20.46"
...@@ -80,6 +79,8 @@ urllib3 = "^1.26.0" ...@@ -80,6 +79,8 @@ urllib3 = "^1.26.0"
pre-commit = "^2.6" pre-commit = "^2.6"
[tool.poetry.group.test.dependencies] [tool.poetry.group.test.dependencies]
# Cachy frozen to test backwards compatibility for `poetry.utils.cache`.
cachy = "0.3.0"
deepdiff = "^5.0" deepdiff = "^5.0"
flatdict = "^4.0.1" flatdict = "^4.0.1"
httpretty = "^1.0" httpretty = "^1.0"
......
...@@ -8,6 +8,7 @@ from packaging.utils import canonicalize_name ...@@ -8,6 +8,7 @@ from packaging.utils import canonicalize_name
from poetry.config.config import Config from poetry.config.config import Config
from poetry.console.commands.command import Command from poetry.console.commands.command import Command
from poetry.utils.cache import FileCache
class CacheClearCommand(Command): class CacheClearCommand(Command):
...@@ -18,8 +19,6 @@ class CacheClearCommand(Command): ...@@ -18,8 +19,6 @@ class CacheClearCommand(Command):
options = [option("all", description="Clear all entries in the cache.")] options = [option("all", description="Clear all entries in the cache.")]
def handle(self) -> int: def handle(self) -> int:
from cachy import CacheManager
cache = self.argument("cache") cache = self.argument("cache")
parts = cache.split(":") parts = cache.split(":")
...@@ -33,13 +32,7 @@ class CacheClearCommand(Command): ...@@ -33,13 +32,7 @@ class CacheClearCommand(Command):
except ValueError: except ValueError:
raise ValueError(f"{root} is not a valid repository cache") raise ValueError(f"{root} is not a valid repository cache")
cache = CacheManager( cache = FileCache(cache_dir)
{
"default": parts[0],
"serializer": "json",
"stores": {parts[0]: {"driver": "file", "path": str(cache_dir)}},
}
)
if len(parts) == 1: if len(parts) == 1:
if not self.option("all"): if not self.option("all"):
......
...@@ -5,12 +5,12 @@ from abc import abstractmethod ...@@ -5,12 +5,12 @@ from abc import abstractmethod
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Any from typing import Any
from cachy import CacheManager
from packaging.utils import canonicalize_name from packaging.utils import canonicalize_name
from poetry.core.constraints.version import parse_constraint from poetry.core.constraints.version import parse_constraint
from poetry.config.config import Config from poetry.config.config import Config
from poetry.repositories.repository import Repository from poetry.repositories.repository import Repository
from poetry.utils.cache import FileCache
if TYPE_CHECKING: if TYPE_CHECKING:
...@@ -30,17 +30,7 @@ class CachedRepository(Repository, ABC): ...@@ -30,17 +30,7 @@ class CachedRepository(Repository, ABC):
super().__init__(name) super().__init__(name)
self._disable_cache = disable_cache self._disable_cache = disable_cache
self._cache_dir = (config or Config.create()).repository_cache_directory / name self._cache_dir = (config or Config.create()).repository_cache_directory / name
self._cache = CacheManager( self._release_cache: FileCache[dict[str, Any]] = FileCache(path=self._cache_dir)
{
"default": "releases",
"serializer": "json",
"stores": {
"releases": {"driver": "file", "path": str(self._cache_dir)},
"packages": {"driver": "dict"},
"matches": {"driver": "dict"},
},
}
)
@abstractmethod @abstractmethod
def _get_release_info( def _get_release_info(
...@@ -60,7 +50,7 @@ class CachedRepository(Repository, ABC): ...@@ -60,7 +50,7 @@ class CachedRepository(Repository, ABC):
if self._disable_cache: if self._disable_cache:
return PackageInfo.load(self._get_release_info(name, version)) return PackageInfo.load(self._get_release_info(name, version))
cached = self._cache.remember_forever( cached = self._release_cache.remember(
f"{name}:{version}", lambda: self._get_release_info(name, version) f"{name}:{version}", lambda: self._get_release_info(name, version)
) )
...@@ -73,7 +63,7 @@ class CachedRepository(Repository, ABC): ...@@ -73,7 +63,7 @@ class CachedRepository(Repository, ABC):
) )
cached = self._get_release_info(name, version) cached = self._get_release_info(name, version)
self._cache.forever(f"{name}:{version}", cached) self._release_cache.put(f"{name}:{version}", cached)
return PackageInfo.load(cached) return PackageInfo.load(cached)
......
...@@ -90,23 +90,19 @@ class LegacyRepository(HTTPRepository): ...@@ -90,23 +90,19 @@ class LegacyRepository(HTTPRepository):
if not constraint.is_any(): if not constraint.is_any():
key = f"{key}:{constraint!s}" key = f"{key}:{constraint!s}"
if self._cache.store("matches").has(key): page = self._get_page(f"/{name}/")
versions = self._cache.store("matches").get(key) if page is None:
else: self._log(
page = self._get_page(f"/{name}/") f"No packages found for {name}",
if page is None: level="debug",
self._log( )
f"No packages found for {name}", return []
level="debug",
) versions = [
return [] (version, page.yanked(name, version))
for version in page.versions(name)
versions = [ if constraint.allows(version)
(version, page.yanked(name, version)) ]
for version in page.versions(name)
if constraint.allows(version)
]
self._cache.store("matches").put(key, versions, 5)
return [ return [
Package( Package(
......
...@@ -100,13 +100,7 @@ class PyPiRepository(HTTPRepository): ...@@ -100,13 +100,7 @@ class PyPiRepository(HTTPRepository):
The information is returned from the cache if it exists The information is returned from the cache if it exists
or retrieved from the remote server. or retrieved from the remote server.
""" """
if self._disable_cache: return self._get_package_info(name)
return self._get_package_info(name)
package_info: dict[str, Any] = self._cache.store("packages").remember_forever(
name, lambda: self._get_package_info(name)
)
return package_info
def _find_packages( def _find_packages(
self, name: NormalizedName, constraint: VersionConstraint self, name: NormalizedName, constraint: VersionConstraint
...@@ -129,15 +123,11 @@ class PyPiRepository(HTTPRepository): ...@@ -129,15 +123,11 @@ class PyPiRepository(HTTPRepository):
if not constraint.is_any(): if not constraint.is_any():
key = f"{key}:{constraint!s}" key = f"{key}:{constraint!s}"
if self._cache.store("matches").has(key): versions = [
versions = self._cache.store("matches").get(key) (version, json_page.yanked(name, version))
else: for version in json_page.versions(name)
versions = [ if constraint.allows(version)
(version, json_page.yanked(name, version)) ]
for version in json_page.versions(name)
if constraint.allows(version)
]
self._cache.store("matches").put(key, versions, 5)
pretty_name = json_page.content["name"] pretty_name = json_page.content["name"]
packages = [ packages = [
......
...@@ -30,11 +30,12 @@ def test_cache_clear_all( ...@@ -30,11 +30,12 @@ def test_cache_clear_all(
cache: CacheManager, cache: CacheManager,
): ):
exit_code = tester.execute(f"cache clear {repository_one} --all", inputs="yes") exit_code = tester.execute(f"cache clear {repository_one} --all", inputs="yes")
repository_one_dir = repository_cache_dir / repository_one
assert exit_code == 0 assert exit_code == 0
assert tester.io.fetch_output() == "" assert tester.io.fetch_output() == ""
# ensure directory is empty # ensure directory is empty or doesn't exist
assert not any((repository_cache_dir / repository_one).iterdir()) assert not repository_one_dir.exists() or not any(repository_one_dir.iterdir())
assert not cache.has("cachy:0.1") assert not cache.has("cachy:0.1")
assert not cache.has("cleo:0.2") assert not cache.has("cleo:0.2")
......
...@@ -8,6 +8,7 @@ from typing import TYPE_CHECKING ...@@ -8,6 +8,7 @@ from typing import TYPE_CHECKING
import pytest import pytest
from poetry.core.constraints.version import Version from poetry.core.constraints.version import Version
from poetry.core.packages.package import Package
from poetry.repositories.legacy_repository import LegacyRepository from poetry.repositories.legacy_repository import LegacyRepository
from tests.helpers import get_dependency from tests.helpers import get_dependency
...@@ -819,12 +820,26 @@ Package operations: 1 install, 0 updates, 0 removals ...@@ -819,12 +820,26 @@ Package operations: 1 install, 0 updates, 0 removals
def test_add_constraint_with_source( def test_add_constraint_with_source(
app: PoetryTestApplication, poetry: Poetry, tester: CommandTester app: PoetryTestApplication,
poetry: Poetry,
tester: CommandTester,
mocker: MockerFixture,
): ):
repo = LegacyRepository(name="my-index", url="https://my-index.fake") repo = LegacyRepository(name="my-index", url="https://my-index.fake")
repo.add_package(get_package("cachy", "0.2.0")) repo.add_package(get_package("cachy", "0.2.0"))
repo._cache.store("matches").put( mocker.patch.object(
"cachy:0.2.0", [(Version.parse("0.2.0"), False)], 5 repo,
"_find_packages",
wraps=lambda _, name: [
Package(
"cachy",
Version.parse("0.2.0"),
source_type="legacy",
source_reference=repo.name,
source_url=repo._url,
yanked=False,
)
],
) )
poetry.pool.add_repository(repo) poetry.pool.add_repository(repo)
...@@ -1809,11 +1824,23 @@ def test_add_constraint_with_source_old_installer( ...@@ -1809,11 +1824,23 @@ def test_add_constraint_with_source_old_installer(
poetry: Poetry, poetry: Poetry,
installer: NoopInstaller, installer: NoopInstaller,
old_tester: CommandTester, old_tester: CommandTester,
mocker: MockerFixture,
): ):
repo = LegacyRepository(name="my-index", url="https://my-index.fake") repo = LegacyRepository(name="my-index", url="https://my-index.fake")
repo.add_package(get_package("cachy", "0.2.0")) repo.add_package(get_package("cachy", "0.2.0"))
repo._cache.store("matches").put( mocker.patch.object(
"cachy:0.2.0", [(Version.parse("0.2.0"), False)], 5 repo,
"_find_packages",
wraps=lambda _, name: [
Package(
"cachy",
Version.parse("0.2.0"),
source_type="legacy",
source_reference=repo.name,
source_url=repo._url,
yanked=False,
)
],
) )
poetry.pool.add_repository(repo) poetry.pool.add_repository(repo)
......
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