Exemplo n.º 1
0
    def run_decorated(self, func, *args, **kwargs):
        if self.key:
            key = make_key(self.key)
        else:
            key = make_key(repr(func), repr(args), repr(kwargs))
        group_keys = map(make_key, self.group_keys)
        cache = self.cache
        value = None
        evaluate = False
        if group_keys:
            data = cache.get_multi(group_keys + [key])
            data_dict = data.get(key)
            if (not data) or (not data_dict):
                evaluate = True
            if data_dict:
                value = data_dict['value']
                for group_key in group_keys:
                    if group_key not in data or group_key not in data_dict or data[group_key] != data_dict[group_key]:
                        evaluate = True
                    if group_key in data and not data[group_key]:
                        del data[group_key]
                        evaluate = True
        else:
            value = cache.get(key)
            if not value:
                evaluate = True
            if isinstance(value, dict) and 'is_multigroup' in value:
                evaluate = True

        if evaluate:
            value = func(*args, **kwargs)
            if not group_keys:
                cache.set(key, value)
            else:
                group_dict = {}
                for group_key in group_keys:
                    if group_key not in data:
                        group_dict[group_key] = make_group_value(group_key)
                    else:
                        group_dict[group_key] = data[group_key]
                data_dict = {}
                data_dict['value'] = value
                data_dict['is_multigroup'] = True
                data_dict.update(group_dict)
                group_dict[key] = data_dict
                cache.set_multi(group_dict)
        return value
Exemplo n.º 2
0
 def expire_key(self, key):
     self.cache.set(make_key(key), None)