Ensure cache supporting files still exist after --cache-clear

Fix #6290
This commit is contained in:
Bruno Oliveira 2019-11-30 12:11:29 -03:00
parent 277857b026
commit 172b82875a
3 changed files with 22 additions and 7 deletions

View File

@ -0,0 +1 @@
The supporting files in the ``.pytest_cache`` directory are kept with ``--cache-clear``, which only clears cached values now.

View File

@ -44,14 +44,27 @@ class Cache:
_cachedir = attr.ib(repr=False) _cachedir = attr.ib(repr=False)
_config = attr.ib(repr=False) _config = attr.ib(repr=False)
# sub-directory under cache-dir for directories created by "makedir"
_CACHE_PREFIX_DIRS = "d"
# sub-directory under cache-dir for values created by "set"
_CACHE_PREFIX_VALUES = "v"
@classmethod @classmethod
def for_config(cls, config): def for_config(cls, config):
cachedir = cls.cache_dir_from_config(config) cachedir = cls.cache_dir_from_config(config)
if config.getoption("cacheclear") and cachedir.exists(): if config.getoption("cacheclear") and cachedir.is_dir():
rm_rf(cachedir) cls.clear_cache(cachedir)
cachedir.mkdir()
return cls(cachedir, config) return cls(cachedir, config)
@classmethod
def clear_cache(cls, cachedir: Path):
"""Clears the sub-directories used to hold cached directories and values."""
for prefix in (cls._CACHE_PREFIX_DIRS, cls._CACHE_PREFIX_VALUES):
d = cachedir / prefix
if d.is_dir():
rm_rf(d)
@staticmethod @staticmethod
def cache_dir_from_config(config): def cache_dir_from_config(config):
return resolve_from_str(config.getini("cache_dir"), config.rootdir) return resolve_from_str(config.getini("cache_dir"), config.rootdir)
@ -79,12 +92,12 @@ class Cache:
name = Path(name) name = Path(name)
if len(name.parts) > 1: if len(name.parts) > 1:
raise ValueError("name is not allowed to contain path separators") raise ValueError("name is not allowed to contain path separators")
res = self._cachedir.joinpath("d", name) res = self._cachedir.joinpath(self._CACHE_PREFIX_DIRS, name)
res.mkdir(exist_ok=True, parents=True) res.mkdir(exist_ok=True, parents=True)
return py.path.local(res) return py.path.local(res)
def _getvaluepath(self, key): def _getvaluepath(self, key):
return self._cachedir.joinpath("v", Path(key)) return self._cachedir.joinpath(self._CACHE_PREFIX_VALUES, Path(key))
def get(self, key, default): def get(self, key, default):
""" return cached value for the given key. If no value """ return cached value for the given key. If no value
@ -417,7 +430,7 @@ def cacheshow(config, session):
dummy = object() dummy = object()
basedir = config.cache._cachedir basedir = config.cache._cachedir
vdir = basedir / "v" vdir = basedir / Cache._CACHE_PREFIX_VALUES
tw.sep("-", "cache values for %r" % glob) tw.sep("-", "cache values for %r" % glob)
for valpath in sorted(x for x in vdir.rglob(glob) if x.is_file()): for valpath in sorted(x for x in vdir.rglob(glob) if x.is_file()):
key = valpath.relative_to(vdir) key = valpath.relative_to(vdir)
@ -429,7 +442,7 @@ def cacheshow(config, session):
for line in pformat(val).splitlines(): for line in pformat(val).splitlines():
tw.line(" " + line) tw.line(" " + line)
ddir = basedir / "d" ddir = basedir / Cache._CACHE_PREFIX_DIRS
if ddir.is_dir(): if ddir.is_dir():
contents = sorted(ddir.rglob(glob)) contents = sorted(ddir.rglob(glob))
tw.sep("-", "cache directories for %r" % glob) tw.sep("-", "cache directories for %r" % glob)

View File

@ -270,6 +270,7 @@ class TestLastFailed:
) )
result = testdir.runpytest(str(p), "--lf", "--cache-clear") result = testdir.runpytest(str(p), "--lf", "--cache-clear")
result.stdout.fnmatch_lines(["*1 failed*2 passed*"]) result.stdout.fnmatch_lines(["*1 failed*2 passed*"])
assert testdir.tmpdir.join(".pytest_cache", "README.md").isfile()
# Run this again to make sure clear-cache is robust # Run this again to make sure clear-cache is robust
if os.path.isdir(".pytest_cache"): if os.path.isdir(".pytest_cache"):