diff --git a/api/advent22_api/core/dav/dec.py b/api/advent22_api/core/dav/dec.py index 116122c..a9e79fa 100644 --- a/api/advent22_api/core/dav/dec.py +++ b/api/advent22_api/core/dav/dec.py @@ -74,30 +74,25 @@ def args_slice(func: Callable[P, R], *args: Iterable) -> tuple: return tuple(*args) +def cache_key(func: Callable[P, R], *args: P.args, **kwargs: P.kwargs) -> str: + """Return a cache key for use with cached methods.""" + + kwargs_by_key = sorted(kwargs.items(), key=lambda kv: kv[0]) + + parts = chain( + (qualified_name(func),), + # positional args + (repr(arg) for arg in args_slice(func, args)), + # keyword args + (f"{k}={v!r}" for k, v in kwargs_by_key), + ) + + return ":".join(parts) + + def redis_cached(cfg: Config) -> Callable[[Callable[P, R]], Callable[P, R]]: """ """ - def cache_key(func: Callable[P, R], *args: P.args, **kwargs: P.kwargs) -> str: - """Return a cache key for use with cached methods.""" - - kwargs_by_key = sorted(kwargs.items(), key=lambda kv: kv[0]) - - parts = chain( - (qualified_name(func),), - # positional args - (repr(arg) for arg in args_slice(func, args)), - # keyword args - (f"{k}={v!r}" for k, v in kwargs_by_key), - ) - - if cfg.prefix is not None: - parts = chain( - (cfg.prefix,), - parts, - ) - - return ":".join(parts) - def decorator(func: Callable[P, R]) -> Callable[P, R]: """ """ @@ -105,6 +100,9 @@ def redis_cached(cfg: Config) -> Callable[[Callable[P, R]], Callable[P, R]]: def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: key = cache_key(func, *args, **kwargs) + if cfg.prefix is not None: + key = f"{cfg.prefix}:{key}" + # pre-hook result = func(*args, **kwargs) # post-hook