Index: client/third_party/cachetools/cache.py |
diff --git a/client/third_party/cachetools/cache.py b/client/third_party/cachetools/cache.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..085263113149cfc5bef79dc9365197d42ba0326d |
--- /dev/null |
+++ b/client/third_party/cachetools/cache.py |
@@ -0,0 +1,104 @@ |
+from __future__ import absolute_import |
+ |
+from .abc import DefaultMapping |
+ |
+ |
+class _DefaultSize(object): |
+ def __getitem__(self, _): |
+ return 1 |
+ |
+ def __setitem__(self, _, value): |
+ assert value == 1 |
+ |
+ def pop(self, _): |
+ return 1 |
+ |
+ |
+class Cache(DefaultMapping): |
+ """Mutable mapping to serve as a simple cache or cache base class.""" |
+ |
+ __size = _DefaultSize() |
+ |
+ def __init__(self, maxsize, missing=None, getsizeof=None): |
+ if missing: |
+ self.__missing = missing |
+ if getsizeof: |
+ self.__getsizeof = getsizeof |
+ self.__size = dict() |
+ self.__data = dict() |
+ self.__currsize = 0 |
+ self.__maxsize = maxsize |
+ |
+ def __repr__(self): |
+ return '%s(%r, maxsize=%r, currsize=%r)' % ( |
+ self.__class__.__name__, |
+ list(self.__data.items()), |
+ self.__maxsize, |
+ self.__currsize, |
+ ) |
+ |
+ def __getitem__(self, key): |
+ try: |
+ return self.__data[key] |
+ except KeyError: |
+ return self.__missing__(key) |
+ |
+ def __setitem__(self, key, value): |
+ maxsize = self.__maxsize |
+ size = self.getsizeof(value) |
+ if size > maxsize: |
+ raise ValueError('value too large') |
+ if key not in self.__data or self.__size[key] < size: |
+ while self.__currsize + size > maxsize: |
+ self.popitem() |
+ if key in self.__data: |
+ diffsize = size - self.__size[key] |
+ else: |
+ diffsize = size |
+ self.__data[key] = value |
+ self.__size[key] = size |
+ self.__currsize += diffsize |
+ |
+ def __delitem__(self, key): |
+ size = self.__size.pop(key) |
+ del self.__data[key] |
+ self.__currsize -= size |
+ |
+ def __contains__(self, key): |
+ return key in self.__data |
+ |
+ def __missing__(self, key): |
+ value = self.__missing(key) |
+ try: |
+ self.__setitem__(key, value) |
+ except ValueError: |
+ pass # value too large |
+ return value |
+ |
+ def __iter__(self): |
+ return iter(self.__data) |
+ |
+ def __len__(self): |
+ return len(self.__data) |
+ |
+ @staticmethod |
+ def __getsizeof(value): |
+ return 1 |
+ |
+ @staticmethod |
+ def __missing(key): |
+ raise KeyError(key) |
+ |
+ @property |
+ def maxsize(self): |
+ """The maximum size of the cache.""" |
+ return self.__maxsize |
+ |
+ @property |
+ def currsize(self): |
+ """The current size of the cache.""" |
+ return self.__currsize |
+ |
+ def getsizeof(self, value): |
+ """Return the size of a cache element's value.""" |
+ return self.__getsizeof(value) |