Skip to content

Commit 9ce0dd3

Browse files
committed
Ensure cache regions always have a default key length, fixes bbangert#71
1 parent 2201b0b commit 9ce0dd3

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

beaker/cache.py

+13-9
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@
3434
from beaker.cache import cache_regions
3535
cache_regions.update({
3636
'short_term':{
37-
'expire':'60',
37+
'expire':60,
3838
'type':'memory'
3939
},
4040
'long_term':{
41-
'expire':'1800',
41+
'expire':1800,
4242
'type':'dbm',
4343
'data_dir':'/tmp',
4444
}
@@ -130,7 +130,7 @@ def cache_region(region, *args):
130130
# configure regions
131131
cache_regions.update({
132132
'short_term':{
133-
'expire':'60',
133+
'expire':60,
134134
'type':'memory'
135135
}
136136
})
@@ -215,7 +215,7 @@ def region_invalidate(namespace, region, *args):
215215
# configure regions
216216
cache_regions.update({
217217
'short_term':{
218-
'expire':'60',
218+
'expire':60,
219219
'type':'memory'
220220
}
221221
})
@@ -256,7 +256,9 @@ def invalidate_search(self, search_term, limit, offset):
256256
region = cache_regions[region]
257257

258258
cache = Cache._get_cache(namespace, region)
259-
_cache_decorator_invalidate(cache, region['key_length'], args)
259+
_cache_decorator_invalidate(cache,
260+
region.get('key_length', util.DEFAULT_CACHE_KEY_LENGTH),
261+
args)
260262

261263

262264
class Cache(object):
@@ -518,9 +520,10 @@ def load(search_term, limit, offset):
518520

519521
cache = self.get_cache(namespace, **kwargs)
520522
if hasattr(func, '_arg_region'):
521-
key_length = cache_regions[func._arg_region]['key_length']
523+
cachereg = cache_regions[func._arg_region]
524+
key_length = cachereg.get('key_length', util.DEFAULT_CACHE_KEY_LENGTH)
522525
else:
523-
key_length = kwargs.pop('key_length', 250)
526+
key_length = kwargs.pop('key_length', util.DEFAULT_CACHE_KEY_LENGTH)
524527
_cache_decorator_invalidate(cache, key_length, args)
525528

526529

@@ -560,9 +563,10 @@ def cached(*args):
560563
except UnicodeEncodeError:
561564
cache_key = " ".join(map(unicode, deco_args + args))
562565
if region:
563-
key_length = cache_regions[region]['key_length']
566+
cachereg = cache_regions[region]
567+
key_length = cachereg.get('key_length', util.DEFAULT_CACHE_KEY_LENGTH)
564568
else:
565-
key_length = kwargs.pop('key_length', 250)
569+
key_length = kwargs.pop('key_length', util.DEFAULT_CACHE_KEY_LENGTH)
566570
if len(cache_key) + len(namespace) > int(key_length):
567571
if util.py3k:
568572
cache_key = cache_key.encode('utf-8')

beaker/util.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from beaker import exceptions
3131
from threading import local as _tlocal
3232

33+
DEFAULT_CACHE_KEY_LENGTH = 250
3334

3435
__all__ = ["ThreadLocal", "WeakValuedRegistry", "SyncDict", "encoded_path",
3536
"verify_directory"]
@@ -423,7 +424,7 @@ def parse_cache_config_options(config, include_defaults=True):
423424
type=options.get('type'),
424425
enabled=options['enabled'],
425426
expire=options.get('expire'),
426-
key_length=options.get('key_length', 250))
427+
key_length=options.get('key_length', DEFAULT_CACHE_KEY_LENGTH))
427428
region_prefix = '%s.' % region
428429
region_len = len(region_prefix)
429430
for key in options.keys():

tests/test_cachemanager.py

+32-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import time
22
from datetime import datetime
33

4-
from beaker.cache import CacheManager
4+
from beaker.cache import CacheManager, cache_regions
55
from beaker.util import parse_cache_config_options
66

77
defaults = {'cache.data_dir':'./cache', 'cache.type':'dbm', 'cache.expire': 2}
@@ -130,3 +130,34 @@ def test_long_name():
130130
_cache_obj.invalidate(func, 'loader', name)
131131
result4 = func(name)
132132
assert result3 != result4
133+
134+
135+
def test_cache_region_has_default_key_length():
136+
try:
137+
cache = CacheManager(cache_regions={
138+
'short_term_without_key_length':{
139+
'expire': 60,
140+
'type': 'memory'
141+
}
142+
})
143+
144+
# Check CacheManager registered the region in global regions
145+
assert 'short_term_without_key_length' in cache_regions
146+
147+
@cache.region('short_term_without_key_length')
148+
def load(person):
149+
now = datetime.now()
150+
return "Hi there %s, its currently %s" % (person, now)
151+
152+
# Ensure that same person gets same time
153+
msg = load('fred')
154+
msg2 = load('fred')
155+
assert msg == msg2, (msg, msg2)
156+
157+
# Ensure that different person gets different time
158+
msg3 = load('george')
159+
assert msg3.split(',')[-1] != msg2.split(',')[-1]
160+
161+
finally:
162+
# throw away region for this test
163+
cache_regions.pop('short_term_without_key_length', None)

0 commit comments

Comments
 (0)