mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-07 05:14:29 +08:00
Make sure to limit the amount of cached files parso stores, fixes davidhalter/jedi#1340
This commit is contained in:
@@ -5,12 +5,14 @@ Test all things related to the ``jedi.cache`` module.
|
||||
from os import unlink
|
||||
|
||||
import pytest
|
||||
import time
|
||||
|
||||
from parso.cache import _NodeCacheItem, save_module, load_module, \
|
||||
_get_hashed_path, parser_cache, _load_from_file_system, _save_to_file_system
|
||||
from parso import load_grammar
|
||||
from parso import cache
|
||||
from parso import file_io
|
||||
from parso import parse
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
@@ -87,3 +89,53 @@ def test_modulepickling_simulate_deleted_cache(tmpdir):
|
||||
|
||||
cached2 = load_module(grammar._hashed, io)
|
||||
assert cached2 is None
|
||||
|
||||
|
||||
def test_cache_limit():
|
||||
def cache_size():
|
||||
return sum(len(v) for v in parser_cache.values())
|
||||
|
||||
try:
|
||||
parser_cache.clear()
|
||||
future_node_cache_item = _NodeCacheItem('bla', [], change_time=time.time() + 10e6)
|
||||
old_node_cache_item = _NodeCacheItem('bla', [], change_time=time.time() - 10e4)
|
||||
parser_cache['some_hash_old'] = {
|
||||
'/path/%s' % i: old_node_cache_item for i in range(300)
|
||||
}
|
||||
parser_cache['some_hash_new'] = {
|
||||
'/path/%s' % i: future_node_cache_item for i in range(300)
|
||||
}
|
||||
assert cache_size() == 600
|
||||
parse('somecode', cache=True, path='/path/somepath')
|
||||
assert cache_size() == 301
|
||||
finally:
|
||||
parser_cache.clear()
|
||||
|
||||
|
||||
class _FixedTimeFileIO(file_io.KnownContentFileIO):
|
||||
def __init__(self, path, content, last_modified):
|
||||
super(_FixedTimeFileIO, self).__init__(path, content)
|
||||
self._last_modified = last_modified
|
||||
|
||||
def get_last_modified(self):
|
||||
return self._last_modified
|
||||
|
||||
|
||||
@pytest.mark.parametrize('diff_cache', [False, True])
|
||||
@pytest.mark.parametrize('use_file_io', [False, True])
|
||||
def test_cache_last_used_update(diff_cache, use_file_io):
|
||||
p = '/path/last-used'
|
||||
parser_cache.clear() # Clear, because then it's easier to find stuff.
|
||||
parse('somecode', cache=True, path=p)
|
||||
node_cache_item = next(iter(parser_cache.values()))[p]
|
||||
now = time.time()
|
||||
assert node_cache_item.last_used < now
|
||||
|
||||
if use_file_io:
|
||||
f = _FixedTimeFileIO(p, 'code', node_cache_item.last_used - 10)
|
||||
parse(file_io=f, cache=True, diff_cache=diff_cache)
|
||||
else:
|
||||
parse('somecode2', cache=True, path=p, diff_cache=diff_cache)
|
||||
|
||||
node_cache_item = next(iter(parser_cache.values()))[p]
|
||||
assert now < node_cache_item.last_used < time.time()
|
||||
|
||||
Reference in New Issue
Block a user