diff --git a/news/7350.feature b/news/7350.feature new file mode 100644 index 00000000000..1b57d7b1907 --- /dev/null +++ b/news/7350.feature @@ -0,0 +1 @@ +Add ``pip cache dir`` to show the cache directory. diff --git a/src/pip/_internal/commands/cache.py b/src/pip/_internal/commands/cache.py index 7e3f72e080b..0625adb0fe7 100644 --- a/src/pip/_internal/commands/cache.py +++ b/src/pip/_internal/commands/cache.py @@ -24,6 +24,7 @@ class CacheCommand(Command): Subcommands: + dir: Show the cache directory. info: Show information about the cache. list: List filenames of packages stored in the cache. remove: Remove one or more package from the cache. @@ -33,6 +34,7 @@ class CacheCommand(Command): """ usage = """ + %prog dir %prog info %prog list [] %prog remove @@ -42,6 +44,7 @@ class CacheCommand(Command): def run(self, options, args): # type: (Values, List[Any]) -> int handlers = { + "dir": self.get_cache_dir, "info": self.get_cache_info, "list": self.list_cache_items, "remove": self.remove_cache_items, @@ -66,6 +69,13 @@ def run(self, options, args): return SUCCESS + def get_cache_dir(self, options, args): + # type: (Values, List[Any]) -> None + if args: + raise CommandError('Too many arguments') + + logger.info(options.cache_dir) + def get_cache_info(self, options, args): # type: (Values, List[Any]) -> None if args: diff --git a/tests/functional/test_cache.py b/tests/functional/test_cache.py index a464ece7945..d359137d904 100644 --- a/tests/functional/test_cache.py +++ b/tests/functional/test_cache.py @@ -95,6 +95,22 @@ def _remove_matches_wheel(wheel_name, result): return _remove_matches_wheel +def test_cache_dir(script, cache_dir): + result = script.pip('cache', 'dir') + + assert os.path.normcase(cache_dir) == result.stdout.strip() + + +def test_cache_dir_too_many_args(script, cache_dir): + result = script.pip('cache', 'dir', 'aaa', expect_error=True) + + assert result.stdout == '' + + # This would be `result.stderr == ...`, but pip prints deprecation + # warnings on Python 2.7, so we check if the _line_ is in stderr. + assert 'ERROR: Too many arguments' in result.stderr.splitlines() + + @pytest.mark.usefixtures("populate_wheel_cache") def test_cache_info(script, wheel_cache_dir, wheel_cache_files): result = script.pip('cache', 'info') @@ -209,7 +225,7 @@ def test_cache_purge_too_many_args(script, wheel_cache_files): expect_error=True) assert result.stdout == '' - # This would be `result.stderr == ...`, but Pip prints deprecation + # This would be `result.stderr == ...`, but pip prints deprecation # warnings on Python 2.7, so we check if the _line_ is in stderr. assert 'ERROR: Too many arguments' in result.stderr.splitlines()