Files
notifications-admin/app/notify_client/cache.py
T

71 lines
2.0 KiB
Python
Raw Normal View History

2018-04-06 13:37:49 +01:00
import json
from contextlib import suppress
2018-04-06 13:37:49 +01:00
from datetime import timedelta
from functools import wraps
from inspect import signature
2018-04-06 13:37:49 +01:00
from app.extensions import redis_client
TTL = int(timedelta(days=7).total_seconds())
2018-04-06 13:37:49 +01:00
def _get_argument(argument_name, client_method, args, kwargs):
2018-04-06 13:37:49 +01:00
with suppress(KeyError):
return kwargs[argument_name]
2018-04-06 13:37:49 +01:00
2018-04-19 10:24:35 +01:00
with suppress(ValueError, IndexError):
argument_index = list(signature(client_method).parameters).index(argument_name)
return args[argument_index - 1] # -1 because `args` doesnt include `self`
2018-04-19 10:24:35 +01:00
with suppress(KeyError):
return signature(client_method).parameters[argument_name].default
raise TypeError("{}() takes no argument called '{}'".format(
client_method.__name__, argument_name
))
def _make_key(key_format, client_method, args, kwargs):
return key_format.format(**{
argument_name: _get_argument(argument_name, client_method, args, kwargs)
for argument_name in list(signature(client_method).parameters)
})
def set(key_format):
2018-04-06 13:37:49 +01:00
def _set(client_method):
@wraps(client_method)
def new_client_method(client_instance, *args, **kwargs):
redis_key = _make_key(key_format, client_method, args, kwargs)
cached = redis_client.get(redis_key)
2018-04-06 13:37:49 +01:00
if cached:
return json.loads(cached.decode('utf-8'))
api_response = client_method(client_instance, *args, **kwargs)
redis_client.set(
2018-04-06 13:37:49 +01:00
redis_key,
json.dumps(api_response),
ex=TTL,
)
return api_response
return new_client_method
return _set
def delete(key_format):
2018-04-06 13:37:49 +01:00
def _delete(client_method):
@wraps(client_method)
def new_client_method(client_instance, *args, **kwargs):
redis_key = _make_key(key_format, client_method, args, kwargs)
redis_client.delete(redis_key)
2018-04-06 13:37:49 +01:00
return client_method(client_instance, *args, **kwargs)
return new_client_method
return _delete