diff --git a/docs/docs/cli.md b/docs/docs/cli.md index 89d19a8cc18..63d63fbc990 100644 --- a/docs/docs/cli.md +++ b/docs/docs/cli.md @@ -452,3 +452,15 @@ The `env` command regroups sub commands to interact with the virtualenvs associated with a specific project. See [Managing environments](./managing-environments.md) for more information about these commands. + +## cache + +The `cache` command regroups sub commands to interact with Poetry's cache. + +### cache list + +The `cache list` command lists Poetry's available caches. + +```bash +poetry cache list +``` diff --git a/poetry/console/commands/cache/cache.py b/poetry/console/commands/cache/cache.py index 469eb56be05..695e27e0af7 100644 --- a/poetry/console/commands/cache/cache.py +++ b/poetry/console/commands/cache/cache.py @@ -1,3 +1,5 @@ +from poetry.console.commands.cache.list import CacheListCommand + from ..command import Command from .clear import CacheClearCommand @@ -7,7 +9,7 @@ class CacheCommand(Command): name = "cache" description = "Interact with Poetry's cache" - commands = [CacheClearCommand()] + commands = [CacheClearCommand(), CacheListCommand()] def handle(self): return self.call("help", self._config.name) diff --git a/poetry/console/commands/cache/clear.py b/poetry/console/commands/cache/clear.py index 347f534afc0..c46dab01281 100644 --- a/poetry/console/commands/cache/clear.py +++ b/poetry/console/commands/cache/clear.py @@ -16,19 +16,17 @@ class CacheClearCommand(Command): def handle(self): from cachy import CacheManager - from poetry.locations import CACHE_DIR - from poetry.utils._compat import Path + from poetry.locations import REPOSITORY_CACHE_DIR cache = self.argument("cache") parts = cache.split(":") root = parts[0] - base_cache = Path(CACHE_DIR) / "cache" / "repositories" - cache_dir = base_cache / root + cache_dir = REPOSITORY_CACHE_DIR / root try: - cache_dir.relative_to(base_cache) + cache_dir.relative_to(REPOSITORY_CACHE_DIR) except ValueError: raise ValueError("{} is not a valid repository cache".format(root)) diff --git a/poetry/console/commands/cache/list.py b/poetry/console/commands/cache/list.py new file mode 100644 index 00000000000..6a030fa2eba --- /dev/null +++ b/poetry/console/commands/cache/list.py @@ -0,0 +1,21 @@ +import os + +from ..command import Command + + +class CacheListCommand(Command): + + name = "list" + description = "List Poetry's caches." + + def handle(self): + from poetry.locations import REPOSITORY_CACHE_DIR + + if os.path.exists(str(REPOSITORY_CACHE_DIR)): + caches = list(sorted(REPOSITORY_CACHE_DIR.iterdir())) + if caches: + for cache in caches: + self.line("{}".format(cache.name)) + return 0 + + self.line("No caches found") diff --git a/poetry/locations.py b/poetry/locations.py index 17fb4d42a99..003950d500d 100644 --- a/poetry/locations.py +++ b/poetry/locations.py @@ -1,6 +1,9 @@ +from .utils._compat import Path from .utils.appdirs import user_cache_dir from .utils.appdirs import user_config_dir CACHE_DIR = user_cache_dir("pypoetry") CONFIG_DIR = user_config_dir("pypoetry") + +REPOSITORY_CACHE_DIR = Path(CACHE_DIR) / "cache" / "repositories" diff --git a/poetry/repositories/legacy_repository.py b/poetry/repositories/legacy_repository.py index 56748911fe1..b228fc78764 100644 --- a/poetry/repositories/legacy_repository.py +++ b/poetry/repositories/legacy_repository.py @@ -15,7 +15,7 @@ import poetry.packages -from poetry.locations import CACHE_DIR +from poetry.locations import REPOSITORY_CACHE_DIR from poetry.packages import Package from poetry.packages import dependency_from_pep_508 from poetry.packages.utils.link import Link @@ -174,7 +174,7 @@ def __init__( self._client_cert = client_cert self._cert = cert self._inspector = Inspector() - self._cache_dir = Path(CACHE_DIR) / "cache" / "repositories" / name + self._cache_dir = REPOSITORY_CACHE_DIR / name self._cache = CacheManager( { "default": "releases", diff --git a/poetry/repositories/pypi_repository.py b/poetry/repositories/pypi_repository.py index cdfaf84cebd..9410f124299 100644 --- a/poetry/repositories/pypi_repository.py +++ b/poetry/repositories/pypi_repository.py @@ -15,7 +15,7 @@ from requests import session from requests.exceptions import TooManyRedirects -from poetry.locations import CACHE_DIR +from poetry.locations import REPOSITORY_CACHE_DIR from poetry.packages import Package from poetry.packages import dependency_from_pep_508 from poetry.packages.utils.link import Link @@ -55,7 +55,7 @@ def __init__(self, url="https://pypi.org/", disable_cache=False, fallback=True): self._disable_cache = disable_cache self._fallback = fallback - release_cache_dir = Path(CACHE_DIR) / "cache" / "repositories" / "pypi" + release_cache_dir = REPOSITORY_CACHE_DIR / "pypi" self._cache = CacheManager( { "default": "releases", diff --git a/tests/console/commands/test_cache.py b/tests/console/commands/test_cache.py new file mode 100644 index 00000000000..8a22eee7f1b --- /dev/null +++ b/tests/console/commands/test_cache.py @@ -0,0 +1,60 @@ +import uuid + +import pytest + +from cleo.testers import CommandTester + + +@pytest.fixture +def repository_cache_dir(monkeypatch, tmpdir): + import poetry.locations + from poetry.utils._compat import Path + + path = Path(str(tmpdir)) + monkeypatch.setattr(poetry.locations, "REPOSITORY_CACHE_DIR", path) + return path + + +@pytest.fixture +def repository_one(): + return "01_{}".format(uuid.uuid4()) + + +@pytest.fixture +def repository_two(): + return "02_{}".format(uuid.uuid4()) + + +@pytest.fixture +def mock_caches(repository_cache_dir, repository_one, repository_two): + (repository_cache_dir / repository_one).mkdir() + (repository_cache_dir / repository_two).mkdir() + + +def test_cache_list(app, mock_caches, repository_one, repository_two): + command = app.find("cache list") + tester = CommandTester(command) + + tester.execute() + + expected = """\ +{} +{} +""".format( + repository_one, repository_two + ) + + assert expected == tester.io.fetch_output() + + +def test_cache_list_empty(app, repository_cache_dir): + command = app.find("cache list") + tester = CommandTester(command) + + tester.execute() + + expected = """\ +No caches found +""" + + assert expected == tester.io.fetch_output()