| Index: client/third_party/cachetools/keys.py
|
| diff --git a/client/third_party/cachetools/keys.py b/client/third_party/cachetools/keys.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ba1e2fc2bee6d9b06096513d3bea6ec00d82bcc1
|
| --- /dev/null
|
| +++ b/client/third_party/cachetools/keys.py
|
| @@ -0,0 +1,42 @@
|
| +"""Key functions for memoizing decorators."""
|
| +
|
| +from __future__ import absolute_import
|
| +
|
| +__all__ = ('hashkey', 'typedkey')
|
| +
|
| +
|
| +class _HashedTuple(tuple):
|
| +
|
| + __hashvalue = None
|
| +
|
| + def __hash__(self, hash=tuple.__hash__):
|
| + hashvalue = self.__hashvalue
|
| + if hashvalue is None:
|
| + self.__hashvalue = hashvalue = hash(self)
|
| + return hashvalue
|
| +
|
| + def __add__(self, other, add=tuple.__add__):
|
| + return _HashedTuple(add(self, other))
|
| +
|
| + def __radd__(self, other, add=tuple.__add__):
|
| + return _HashedTuple(add(other, self))
|
| +
|
| +_kwmark = (object(),)
|
| +
|
| +
|
| +def hashkey(*args, **kwargs):
|
| + """Return a cache key for the specified hashable arguments."""
|
| +
|
| + if kwargs:
|
| + return _HashedTuple(args + sum(sorted(kwargs.items()), _kwmark))
|
| + else:
|
| + return _HashedTuple(args)
|
| +
|
| +
|
| +def typedkey(*args, **kwargs):
|
| + """Return a typed cache key for the specified hashable arguments."""
|
| +
|
| + key = hashkey(*args, **kwargs)
|
| + key += tuple(type(v) for v in args)
|
| + key += tuple(type(v) for _, v in sorted(kwargs.items()))
|
| + return key
|
|
|