aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar
diff options
context:
space:
mode:
Diffstat (limited to 'debug_toolbar')
-rw-r--r--debug_toolbar/panels/request_vars.py10
-rw-r--r--debug_toolbar/panels/sql.py2
-rw-r--r--debug_toolbar/panels/template.py48
-rw-r--r--debug_toolbar/runtests.py47
-rw-r--r--debug_toolbar/tests/__init__.py1
-rw-r--r--debug_toolbar/tests/templates/404.html0
-rw-r--r--debug_toolbar/tests/tests.py307
-rw-r--r--debug_toolbar/tests/urls.py14
-rw-r--r--debug_toolbar/tests/views.py7
-rw-r--r--debug_toolbar/utils/__init__.py24
10 files changed, 51 insertions, 409 deletions
diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py
index 13e563a..6e7dd03 100644
--- a/debug_toolbar/panels/request_vars.py
+++ b/debug_toolbar/panels/request_vars.py
@@ -1,6 +1,8 @@
from django.template.loader import render_to_string
from django.utils.translation import ugettext_lazy as _
+
from debug_toolbar.panels import DebugPanel
+from debug_toolbar.utils import get_name_from_obj
class RequestVarsDebugPanel(DebugPanel):
"""
@@ -36,17 +38,15 @@ class RequestVarsDebugPanel(DebugPanel):
context = self.context.copy()
if self.view_func is not None:
- module = self.view_func.__module__
- name = getattr(self.view_func, '__name__', None) or self.view_func.__class__.__name__
- view_func = '%s.%s' % (module, name)
+ name = get_name_from_obj(self.view_func)
else:
- view_func = '<no view>'
+ name = '<no view>'
context.update({
'get': [(k, self.request.GET.getlist(k)) for k in self.request.GET],
'post': [(k, self.request.POST.getlist(k)) for k in self.request.POST],
'cookies': [(k, self.request.COOKIES.get(k)) for k in self.request.COOKIES],
- 'view_func': view_func,
+ 'view_func': name,
'view_args': self.view_args,
'view_kwargs': self.view_kwargs
})
diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py
index e8e053b..841aaac 100644
--- a/debug_toolbar/panels/sql.py
+++ b/debug_toolbar/panels/sql.py
@@ -194,7 +194,7 @@ class SQLDebugPanel(DebugPanel):
stacktrace = []
for frame in query['stacktrace']:
params = map(escape, frame[0].rsplit('/', 1) + list(frame[1:]))
- stacktrace.append('<span class="path">{0}/</span><span class="file">{1}</span> in <span class="func">{3}</span>(<span class="lineno">{2}</span>)\n <span class="code">{4}</span>'.format(*params))
+ stacktrace.append(u'<span class="path">{0}/</span><span class="file">{1}</span> in <span class="func">{3}</span>(<span class="lineno">{2}</span>)\n <span class="code">{4}</span>'.format(*params))
query['stacktrace'] = mark_safe('\n'.join(stacktrace))
i += 1
diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py
index 44b8b3e..0715c0a 100644
--- a/debug_toolbar/panels/template.py
+++ b/debug_toolbar/panels/template.py
@@ -47,6 +47,29 @@ class TemplateDebugPanel(DebugPanel):
template_rendered.connect(self._store_template_info)
def _store_template_info(self, sender, **kwargs):
+ context_data = kwargs['context']
+
+ context_list = []
+ for context_layer in context_data.dicts:
+ if hasattr(context_layer, 'items'):
+ for key, value in context_layer.items():
+ # Replace any request elements - they have a large
+ # unicode representation and the request data is
+ # already made available from the Request Vars panel.
+ if isinstance(value, http.HttpRequest):
+ context_layer[key] = '<<request>>'
+ # Replace the debugging sql_queries element. The SQL
+ # data is already made available from the SQL panel.
+ elif key == 'sql_queries' and isinstance(value, list):
+ context_layer[key] = '<<sql_queries>>'
+ # Replace LANGUAGES, which is available in i18n context processor
+ elif key == 'LANGUAGES' and isinstance(value, tuple):
+ context_layer[key] = '<<languages>>'
+ try:
+ context_list.append(pformat(context_layer))
+ except UnicodeEncodeError:
+ pass
+ kwargs['context'] = context_list
self.templates.append(kwargs)
def nav_title(self):
@@ -78,6 +101,8 @@ class TemplateDebugPanel(DebugPanel):
# Skip templates that we are generating through the debug toolbar.
if template.name and template.name.startswith('debug_toolbar/'):
continue
+ if not hasattr(template, 'origin'):
+ continue
if template.origin and template.origin.name:
template.origin_name = template.origin.name
else:
@@ -85,28 +110,7 @@ class TemplateDebugPanel(DebugPanel):
info['template'] = template
# Clean up context for better readability
if getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {}).get('SHOW_TEMPLATE_CONTEXT', True):
- context_data = template_data.get('context', None)
-
- context_list = []
- for context_layer in context_data.dicts:
- if hasattr(context_layer, 'items'):
- for key, value in context_layer.items():
- # Replace any request elements - they have a large
- # unicode representation and the request data is
- # already made available from the Request Vars panel.
- if isinstance(value, http.HttpRequest):
- context_layer[key] = '<<request>>'
- # Replace the debugging sql_queries element. The SQL
- # data is already made available from the SQL panel.
- elif key == 'sql_queries' and isinstance(value, list):
- context_layer[key] = '<<sql_queries>>'
- # Replace LANGUAGES, which is available in i18n context processor
- elif key == 'LANGUAGES' and isinstance(value, tuple):
- context_layer[key] = '<<languages>>'
- try:
- context_list.append(pformat(context_layer))
- except UnicodeEncodeError:
- pass
+ context_list = template_data.get('context', [])
info['context'] = '\n'.join(context_list)
template_context.append(info)
diff --git a/debug_toolbar/runtests.py b/debug_toolbar/runtests.py
deleted file mode 100644
index f16882a..0000000
--- a/debug_toolbar/runtests.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-import sys
-from os.path import dirname, abspath
-
-from django.conf import settings
-
-if not settings.configured:
- settings.configure(
- DATABASE_ENGINE='sqlite3',
- # HACK: this fixes our threaded runserver remote tests
- # DATABASE_NAME='test_sentry',
- # TEST_DATABASE_NAME='test_sentry',
- INSTALLED_APPS=[
- 'django.contrib.auth',
- 'django.contrib.admin',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.sites',
-
- 'debug_toolbar',
-
- 'debug_toolbar.tests',
- ],
- ROOT_URLCONF='',
- DEBUG=False,
- SITE_ID=1,
- )
- import djcelery
- djcelery.setup_loader()
-
-from django.test.simple import run_tests
-
-def runtests(*test_args):
- if 'south' in settings.INSTALLED_APPS:
- from south.management.commands import patch_for_test_db_setup
- patch_for_test_db_setup()
-
- if not test_args:
- test_args = ['debug_toolbar']
- parent = dirname(abspath(__file__))
- sys.path.insert(0, parent)
- failures = run_tests(test_args, verbosity=1, interactive=True)
- sys.exit(failures)
-
-
-if __name__ == '__main__':
- runtests(*sys.argv[1:]) \ No newline at end of file
diff --git a/debug_toolbar/tests/__init__.py b/debug_toolbar/tests/__init__.py
deleted file mode 100644
index f853b10..0000000
--- a/debug_toolbar/tests/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from tests import * \ No newline at end of file
diff --git a/debug_toolbar/tests/templates/404.html b/debug_toolbar/tests/templates/404.html
deleted file mode 100644
index e69de29..0000000
--- a/debug_toolbar/tests/templates/404.html
+++ /dev/null
diff --git a/debug_toolbar/tests/tests.py b/debug_toolbar/tests/tests.py
deleted file mode 100644
index 9ff332e..0000000
--- a/debug_toolbar/tests/tests.py
+++ /dev/null
@@ -1,307 +0,0 @@
-from debug_toolbar.middleware import DebugToolbarMiddleware
-from debug_toolbar.panels.sql import SQLDebugPanel
-from debug_toolbar.panels.request_vars import RequestVarsDebugPanel
-from debug_toolbar.toolbar.loader import DebugToolbar
-from debug_toolbar.utils.tracking import pre_dispatch, post_dispatch, callbacks
-
-from django.conf import settings
-from django.contrib.auth.models import User
-from django.test import TestCase
-
-from dingus import Dingus
-import thread
-
-
-class Settings(object):
- """Allows you to define settings that are required for this function to work"""
-
- NotDefined = object()
-
- def __init__(self, **overrides):
- self.overrides = overrides
- self._orig = {}
-
- def __enter__(self):
- for k, v in self.overrides.iteritems():
- self._orig[k] = getattr(settings, k, self.NotDefined)
- setattr(settings, k, v)
-
- def __exit__(self, exc_type, exc_value, traceback):
- for k, v in self._orig.iteritems():
- if v is self.NotDefined:
- delattr(settings, k)
- else:
- setattr(settings, k, v)
-
-class BaseTestCase(TestCase):
- def setUp(self):
- request = Dingus('request')
- toolbar = DebugToolbar(request)
-
- DebugToolbarMiddleware.debug_toolbars[thread.get_ident()] = toolbar
-
- self.request = request
- self.toolbar = toolbar
-
-class DebugToolbarTestCase(BaseTestCase):
- urls = 'debug_toolbar.tests.urls'
-
- def test_middleware(self):
- resp = self.client.get('/execute_sql/')
- self.assertEquals(resp.status_code, 200)
-
- def test_show_toolbar_DEBUG(self):
- request = self.request
-
- middleware = DebugToolbarMiddleware()
-
- with Settings(DEBUG=True):
- self.assertTrue(middleware._show_toolbar(request))
-
- with Settings(DEBUG=False):
- self.assertFalse(middleware._show_toolbar(request))
-
- def test_show_toolbar_TEST(self):
- request = self.request
-
- middleware = DebugToolbarMiddleware()
-
- with Settings(TEST=True, DEBUG=True):
- self.assertFalse(middleware._show_toolbar(request))
-
- with Settings(TEST=False, DEBUG=True):
- self.assertTrue(middleware._show_toolbar(request))
-
- def test_show_toolbar_INTERNAL_IPS(self):
- request = self.request
-
- request.META = {'REMOTE_ADDR': '127.0.0.1'}
- middleware = DebugToolbarMiddleware()
-
- with Settings(INTERNAL_IPS=['127.0.0.1']):
- self.assertTrue(middleware._show_toolbar(request))
-
- with Settings(INTERNAL_IPS=[]):
- self.assertFalse(middleware._show_toolbar(request))
-
- def test_request_urlconf_string(self):
- request = self.request
-
- request.urlconf = 'debug_toolbar.tests.urls'
- request.META = {'REMOTE_ADDR': '127.0.0.1'}
- middleware = DebugToolbarMiddleware()
-
- with Settings(DEBUG=True):
- middleware.process_request(request)
-
- self.assertFalse(isinstance(request.urlconf, basestring))
-
- self.assertTrue(hasattr(request.urlconf.urlpatterns[0], '_callback_str'))
- self.assertEquals(request.urlconf.urlpatterns[0]._callback_str, 'debug_toolbar.views.debug_media')
- self.assertEquals(request.urlconf.urlpatterns[-1].urlconf_name.__name__, 'debug_toolbar.tests.urls')
-
- def test_request_urlconf_string_per_request(self):
- request = self.request
-
- request.urlconf = 'debug_toolbar.tests.urls'
- request.META = {'REMOTE_ADDR': '127.0.0.1'}
- middleware = DebugToolbarMiddleware()
-
- with Settings(DEBUG=True):
- middleware.process_request(request)
- request.urlconf = 'debug_toolbar.urls'
- middleware.process_request(request)
-
- self.assertFalse(isinstance(request.urlconf, basestring))
-
- self.assertTrue(hasattr(request.urlconf.urlpatterns[0], '_callback_str'))
- self.assertEquals(request.urlconf.urlpatterns[0]._callback_str, 'debug_toolbar.views.debug_media')
- self.assertEquals(request.urlconf.urlpatterns[-1].urlconf_name.__name__, 'debug_toolbar.urls')
-
- def test_request_urlconf_module(self):
- request = self.request
-
- request.urlconf = __import__('debug_toolbar.tests.urls').tests.urls
- request.META = {'REMOTE_ADDR': '127.0.0.1'}
- middleware = DebugToolbarMiddleware()
-
- with Settings(DEBUG=True):
- middleware.process_request(request)
-
- self.assertFalse(isinstance(request.urlconf, basestring))
-
- self.assertTrue(hasattr(request.urlconf.urlpatterns[0], '_callback_str'))
- self.assertEquals(request.urlconf.urlpatterns[0]._callback_str, 'debug_toolbar.views.debug_media')
- self.assertEquals(request.urlconf.urlpatterns[-1].urlconf_name.__name__, 'debug_toolbar.tests.urls')
-
- def test_with_process_view(self):
- request = self.request
-
- def _test_view(request):
- return HttpResponse('')
-
- with Settings(DEBUG=True):
- panel = self.toolbar.get_panel(RequestVarsDebugPanel)
- panel.process_request(request)
- panel.process_view(request, _test_view, [], {})
- content = panel.content()
- self.assertIn('debug_toolbar.tests.tests._test_view', content)
-
- def test_without_process_view(self):
- request = self.request
-
- with Settings(DEBUG=True):
- panel = self.toolbar.get_panel(RequestVarsDebugPanel)
- panel.process_request(request)
- content = panel.content()
- self.assertIn('&lt;no view&gt;', content)
-
-class SQLPanelTestCase(BaseTestCase):
- def test_recording(self):
- panel = self.toolbar.get_panel(SQLDebugPanel)
- self.assertEquals(len(panel._queries), 0)
-
- list(User.objects.all())
-
- # ensure query was logged
- self.assertEquals(len(panel._queries), 1)
- query = panel._queries[0]
- self.assertEquals(query[0], 'default')
- self.assertTrue('sql' in query[1])
- self.assertTrue('duration' in query[1])
- self.assertTrue('stacktrace' in query[1])
-
-def module_func(*args, **kwargs):
- """Used by dispatch tests"""
- return 'blah'
-
-class TrackingTestCase(BaseTestCase):
- @classmethod
- def class_method(cls, *args, **kwargs):
- return 'blah'
-
- def class_func(self, *args, **kwargs):
- """Used by dispatch tests"""
- return 'blah'
-
- def test_pre_hook(self):
- foo = {}
-
- @pre_dispatch(module_func)
- def test(**kwargs):
- foo.update(kwargs)
-
- self.assertTrue(hasattr(module_func, '__wrapped__'))
- self.assertEquals(len(callbacks['before']), 1)
-
- module_func('hi', foo='bar')
-
- self.assertTrue('sender' in foo, foo)
- # best we can do
- self.assertEquals(foo['sender'].__name__, 'module_func')
- self.assertTrue('start' in foo, foo)
- self.assertTrue(foo['start'] > 0)
- self.assertTrue('stop' not in foo, foo)
- self.assertTrue('args' in foo, foo)
- self.assertTrue(len(foo['args']), 1)
- self.assertEquals(foo['args'][0], 'hi')
- self.assertTrue('kwargs' in foo, foo)
- self.assertTrue(len(foo['kwargs']), 1)
- self.assertTrue('foo' in foo['kwargs'])
- self.assertEquals(foo['kwargs']['foo'], 'bar')
-
- callbacks['before'] = {}
-
- @pre_dispatch(TrackingTestCase.class_func)
- def test(**kwargs):
- foo.update(kwargs)
-
- self.assertTrue(hasattr(TrackingTestCase.class_func, '__wrapped__'))
- self.assertEquals(len(callbacks['before']), 1)
-
- self.class_func('hello', foo='bar')
-
- self.assertTrue('sender' in foo, foo)
- # best we can do
- self.assertEquals(foo['sender'].__name__, 'class_func')
- self.assertTrue('start' in foo, foo)
- self.assertTrue(foo['start'] > 0)
- self.assertTrue('stop' not in foo, foo)
- self.assertTrue('args' in foo, foo)
- self.assertTrue(len(foo['args']), 2)
- self.assertEquals(foo['args'][1], 'hello')
- self.assertTrue('kwargs' in foo, foo)
- self.assertTrue(len(foo['kwargs']), 1)
- self.assertTrue('foo' in foo['kwargs'])
- self.assertEquals(foo['kwargs']['foo'], 'bar')
-
- # callbacks['before'] = {}
- #
- # @pre_dispatch(TrackingTestCase.class_method)
- # def test(**kwargs):
- # foo.update(kwargs)
- #
- # self.assertTrue(hasattr(TrackingTestCase.class_method, '__wrapped__'))
- # self.assertEquals(len(callbacks['before']), 1)
- #
- # TrackingTestCase.class_method()
- #
- # self.assertTrue('sender' in foo, foo)
- # # best we can do
- # self.assertEquals(foo['sender'].__name__, 'class_method')
- # self.assertTrue('start' in foo, foo)
- # self.assertTrue('stop' not in foo, foo)
- # self.assertTrue('args' in foo, foo)
-
- def test_post_hook(self):
- foo = {}
-
- @post_dispatch(module_func)
- def test(**kwargs):
- foo.update(kwargs)
-
- self.assertTrue(hasattr(module_func, '__wrapped__'))
- self.assertEquals(len(callbacks['after']), 1)
-
- module_func('hi', foo='bar')
-
- self.assertTrue('sender' in foo, foo)
- # best we can do
- self.assertEquals(foo['sender'].__name__, 'module_func')
- self.assertTrue('start' in foo, foo)
- self.assertTrue(foo['start'] > 0)
- self.assertTrue('stop' in foo, foo)
- self.assertTrue(foo['stop'] > foo['start'])
- self.assertTrue('args' in foo, foo)
- self.assertTrue(len(foo['args']), 1)
- self.assertEquals(foo['args'][0], 'hi')
- self.assertTrue('kwargs' in foo, foo)
- self.assertTrue(len(foo['kwargs']), 1)
- self.assertTrue('foo' in foo['kwargs'])
- self.assertEquals(foo['kwargs']['foo'], 'bar')
-
- callbacks['after'] = {}
-
- @post_dispatch(TrackingTestCase.class_func)
- def test(**kwargs):
- foo.update(kwargs)
-
- self.assertTrue(hasattr(TrackingTestCase.class_func, '__wrapped__'))
- self.assertEquals(len(callbacks['after']), 1)
-
- self.class_func('hello', foo='bar')
-
- self.assertTrue('sender' in foo, foo)
- # best we can do
- self.assertEquals(foo['sender'].__name__, 'class_func')
- self.assertTrue('start' in foo, foo)
- self.assertTrue(foo['start'] > 0)
- self.assertTrue('stop' in foo, foo)
- self.assertTrue(foo['stop'] > foo['start'])
- self.assertTrue('args' in foo, foo)
- self.assertTrue(len(foo['args']), 2)
- self.assertEquals(foo['args'][1], 'hello')
- self.assertTrue('kwargs' in foo, foo)
- self.assertTrue(len(foo['kwargs']), 1)
- self.assertTrue('foo' in foo['kwargs'])
- self.assertEquals(foo['kwargs']['foo'], 'bar')
diff --git a/debug_toolbar/tests/urls.py b/debug_toolbar/tests/urls.py
deleted file mode 100644
index 7c99b03..0000000
--- a/debug_toolbar/tests/urls.py
+++ /dev/null
@@ -1,14 +0,0 @@
-"""
-URLpatterns for the debug toolbar.
-
-These should not be loaded explicitly; the debug toolbar middleware will patch
-this into the urlconf for the request.
-"""
-from django.conf.urls.defaults import *
-from django.contrib import admin
-
-admin.autodiscover()
-
-urlpatterns = patterns('',
- url(r'^execute_sql/$', 'debug_toolbar.tests.views.execute_sql'),
-)
diff --git a/debug_toolbar/tests/views.py b/debug_toolbar/tests/views.py
deleted file mode 100644
index f989dcd..0000000
--- a/debug_toolbar/tests/views.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from django.contrib.auth.models import User
-from django.http import HttpResponse
-
-def execute_sql(request):
- list(User.objects.all())
-
- return HttpResponse() \ No newline at end of file
diff --git a/debug_toolbar/utils/__init__.py b/debug_toolbar/utils/__init__.py
index 2ce38db..c4dc160 100644
--- a/debug_toolbar/utils/__init__.py
+++ b/debug_toolbar/utils/__init__.py
@@ -47,7 +47,7 @@ def get_template_info(source, context_lines=3):
line = 0
upto = 0
source_lines = []
- before = during = after = ""
+ # before = during = after = ""
origin, (start, end) = source
template_source = origin.reload()
@@ -55,9 +55,9 @@ def get_template_info(source, context_lines=3):
for num, next in enumerate(linebreak_iter(template_source)):
if start >= upto and end <= next:
line = num
- before = template_source[upto:start]
- during = template_source[start:end]
- after = template_source[end:next]
+ # before = template_source[upto:start]
+ # during = template_source[start:end]
+ # after = template_source[end:next]
source_lines.append((num, template_source[upto:next]))
upto = next
@@ -75,4 +75,18 @@ def get_template_info(source, context_lines=3):
return {
'name': origin.name,
'context': context,
- } \ No newline at end of file
+ }
+
+def get_name_from_obj(obj):
+ if hasattr(obj, '__name__'):
+ name = obj.__name__
+ elif hasattr(obj, '__class__') and hasattr(obj.__class__, '__name__'):
+ name = obj.__class__.__name__
+ else:
+ name = '<unknown>'
+
+ if hasattr(obj, '__module__'):
+ module = obj.__module__
+ name = '%s.%s' % (module, name)
+
+ return name \ No newline at end of file