From 92957a41e3f909c7b813b448f65cd437cf0139f2 Mon Sep 17 00:00:00 2001 From: Jonas Obrist Date: Wed, 25 Apr 2018 03:56:50 +0900 Subject: [PATCH] Make cache work with non-default line lenghts (#163) --- README.md | 6 +++--- black.py | 25 +++++++++++++++---------- tests/test_black.py | 44 ++++++++++++++++++++++++++++---------------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index e2f91ef..02cf2f9 100644 --- a/README.md +++ b/README.md @@ -458,9 +458,9 @@ location of the file depends on the black version and the system on which black is run. The file is non-portable. The standard location on common operating systems is: -* Windows: `C:\\Users\\AppData\Local\black\black\Cache\\cache.pickle` -* macOS: `/Users//Library/Caches/black//cache.pickle` -* Linux: `/home//.cache/black//cache.pickle` +* Windows: `C:\\Users\\AppData\Local\black\black\Cache\\cache..pickle` +* macOS: `/Users//Library/Caches/black//cache..pickle` +* Linux: `/home//.cache/black//cache..pickle` ## Testimonials diff --git a/black.py b/black.py index 11386d2..aeb7402 100644 --- a/black.py +++ b/black.py @@ -233,7 +233,7 @@ def reformat_one( else: cache: Cache = {} if write_back != WriteBack.DIFF: - cache = read_cache() + cache = read_cache(line_length) src = src.resolve() if src in cache and cache[src] == get_cache_info(src): changed = Changed.CACHED @@ -245,7 +245,7 @@ def reformat_one( ): changed = Changed.YES if write_back != WriteBack.DIFF and changed is not Changed.NO: - write_cache(cache, [src]) + write_cache(cache, [src], line_length) report.done(src, changed) except Exception as exc: report.failed(src, str(exc)) @@ -269,7 +269,7 @@ async def schedule_formatting( """ cache: Cache = {} if write_back != WriteBack.DIFF: - cache = read_cache() + cache = read_cache(line_length) sources, cached = filter_cached(cache, sources) for src in cached: report.done(src, Changed.CACHED) @@ -312,7 +312,7 @@ async def schedule_formatting( if cancelled: await asyncio.gather(*cancelled, loop=loop, return_exceptions=True) if write_back != WriteBack.DIFF and formatted: - write_cache(cache, formatted) + write_cache(cache, formatted, line_length) def format_file_in_place( @@ -2473,18 +2473,22 @@ def sub_twice(regex: Pattern[str], replacement: str, original: str) -> str: CACHE_DIR = Path(user_cache_dir("black", version=__version__)) -CACHE_FILE = CACHE_DIR / "cache.pickle" -def read_cache() -> Cache: +def get_cache_file(line_length: int) -> Path: + return CACHE_DIR / f"cache.{line_length}.pickle" + + +def read_cache(line_length: int) -> Cache: """Read the cache if it exists and is well formed. If it is not well formed, the call to write_cache later should resolve the issue. """ - if not CACHE_FILE.exists(): + cache_file = get_cache_file(line_length) + if not cache_file.exists(): return {} - with CACHE_FILE.open("rb") as fobj: + with cache_file.open("rb") as fobj: try: cache: Cache = pickle.load(fobj) except pickle.UnpicklingError: @@ -2517,13 +2521,14 @@ def filter_cached( return todo, done -def write_cache(cache: Cache, sources: List[Path]) -> None: +def write_cache(cache: Cache, sources: List[Path], line_length: int) -> None: """Update the cache file.""" + cache_file = get_cache_file(line_length) try: if not CACHE_DIR.exists(): CACHE_DIR.mkdir(parents=True) new_cache = {**cache, **{src.resolve(): get_cache_info(src) for src in sources}} - with CACHE_FILE.open("wb") as fobj: + with cache_file.open("wb") as fobj: pickle.dump(new_cache, fobj, protocol=pickle.HIGHEST_PROTOCOL) except OSError: pass diff --git a/tests/test_black.py b/tests/test_black.py index dd3beed..94cbe35 100644 --- a/tests/test_black.py +++ b/tests/test_black.py @@ -57,8 +57,7 @@ def cache_dir(exists: bool = True) -> Iterator[Path]: cache_dir = Path(workspace) if not exists: cache_dir = cache_dir / "new" - cache_file = cache_dir / "cache.pkl" - with patch("black.CACHE_DIR", cache_dir), patch("black.CACHE_FILE", cache_file): + with patch("black.CACHE_DIR", cache_dir): yield cache_dir @@ -492,15 +491,16 @@ class BlackTestCase(unittest.TestCase): def test_cache_broken_file(self) -> None: with cache_dir() as workspace: - with black.CACHE_FILE.open("w") as fobj: + cache_file = black.get_cache_file(black.DEFAULT_LINE_LENGTH) + with cache_file.open("w") as fobj: fobj.write("this is not a pickle") - self.assertEqual(black.read_cache(), {}) + self.assertEqual(black.read_cache(black.DEFAULT_LINE_LENGTH), {}) src = (workspace / "test.py").resolve() with src.open("w") as fobj: fobj.write("print('hello')") result = CliRunner().invoke(black.main, [str(src)]) self.assertEqual(result.exit_code, 0) - cache = black.read_cache() + cache = black.read_cache(black.DEFAULT_LINE_LENGTH) self.assertIn(src, cache) def test_cache_single_file_already_cached(self) -> None: @@ -508,7 +508,7 @@ class BlackTestCase(unittest.TestCase): src = (workspace / "test.py").resolve() with src.open("w") as fobj: fobj.write("print('hello')") - black.write_cache({}, [src]) + black.write_cache({}, [src], black.DEFAULT_LINE_LENGTH) result = CliRunner().invoke(black.main, [str(src)]) self.assertEqual(result.exit_code, 0) with src.open("r") as fobj: @@ -525,14 +525,14 @@ class BlackTestCase(unittest.TestCase): two = (workspace / "two.py").resolve() with two.open("w") as fobj: fobj.write("print('hello')") - black.write_cache({}, [one]) + black.write_cache({}, [one], black.DEFAULT_LINE_LENGTH) result = CliRunner().invoke(black.main, [str(workspace)]) self.assertEqual(result.exit_code, 0) with one.open("r") as fobj: self.assertEqual(fobj.read(), "print('hello')") with two.open("r") as fobj: self.assertEqual(fobj.read(), 'print("hello")\n') - cache = black.read_cache() + cache = black.read_cache(black.DEFAULT_LINE_LENGTH) self.assertIn(one, cache) self.assertIn(two, cache) @@ -543,24 +543,26 @@ class BlackTestCase(unittest.TestCase): fobj.write("print('hello')") result = CliRunner().invoke(black.main, [str(src), "--diff"]) self.assertEqual(result.exit_code, 0) - self.assertFalse(black.CACHE_FILE.exists()) + cache_file = black.get_cache_file(black.DEFAULT_LINE_LENGTH) + self.assertFalse(cache_file.exists()) def test_no_cache_when_stdin(self) -> None: with cache_dir(): result = CliRunner().invoke(black.main, ["-"], input="print('hello')") self.assertEqual(result.exit_code, 0) - self.assertFalse(black.CACHE_FILE.exists()) + cache_file = black.get_cache_file(black.DEFAULT_LINE_LENGTH) + self.assertFalse(cache_file.exists()) def test_read_cache_no_cachefile(self) -> None: with cache_dir(): - self.assertEqual(black.read_cache(), {}) + self.assertEqual(black.read_cache(black.DEFAULT_LINE_LENGTH), {}) def test_write_cache_read_cache(self) -> None: with cache_dir() as workspace: src = (workspace / "test.py").resolve() src.touch() - black.write_cache({}, [src]) - cache = black.read_cache() + black.write_cache({}, [src], black.DEFAULT_LINE_LENGTH) + cache = black.read_cache(black.DEFAULT_LINE_LENGTH) self.assertIn(src, cache) self.assertEqual(cache[src], black.get_cache_info(src)) @@ -583,7 +585,7 @@ class BlackTestCase(unittest.TestCase): def test_write_cache_creates_directory_if_needed(self) -> None: with cache_dir(exists=False) as workspace: self.assertFalse(workspace.exists()) - black.write_cache({}, []) + black.write_cache({}, [], black.DEFAULT_LINE_LENGTH) self.assertTrue(workspace.exists()) @event_loop(close=False) @@ -599,14 +601,14 @@ class BlackTestCase(unittest.TestCase): fobj.write('print("hello")\n') result = CliRunner().invoke(black.main, [str(workspace)]) self.assertEqual(result.exit_code, 123) - cache = black.read_cache() + cache = black.read_cache(black.DEFAULT_LINE_LENGTH) self.assertNotIn(failing, cache) self.assertIn(clean, cache) def test_write_cache_write_fail(self) -> None: with cache_dir(), patch.object(Path, "open") as mock: mock.side_effect = OSError - black.write_cache({}, []) + black.write_cache({}, [], black.DEFAULT_LINE_LENGTH) def test_check_diff_use_together(self) -> None: with cache_dir(): @@ -626,6 +628,16 @@ class BlackTestCase(unittest.TestCase): ) self.assertEqual(result.exit_code, 1) + def test_read_cache_line_lengths(self) -> None: + with cache_dir() as workspace: + path = (workspace / "file.py").resolve() + path.touch() + black.write_cache({}, [path], 1) + one = black.read_cache(1) + self.assertIn(path, one) + two = black.read_cache(2) + self.assertNotIn(path, two) + if __name__ == "__main__": unittest.main() -- 2.39.5