| Index: tools/telemetry/third_party/rope/rope/base/utils.py
|
| diff --git a/tools/telemetry/third_party/rope/rope/base/utils.py b/tools/telemetry/third_party/rope/rope/base/utils.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..11556c1327818cca517bc99a24290a218d5cad37
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/rope/rope/base/utils.py
|
| @@ -0,0 +1,83 @@
|
| +import warnings
|
| +
|
| +
|
| +def saveit(func):
|
| + """A decorator that caches the return value of a function"""
|
| +
|
| + name = '_' + func.__name__
|
| +
|
| + def _wrapper(self, *args, **kwds):
|
| + if not hasattr(self, name):
|
| + setattr(self, name, func(self, *args, **kwds))
|
| + return getattr(self, name)
|
| + return _wrapper
|
| +
|
| +cacheit = saveit
|
| +
|
| +
|
| +def prevent_recursion(default):
|
| + """A decorator that returns the return value of `default` in recursions"""
|
| + def decorator(func):
|
| + name = '_calling_%s_' % func.__name__
|
| +
|
| + def newfunc(self, *args, **kwds):
|
| + if getattr(self, name, False):
|
| + return default()
|
| + setattr(self, name, True)
|
| + try:
|
| + return func(self, *args, **kwds)
|
| + finally:
|
| + setattr(self, name, False)
|
| + return newfunc
|
| + return decorator
|
| +
|
| +
|
| +def ignore_exception(exception_class):
|
| + """A decorator that ignores `exception_class` exceptions"""
|
| + def _decorator(func):
|
| + def newfunc(*args, **kwds):
|
| + try:
|
| + return func(*args, **kwds)
|
| + except exception_class:
|
| + pass
|
| + return newfunc
|
| + return _decorator
|
| +
|
| +
|
| +def deprecated(message=None):
|
| + """A decorator for deprecated functions"""
|
| + def _decorator(func, message=message):
|
| + if message is None:
|
| + message = '%s is deprecated' % func.__name__
|
| +
|
| + def newfunc(*args, **kwds):
|
| + warnings.warn(message, DeprecationWarning, stacklevel=2)
|
| + return func(*args, **kwds)
|
| + return newfunc
|
| + return _decorator
|
| +
|
| +
|
| +def cached(count):
|
| + """A caching decorator based on parameter objects"""
|
| + def decorator(func):
|
| + return _Cached(func, count)
|
| + return decorator
|
| +
|
| +
|
| +class _Cached(object):
|
| +
|
| + def __init__(self, func, count):
|
| + self.func = func
|
| + self.cache = []
|
| + self.count = count
|
| +
|
| + def __call__(self, *args, **kwds):
|
| + key = (args, kwds)
|
| + for cached_key, cached_result in self.cache:
|
| + if cached_key == key:
|
| + return cached_result
|
| + result = self.func(*args, **kwds)
|
| + self.cache.append((key, result))
|
| + if len(self.cache) > self.count:
|
| + del self.cache[0]
|
| + return result
|
|
|