Skip to content

Commit b42dc76

Browse files
committed
feat: drop cachetools dependency in favor of simple local implementation
1 parent 446c8e7 commit b42dc76

File tree

7 files changed

+67
-11
lines changed

7 files changed

+67
-11
lines changed

.kokoro/requirements.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ backports-tarfile==1.2.0 \
1616
--hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \
1717
--hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991
1818
# via jaraco-context
19-
cachetools==5.5.0 \
20-
--hash=sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292 \
21-
--hash=sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a
22-
# via google-auth
2319
certifi==2024.8.30 \
2420
--hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \
2521
--hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9

google/auth/_cache.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from collections import OrderedDict
2+
3+
4+
class LRUCache(dict):
5+
def __init__(self, maxsize):
6+
super().__init__()
7+
self._order = OrderedDict()
8+
self.maxsize = maxsize
9+
10+
def clear(self):
11+
super().clear()
12+
self._order.clear()
13+
14+
def __getitem__(self, key):
15+
value = super().__getitem__(key)
16+
self._update(key)
17+
return value
18+
19+
def __setitem__(self, key, value):
20+
maxsize = self.maxsize
21+
if maxsize <= 0:
22+
return
23+
if key not in self:
24+
while len(self) >= maxsize:
25+
self.popitem()
26+
super().__setitem__(key, value)
27+
self._update(key)
28+
29+
def __delitem__(self, key):
30+
super().__delitem__(key)
31+
del self._order[key]
32+
33+
def popitem(self):
34+
"""Remove and return the least recently used key-value pair."""
35+
key, _ = self._order.popitem(last=False)
36+
return key, super().pop(key)
37+
38+
def _update(self, key):
39+
try:
40+
self._order.move_to_end(key)
41+
except KeyError:
42+
self._order[key] = None

google/auth/jwt.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@
5050
import json
5151
import urllib
5252

53-
import cachetools
54-
53+
from google.auth import _cache
5554
from google.auth import _helpers
5655
from google.auth import _service_account_info
5756
from google.auth import crypt
@@ -629,7 +628,7 @@ def __init__(
629628
token_lifetime (int): The amount of time in seconds for
630629
which the token is valid. Defaults to 1 hour.
631630
max_cache_size (int): The maximum number of JWT tokens to keep in
632-
cache. Tokens are cached using :class:`cachetools.LRUCache`.
631+
cache. Tokens are cached using :class:`google.auth._cache.LRUCache`.
633632
quota_project_id (Optional[str]): The project ID used for quota
634633
and billing.
635634
@@ -645,7 +644,7 @@ def __init__(
645644
additional_claims = {}
646645

647646
self._additional_claims = additional_claims
648-
self._cache = cachetools.LRUCache(maxsize=max_cache_size)
647+
self._cache = _cache.LRUCache(maxsize=max_cache_size)
649648

650649
@classmethod
651650
def _from_signer_and_info(cls, signer, info, **kwargs):

noxfile.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ def mypy(session):
7373
session.install("-e", ".")
7474
session.install(
7575
"mypy",
76-
"types-cachetools",
7776
"types-certifi",
7877
"types-freezegun",
7978
"types-pyOpenSSL",

setup.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121

2222
DEPENDENCIES = (
23-
"cachetools>=2.0.0,<6.0",
2423
"pyasn1-modules>=0.2.1",
2524
# rsa==4.5 is the last version to support 2.7
2625
# https://github.com/sybrenstuvel/python-rsa/issues/152#issuecomment-643470233

testing/constraints-3.7.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#
66
# e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev",
77
# Then this file should have foo==1.14.0
8-
cachetools==2.0.0
98
pyasn1-modules==0.2.1
109
setuptools==40.3.0
1110
rsa==3.1.4

tests/test__cache.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from google.auth._cache import LRUCache
2+
3+
4+
def test_lru_cache():
5+
lru_cache = LRUCache(2)
6+
lru_cache["a"] = 1
7+
lru_cache["b"] = 2
8+
assert lru_cache["a"] == 1
9+
lru_cache["c"] = 3
10+
assert "b" not in lru_cache
11+
assert lru_cache["a"] == 1
12+
assert lru_cache["c"] == 3
13+
lru_cache["d"] = 4
14+
assert "a" not in lru_cache
15+
assert lru_cache["c"] == 3
16+
assert lru_cache["d"] == 4
17+
18+
19+
def test_zero_size_lru_cache():
20+
lru_cache = LRUCache(0)
21+
lru_cache["a"] = 1
22+
assert "a" not in lru_cache

0 commit comments

Comments
 (0)