Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def __init__(self, *, redis=None, key=None, keys=tuple(),
num_tries=_NUM_TRIES):
self._num_tries = num_tries
partial = functools.partial(RedisDict, redis=redis, key=key)
self._cache = self._retry(partial)
self._misses = set()
items = []
for key_ in keys:
try:
item = (key_, self._cache[key_])
except KeyError:
item = (key_, self._SENTINEL)
self._misses.add(key_)
items.append(item)
return super().__init__(items)
# --------------------------------------------------------------------------- #
# counter.py #
# #
# Copyright © 2015-2020, Rajiv Bakulesh Shah, original author. #
# All rights reserved. #
# --------------------------------------------------------------------------- #
import collections
import contextlib
import itertools
from .dict import RedisDict
class RedisCounter(RedisDict, collections.Counter):
'Redis-backed container compatible with collections.Counter.'
# Method overrides:
def _populate(self, iterable=tuple(), *, sign=+1, **kwargs):
to_set = {}
try:
for key, value in iterable.items():
to_set[key] = sign * value
except AttributeError:
for key in iterable:
to_set[key] = to_set.get(key, self[key]) + sign
for key, value in kwargs.items():
original = self[key] if to_set.get(key, 0) == 0 else to_set[key]
to_set[key] = original + sign * value
to_set = {key: self[key] + value for key, value in to_set.items()}
def decorator(func):
nonlocal redis, key
redis = Redis(socket_timeout=1) if redis is None else redis
if key is None: # pragma: no cover
key = random_key(redis=redis)
_logger.info(
"Self-assigning key redis_cache(key='%s') for function %s",
key,
func.__qualname__,
)
cache = RedisDict(redis=redis, key=key)
hits, misses = 0, 0
@functools.wraps(func)
def wrapper(*args, **kwargs):
nonlocal hits, misses
hash_ = _arg_hash(*args, **kwargs)
try:
return_value = cache[hash_]
hits += 1
except KeyError:
return_value = func(*args, **kwargs)
cache[hash_] = return_value
misses += 1
if timeout:
redis.expire(key, timeout)
return return_value