src/cm/utils/cache.py
author gibus
Wed, 11 Sep 2013 23:13:01 +0200
changeset 532 0bad3613f59d
parent 349 8d1ce1bda109
permissions -rw-r--r--
Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
from django.core.cache import cache
261
b60ab54b6782 fix usage of dj caching
raph
parents: 0
diff changeset
     2
from hashlib import sha1
349
8d1ce1bda109 workspace in parameter for memoize
Production Moz <dev@sopinspace.com>
parents: 261
diff changeset
     3
from django.conf import settings
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
# adapted [to django] from http://code.activestate.com/recipes/325205/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
def dj_memoize(f):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
    def g(*args, **kwargs):
349
8d1ce1bda109 workspace in parameter for memoize
Production Moz <dev@sopinspace.com>
parents: 261
diff changeset
     8
        key = sha1( str((settings.SITE_URL, f.__name__, f, tuple(args), frozenset(kwargs.items())) )).hexdigest()
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
        val = cache.get(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
        if not val:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
            val = f(*args, **kwargs)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
            cache.set(key,val)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
        return val
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
    return g
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
# adapted from http://code.activestate.com/recipes/496879/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
# decorator with LRU policy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
# changed : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
#  - default limit is 100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
#  - store sha1 of key (shorter) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
import cPickle, hashlib
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
def memoize(function, limit=100):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
    if isinstance(function, int):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
        def memoize_wrapper(f):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
            return memoize(f, function)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
        return memoize_wrapper
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    dict = {}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
    list = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
    def memoize_wrapper(*args, **kwargs):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
        key = hashlib.sha1(cPickle.dumps((args, kwargs))).digest()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
        try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
            list.append(list.pop(list.index(key)))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
        except ValueError:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
            dict[key] = function(*args, **kwargs)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
            list.append(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
            if limit is not None and len(list) > limit:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
                del dict[list.pop(0)]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        return dict[key]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    memoize_wrapper._memoize_dict = dict
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
    memoize_wrapper._memoize_list = list
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
    memoize_wrapper._memoize_limit = limit
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
    memoize_wrapper._memoize_origfunc = function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
    memoize_wrapper.func_name = function.func_name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
    return memoize_wrapper