Skip to content

Commit

Permalink
Add cache list command (#1187)
Browse files Browse the repository at this point in the history
* Add poetry.locations.REPOSITORY_CACHE_DIR

The repository cache directory is used in multiple places in the
codebase. This change ensures that the value is reused.

* Add cache list command

This introduces a new cache sub-command that lists all available
caches.

Relates-to: #1162
  • Loading branch information
abn authored Mar 8, 2020
1 parent 9e3f606 commit 54701a1
Show file tree
Hide file tree
Showing 8 changed files with 106 additions and 10 deletions.
12 changes: 12 additions & 0 deletions docs/docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```
4 changes: 3 additions & 1 deletion poetry/console/commands/cache/cache.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from poetry.console.commands.cache.list import CacheListCommand

from ..command import Command
from .clear import CacheClearCommand

Expand All @@ -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)
8 changes: 3 additions & 5 deletions poetry/console/commands/cache/clear.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down
21 changes: 21 additions & 0 deletions poetry/console/commands/cache/list.py
Original file line number Diff line number Diff line change
@@ -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("<info>{}</>".format(cache.name))
return 0

self.line("<warning>No caches found</>")
3 changes: 3 additions & 0 deletions poetry/locations.py
Original file line number Diff line number Diff line change
@@ -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"
4 changes: 2 additions & 2 deletions poetry/repositories/legacy_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions poetry/repositories/pypi_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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",
Expand Down
60 changes: 60 additions & 0 deletions tests/console/commands/test_cache.py
Original file line number Diff line number Diff line change
@@ -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()

0 comments on commit 54701a1

Please sign in to comment.