Skip to content

Commit 5ad50f7

Browse files
Implement CacheStatTracker.get_or_set (#1570)
Capture the get_or_set() calls to the cache, keeping the tracker interface in line with django.core.cache.backends.BaseCache.
1 parent 0a297d7 commit 5ad50f7

File tree

3 files changed

+76
-1
lines changed

3 files changed

+76
-1
lines changed

debug_toolbar/panels/cache.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ def get(self, *args, **kwargs):
8888
def set(self, *args, **kwargs):
8989
return self.cache.set(*args, **kwargs)
9090

91+
@send_signal
92+
def get_or_set(self, *args, **kwargs):
93+
return self.cache.get_or_set(*args, **kwargs)
94+
9195
@send_signal
9296
def touch(self, *args, **kwargs):
9397
return self.cache.touch(*args, **kwargs)
@@ -169,6 +173,7 @@ def __init__(self, *args, **kwargs):
169173
("add", 0),
170174
("get", 0),
171175
("set", 0),
176+
("get_or_set", 0),
172177
("touch", 0),
173178
("delete", 0),
174179
("clear", 0),
@@ -197,7 +202,7 @@ def _store_call_info(
197202
backend=None,
198203
**kw,
199204
):
200-
if name == "get":
205+
if name == "get" or name == "get_or_set":
201206
if return_value is None:
202207
self.misses += 1
203208
else:

docs/changes.rst

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Change log
44
Next version
55
------------
66

7+
* Track calls to :py:meth:`django.core.caches.cache.get_or_set`.
78
* Removed support for Django < 3.2.
89
* Updated check ``W006`` to look for
910
``django.template.loaders.app_directories.Loader``.

tests/panels/test_cache.py

+69
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,75 @@ def test_recording_caches(self):
2626
second_cache.get("foo")
2727
self.assertEqual(len(self.panel.calls), 2)
2828

29+
def test_get_or_set_value(self):
30+
cache.cache.get_or_set("baz", "val")
31+
self.assertEqual(cache.cache.get("baz"), "val")
32+
calls = [
33+
(call["name"], call["args"], call["kwargs"]) for call in self.panel.calls
34+
]
35+
self.assertEqual(
36+
calls,
37+
[
38+
("get_or_set", ("baz", "val"), {}),
39+
("get", ("baz",), {}),
40+
],
41+
)
42+
self.assertEqual(
43+
self.panel.counts,
44+
{
45+
"add": 0,
46+
"get": 1,
47+
"set": 0,
48+
"get_or_set": 1,
49+
"touch": 0,
50+
"delete": 0,
51+
"clear": 0,
52+
"get_many": 0,
53+
"set_many": 0,
54+
"delete_many": 0,
55+
"has_key": 0,
56+
"incr": 0,
57+
"decr": 0,
58+
"incr_version": 0,
59+
"decr_version": 0,
60+
},
61+
)
62+
63+
def test_get_or_set_does_not_override_existing_value(self):
64+
cache.cache.set("foo", "bar")
65+
cached_value = cache.cache.get_or_set("foo", "other")
66+
self.assertEqual(cached_value, "bar")
67+
calls = [
68+
(call["name"], call["args"], call["kwargs"]) for call in self.panel.calls
69+
]
70+
self.assertEqual(
71+
calls,
72+
[
73+
("set", ("foo", "bar"), {}),
74+
("get_or_set", ("foo", "other"), {}),
75+
],
76+
)
77+
self.assertEqual(
78+
self.panel.counts,
79+
{
80+
"add": 0,
81+
"get": 0,
82+
"set": 1,
83+
"get_or_set": 1,
84+
"touch": 0,
85+
"delete": 0,
86+
"clear": 0,
87+
"get_many": 0,
88+
"set_many": 0,
89+
"delete_many": 0,
90+
"has_key": 0,
91+
"incr": 0,
92+
"decr": 0,
93+
"incr_version": 0,
94+
"decr_version": 0,
95+
},
96+
)
97+
2998
def test_insert_content(self):
3099
"""
31100
Test that the panel only inserts content after generate_stats and

0 commit comments

Comments
 (0)