diff options
Diffstat (limited to 'debug_toolbar')
| -rw-r--r-- | debug_toolbar/panels/request_vars.py | 10 | ||||
| -rw-r--r-- | debug_toolbar/panels/sql.py | 2 | ||||
| -rw-r--r-- | debug_toolbar/panels/template.py | 48 | ||||
| -rw-r--r-- | debug_toolbar/runtests.py | 47 | ||||
| -rw-r--r-- | debug_toolbar/tests/__init__.py | 1 | ||||
| -rw-r--r-- | debug_toolbar/tests/templates/404.html | 0 | ||||
| -rw-r--r-- | debug_toolbar/tests/tests.py | 307 | ||||
| -rw-r--r-- | debug_toolbar/tests/urls.py | 14 | ||||
| -rw-r--r-- | debug_toolbar/tests/views.py | 7 | ||||
| -rw-r--r-- | debug_toolbar/utils/__init__.py | 24 |
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('<no view>', 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 |
