Index: third_party/google-endpoints/dogpile/cache/util.py |
diff --git a/third_party/google-endpoints/dogpile/cache/util.py b/third_party/google-endpoints/dogpile/cache/util.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4b56f64298ec4324a89b881e0392f36f7fc2b534 |
--- /dev/null |
+++ b/third_party/google-endpoints/dogpile/cache/util.py |
@@ -0,0 +1,146 @@ |
+from hashlib import sha1 |
+import inspect |
+from ..util import compat |
+from ..util import langhelpers |
+ |
+ |
+def function_key_generator(namespace, fn, to_str=compat.string_type): |
+ """Return a function that generates a string |
+ key, based on a given function as well as |
+ arguments to the returned function itself. |
+ |
+ This is used by :meth:`.CacheRegion.cache_on_arguments` |
+ to generate a cache key from a decorated function. |
+ |
+ An alternate function may be used by specifying |
+ the :paramref:`.CacheRegion.function_key_generator` argument |
+ for :class:`.CacheRegion`. |
+ |
+ .. seealso:: |
+ |
+ :func:`.kwarg_function_key_generator` - similar function that also |
+ takes keyword arguments into account |
+ |
+ """ |
+ |
+ if namespace is None: |
+ namespace = '%s:%s' % (fn.__module__, fn.__name__) |
+ else: |
+ namespace = '%s:%s|%s' % (fn.__module__, fn.__name__, namespace) |
+ |
+ args = inspect.getargspec(fn) |
+ has_self = args[0] and args[0][0] in ('self', 'cls') |
+ |
+ def generate_key(*args, **kw): |
+ if kw: |
+ raise ValueError( |
+ "dogpile.cache's default key creation " |
+ "function does not accept keyword arguments.") |
+ if has_self: |
+ args = args[1:] |
+ |
+ return namespace + "|" + " ".join(map(to_str, args)) |
+ return generate_key |
+ |
+ |
+def function_multi_key_generator(namespace, fn, to_str=compat.string_type): |
+ |
+ if namespace is None: |
+ namespace = '%s:%s' % (fn.__module__, fn.__name__) |
+ else: |
+ namespace = '%s:%s|%s' % (fn.__module__, fn.__name__, namespace) |
+ |
+ args = inspect.getargspec(fn) |
+ has_self = args[0] and args[0][0] in ('self', 'cls') |
+ |
+ def generate_keys(*args, **kw): |
+ if kw: |
+ raise ValueError( |
+ "dogpile.cache's default key creation " |
+ "function does not accept keyword arguments.") |
+ if has_self: |
+ args = args[1:] |
+ return [namespace + "|" + key for key in map(to_str, args)] |
+ return generate_keys |
+ |
+ |
+def kwarg_function_key_generator(namespace, fn, to_str=compat.string_type): |
+ """Return a function that generates a string |
+ key, based on a given function as well as |
+ arguments to the returned function itself. |
+ |
+ For kwargs passed in, we will build a dict of |
+ all argname (key) argvalue (values) including |
+ default args from the argspec and then |
+ alphabetize the list before generating the |
+ key. |
+ |
+ .. versionadded:: 0.6.2 |
+ |
+ .. seealso:: |
+ |
+ :func:`.function_key_generator` - default key generation function |
+ |
+ """ |
+ |
+ if namespace is None: |
+ namespace = '%s:%s' % (fn.__module__, fn.__name__) |
+ else: |
+ namespace = '%s:%s|%s' % (fn.__module__, fn.__name__, namespace) |
+ |
+ argspec = inspect.getargspec(fn) |
+ default_list = list(argspec.defaults or []) |
+ # Reverse the list, as we want to compare the argspec by negative index, |
+ # meaning default_list[0] should be args[-1], which works well with |
+ # enumerate() |
+ default_list.reverse() |
+ # use idx*-1 to create the correct right-lookup index. |
+ args_with_defaults = dict((argspec.args[(idx*-1)], default) |
+ for idx, default in enumerate(default_list, 1)) |
+ if argspec.args and argspec.args[0] in ('self', 'cls'): |
+ arg_index_start = 1 |
+ else: |
+ arg_index_start = 0 |
+ |
+ def generate_key(*args, **kwargs): |
+ as_kwargs = dict( |
+ [(argspec.args[idx], arg) |
+ for idx, arg in enumerate(args[arg_index_start:], |
+ arg_index_start)]) |
+ as_kwargs.update(kwargs) |
+ for arg, val in args_with_defaults.items(): |
+ if arg not in as_kwargs: |
+ as_kwargs[arg] = val |
+ |
+ argument_values = [as_kwargs[key] |
+ for key in sorted(as_kwargs.keys())] |
+ return namespace + '|' + " ".join(map(to_str, argument_values)) |
+ return generate_key |
+ |
+ |
+def sha1_mangle_key(key): |
+ """a SHA1 key mangler.""" |
+ |
+ return sha1(key).hexdigest() |
+ |
+ |
+def length_conditional_mangler(length, mangler): |
+ """a key mangler that mangles if the length of the key is |
+ past a certain threshold. |
+ |
+ """ |
+ def mangle(key): |
+ if len(key) >= length: |
+ return mangler(key) |
+ else: |
+ return key |
+ return mangle |
+ |
+# in the 0.6 release these functions were moved to the dogpile.util namespace. |
+# They are linked here to maintain compatibility with older versions. |
+ |
+coerce_string_conf = langhelpers.coerce_string_conf |
+KeyReentrantMutex = langhelpers.KeyReentrantMutex |
+memoized_property = langhelpers.memoized_property |
+PluginLoader = langhelpers.PluginLoader |
+to_list = langhelpers.to_list |