Skip to content

Commit 3751812

Browse files
committed
Eliminate intermediate _parse_sql() method
By using a settings_changed signal receiver to clear the query caching, the parse_sql() and _parse_sql() functions can be merged and the check for the "PRETTIFY_SQL" setting can be moved back inside the get_filter_stack() function.
1 parent 255efeb commit 3751812

File tree

2 files changed

+31
-34
lines changed

2 files changed

+31
-34
lines changed

debug_toolbar/panels/sql/utils.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from html import escape
33

44
import sqlparse
5+
from django.dispatch import receiver
6+
from django.test.signals import setting_changed
57
from sqlparse import tokens as T
68

79
from debug_toolbar import settings as dt_settings
@@ -94,27 +96,19 @@ def reformat_sql(sql, with_toggle=False):
9496
return collapsed + uncollapsed
9597

9698

97-
def parse_sql(sql, *, simplify=False):
98-
return _parse_sql(
99-
sql,
100-
prettify=dt_settings.get_config()["PRETTIFY_SQL"],
101-
simplify=simplify,
102-
)
103-
104-
10599
@lru_cache(maxsize=128)
106-
def _parse_sql(sql, *, prettify, simplify):
107-
stack = get_filter_stack(prettify=prettify, simplify=simplify)
100+
def parse_sql(sql, *, simplify=False):
101+
stack = get_filter_stack(simplify=simplify)
108102
return "".join(stack.run(sql))
109103

110104

111105
@lru_cache(maxsize=None)
112-
def get_filter_stack(*, prettify, simplify):
106+
def get_filter_stack(*, simplify):
113107
stack = sqlparse.engine.FilterStack()
114108
if simplify:
115109
stack.preprocess.append(ElideSelectListsFilter())
116110
else:
117-
if prettify:
111+
if dt_settings.get_config()["PRETTIFY_SQL"]:
118112
stack.enable_grouping()
119113
stack.stmtprocess.append(
120114
sqlparse.filters.AlignedIndentFilter(char="&nbsp;", n="<br/>")
@@ -124,6 +118,13 @@ def get_filter_stack(*, prettify, simplify):
124118
return stack
125119

126120

121+
@receiver(setting_changed)
122+
def clear_caches(*, setting, **kwargs):
123+
if setting == "DEBUG_TOOLBAR_CONFIG":
124+
parse_sql.cache_clear()
125+
get_filter_stack.cache_clear()
126+
127+
127128
def contrasting_color_generator():
128129
"""
129130
Generate contrasting colors by varying most significant bit of RGB first,

tests/panels/test_sql.py

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from django.test.utils import override_settings
1515

1616
import debug_toolbar.panels.sql.tracking as sql_tracking
17-
from debug_toolbar import settings as dt_settings
1817

1918
try:
2019
import psycopg
@@ -458,42 +457,39 @@ def test_regression_infinite_recursion(self):
458457
# ensure the stacktrace is populated
459458
self.assertTrue(len(query["stacktrace"]) > 0)
460459

461-
@override_settings(
462-
DEBUG_TOOLBAR_CONFIG={"PRETTIFY_SQL": True},
463-
)
464460
def test_prettify_sql(self):
465461
"""
466462
Test case to validate that the PRETTIFY_SQL setting changes the output
467463
of the sql when it's toggled. It does not validate what it does
468464
though.
469465
"""
470-
list(User.objects.filter(username__istartswith="spam"))
471-
472-
response = self.panel.process_request(self.request)
473-
self.panel.generate_stats(self.request, response)
474-
pretty_sql = self.panel._queries[-1]["sql"]
475-
self.assertEqual(len(self.panel._queries), 1)
466+
with override_settings(DEBUG_TOOLBAR_CONFIG={"PRETTIFY_SQL": True}):
467+
list(User.objects.filter(username__istartswith="spam"))
468+
response = self.panel.process_request(self.request)
469+
self.panel.generate_stats(self.request, response)
470+
pretty_sql = self.panel._queries[-1]["sql"]
471+
self.assertEqual(len(self.panel._queries), 1)
476472

477473
# Reset the queries
478474
self.panel._queries = []
479475
# Run it again, but with prettify off. Verify that it's different.
480-
dt_settings.get_config()["PRETTIFY_SQL"] = False
481-
list(User.objects.filter(username__istartswith="spam"))
482-
response = self.panel.process_request(self.request)
483-
self.panel.generate_stats(self.request, response)
484-
self.assertEqual(len(self.panel._queries), 1)
485-
self.assertNotEqual(pretty_sql, self.panel._queries[-1]["sql"])
476+
with override_settings(DEBUG_TOOLBAR_CONFIG={"PRETTIFY_SQL": False}):
477+
list(User.objects.filter(username__istartswith="spam"))
478+
response = self.panel.process_request(self.request)
479+
self.panel.generate_stats(self.request, response)
480+
self.assertEqual(len(self.panel._queries), 1)
481+
self.assertNotEqual(pretty_sql, self.panel._queries[-1]["sql"])
486482

487483
self.panel._queries = []
488484
# Run it again, but with prettify back on.
489485
# This is so we don't have to check what PRETTIFY_SQL does exactly,
490486
# but we know it's doing something.
491-
dt_settings.get_config()["PRETTIFY_SQL"] = True
492-
list(User.objects.filter(username__istartswith="spam"))
493-
response = self.panel.process_request(self.request)
494-
self.panel.generate_stats(self.request, response)
495-
self.assertEqual(len(self.panel._queries), 1)
496-
self.assertEqual(pretty_sql, self.panel._queries[-1]["sql"])
487+
with override_settings(DEBUG_TOOLBAR_CONFIG={"PRETTIFY_SQL": True}):
488+
list(User.objects.filter(username__istartswith="spam"))
489+
response = self.panel.process_request(self.request)
490+
self.panel.generate_stats(self.request, response)
491+
self.assertEqual(len(self.panel._queries), 1)
492+
self.assertEqual(pretty_sql, self.panel._queries[-1]["sql"])
497493

498494
def test_simplification(self):
499495
"""

0 commit comments

Comments
 (0)