From e6b2998a9af66cc627cefe2a97f07ffdca46ad73 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 18 Mar 2013 13:48:52 -0700 Subject: [PATCH 01/14] Fixing exception syntax that works in python >= 2.6 --- debug_toolbar/__init__.py | 2 +- debug_toolbar/toolbar/loader.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debug_toolbar/__init__.py b/debug_toolbar/__init__.py index 48da4a621..45f1f1a44 100644 --- a/debug_toolbar/__init__.py +++ b/debug_toolbar/__init__.py @@ -3,5 +3,5 @@ try: VERSION = __import__('pkg_resources') \ .get_distribution('django-debug-toolbar').version -except Exception, e: +except Exception: VERSION = 'unknown' diff --git a/debug_toolbar/toolbar/loader.py b/debug_toolbar/toolbar/loader.py index 570111848..d5e21624e 100644 --- a/debug_toolbar/toolbar/loader.py +++ b/debug_toolbar/toolbar/loader.py @@ -93,7 +93,7 @@ def load_panel_classes(): panel_module, panel_classname = panel_path[:dot], panel_path[dot + 1:] try: mod = import_module(panel_module) - except ImportError, e: + except ImportError as e: raise ImproperlyConfigured( 'Error importing debug panel %s: "%s"' % (panel_module, e)) From d24c7eb94207c8d0360063a4ec082f68643da9c4 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 18 Mar 2013 14:02:48 -0700 Subject: [PATCH 02/14] Import _thread for python 3.x and using smart_text --- debug_toolbar/middleware.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index 2c36a19f3..2d85cba04 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -2,12 +2,18 @@ Debug Toolbar middleware """ import imp -import thread +try: + import thread +except ImportError: + import _thread as thread # py3k from django.conf import settings from django.http import HttpResponseRedirect from django.shortcuts import render_to_response -from django.utils.encoding import smart_unicode +try: + from django.utils.encoding import smart_text +except ImportError: + from django.utils.encoding import smart_unicode as smart_text from django.utils.importlib import import_module import debug_toolbar.urls @@ -134,9 +140,9 @@ def process_response(self, request, response): for panel in toolbar.panels: panel.process_response(request, response) response.content = replace_insensitive( - smart_unicode(response.content), + smart_text(response.content), self.tag, - smart_unicode(toolbar.render_toolbar() + self.tag)) + smart_text(toolbar.render_toolbar() + self.tag)) if response.get('Content-Length', None): response['Content-Length'] = len(response.content) del self.__class__.debug_toolbars[ident] From 48bb7f3af23f49b234b3db885c4262e1c216a3b1 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 18 Mar 2013 15:48:26 -0700 Subject: [PATCH 03/14] Importing some python 3 libraries and falling back to python 2.x --- debug_toolbar/middleware.py | 12 ++++++------ debug_toolbar/utils/__init__.py | 9 ++++++--- tests/tests.py | 7 +++++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index 2d85cba04..2ef08c7e5 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -3,9 +3,9 @@ """ import imp try: - import thread + import _thread except ImportError: - import _thread as thread # py3k + import thread as _thread # py3k from django.conf import settings from django.http import HttpResponseRedirect @@ -44,7 +44,7 @@ class DebugToolbarMiddleware(object): @classmethod def get_current(cls): - return cls.debug_toolbars.get(thread.get_ident()) + return cls.debug_toolbars.get(_thread.get_ident()) def __init__(self): self._urlconfs = {} @@ -104,11 +104,11 @@ def process_request(self, request): toolbar = DebugToolbar(request) for panel in toolbar.panels: panel.process_request(request) - self.__class__.debug_toolbars[thread.get_ident()] = toolbar + self.__class__.debug_toolbars[_thread.get_ident()] = toolbar def process_view(self, request, view_func, view_args, view_kwargs): __traceback_hide__ = True - toolbar = self.__class__.debug_toolbars.get(thread.get_ident()) + toolbar = self.__class__.debug_toolbars.get(_thread.get_ident()) if not toolbar: return result = None @@ -120,7 +120,7 @@ def process_view(self, request, view_func, view_args, view_kwargs): def process_response(self, request, response): __traceback_hide__ = True - ident = thread.get_ident() + ident = _thread.get_ident() toolbar = self.__class__.debug_toolbars.get(ident) if not toolbar or request.is_ajax(): return response diff --git a/debug_toolbar/utils/__init__.py b/debug_toolbar/utils/__init__.py index 2d2ff101f..e511a051a 100644 --- a/debug_toolbar/utils/__init__.py +++ b/debug_toolbar/utils/__init__.py @@ -1,7 +1,10 @@ import inspect import os.path import django -import SocketServer +try: + import socketserver +except ImportError: # python 2.x + import SocketServer as socketserver import sys from django.conf import settings @@ -11,7 +14,7 @@ # Figure out some paths django_path = os.path.realpath(os.path.dirname(django.__file__)) -socketserver_path = os.path.realpath(os.path.dirname(SocketServer.__file__)) +socketserver_path = os.path.realpath(os.path.dirname(socketserver.__file__)) def ms_from_timedelta(td): @@ -28,7 +31,7 @@ def tidy_stacktrace(stack): """ Clean up stacktrace and remove all entries that: 1. Are part of Django (except contrib apps) - 2. Are part of SocketServer (used by Django's dev server) + 2. Are part of socketserver (used by Django's dev server) 3. Are the last entry (which is part of our stacktracing code) ``stack`` should be a list of frame tuples from ``inspect.stack()`` diff --git a/tests/tests.py b/tests/tests.py index f76f1ab0d..8e659b631 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -1,5 +1,8 @@ from __future__ import with_statement -import thread +try: + import _thread +except ImportError: + import thread as _thread from django.conf import settings from django.contrib.auth.models import User @@ -48,7 +51,7 @@ def setUp(self): response = HttpResponse() toolbar = DebugToolbar(request) - DebugToolbarMiddleware.debug_toolbars[thread.get_ident()] = toolbar + DebugToolbarMiddleware.debug_toolbars[_thread.get_ident()] = toolbar self.request = request self.response = response From 826a428f4e55082f27c000b8e97cc4dab9a255ae Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 18 Mar 2013 15:49:46 -0700 Subject: [PATCH 04/14] Fixing syntax that works for python 2 and 3 --- debug_toolbar/utils/sqlparse/lexer.py | 2 +- debug_toolbar/utils/sqlparse/sql.py | 4 ++-- debug_toolbar/utils/tracking/__init__.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/debug_toolbar/utils/sqlparse/lexer.py b/debug_toolbar/utils/sqlparse/lexer.py index ae3fc2e95..b3e37433e 100644 --- a/debug_toolbar/utils/sqlparse/lexer.py +++ b/debug_toolbar/utils/sqlparse/lexer.py @@ -79,7 +79,7 @@ def _process_state(cls, unprocessed, processed, state): try: rex = re.compile(tdef[0], rflags).match - except Exception, err: + except Exception as err: raise ValueError(("uncompilable regex %r in state" " %r of %r: %s" % (tdef[0], state, cls, err))) diff --git a/debug_toolbar/utils/sqlparse/sql.py b/debug_toolbar/utils/sqlparse/sql.py index 2f9f538a6..5f4df2b3e 100644 --- a/debug_toolbar/utils/sqlparse/sql.py +++ b/debug_toolbar/utils/sqlparse/sql.py @@ -152,9 +152,9 @@ def _pprint_tree(self, max_depth=None, depth=0): pre = ' +-' else: pre = ' | ' - print '%s%s%d %s \'%s\'' % (indent, pre, idx, + print('%s%s%d %s \'%s\'' % (indent, pre, idx, token._get_repr_name(), - token._get_repr_value()) + token._get_repr_value())) if (token.is_group() and (max_depth is None or depth < max_depth)): token._pprint_tree(max_depth, depth + 1) diff --git a/debug_toolbar/utils/tracking/__init__.py b/debug_toolbar/utils/tracking/__init__.py index 766c24891..9a5927394 100644 --- a/debug_toolbar/utils/tracking/__init__.py +++ b/debug_toolbar/utils/tracking/__init__.py @@ -37,7 +37,7 @@ def fire_hook(hook, sender, **kwargs): try: for callback in callbacks[hook].get(id(sender), []): callback(sender=sender, **kwargs) - except Exception, e: + except Exception as e: # Log the exception, dont mess w/ the underlying function logging.exception(e) From 637417ee4a8ddda663750d439c0358537d9db0f3 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 18 Mar 2013 16:12:04 -0700 Subject: [PATCH 05/14] Fixing dict object has no attribute iteritems by using six.iteritems() from django.utils --- tests/tests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/tests.py b/tests/tests.py index 8e659b631..24d52e7a8 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -10,7 +10,7 @@ from django.http import HttpResponse from django.test import TestCase, RequestFactory from django.template import Template, Context -from django.utils import unittest +from django.utils import six, unittest from debug_toolbar.middleware import DebugToolbarMiddleware from debug_toolbar.panels.sql import SQLDebugPanel @@ -33,12 +33,12 @@ def __init__(self, **overrides): self._orig = {} def __enter__(self): - for k, v in self.overrides.iteritems(): + for k, v in six.iteritems(self.overrides): 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(): + for k, v in six.iteritems(self._orig): if v is self.NotDefined: delattr(settings, k) else: From b30be4a8d67a74d69879e15e31fcf1cf3262b932 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 18 Mar 2013 17:06:46 -0700 Subject: [PATCH 06/14] Using six.string_types instead of basetring --- debug_toolbar/middleware.py | 3 ++- tests/tests.py | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index 2ef08c7e5..2adad7133 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -10,6 +10,7 @@ from django.conf import settings from django.http import HttpResponseRedirect from django.shortcuts import render_to_response +from django.utils import six try: from django.utils.encoding import smart_text except ImportError: @@ -82,7 +83,7 @@ def process_request(self, request): __traceback_hide__ = True if self.show_toolbar(request): urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) - if isinstance(urlconf, basestring): + if isinstance(urlconf, six.string_types): urlconf = import_module(getattr(request, 'urlconf', settings.ROOT_URLCONF)) if urlconf not in self._urlconfs: diff --git a/tests/tests.py b/tests/tests.py index 24d52e7a8..1966ce91d 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -107,7 +107,7 @@ def test_request_urlconf_string(self): with Settings(INTERNAL_IPS=['127.0.0.1'], DEBUG=True): middleware.process_request(request) - self.assertFalse(isinstance(request.urlconf, basestring)) + self.assertFalse(isinstance(request.urlconf, six.string_types)) self.assertTrue(hasattr(request.urlconf.urlpatterns[1], '_callback_str')) self.assertEquals(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') @@ -122,7 +122,7 @@ def test_request_urlconf_string_per_request(self): request.urlconf = 'tests.urls' middleware.process_request(request) - self.assertFalse(isinstance(request.urlconf, basestring)) + self.assertFalse(isinstance(request.urlconf, six.string_types)) self.assertTrue(hasattr(request.urlconf.urlpatterns[1], '_callback_str')) self.assertEquals(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') @@ -135,7 +135,7 @@ def test_request_urlconf_module(self): with Settings(INTERNAL_IPS=['127.0.0.1'], DEBUG=True): middleware.process_request(request) - self.assertFalse(isinstance(request.urlconf, basestring)) + self.assertFalse(isinstance(request.urlconf, six.string_types)) self.assertTrue(hasattr(request.urlconf.urlpatterns[1], '_callback_str')) self.assertEquals(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') @@ -148,7 +148,7 @@ def test_tuple_urlconf(self): middleware = DebugToolbarMiddleware() with Settings(INTERNAL_IPS=['127.0.0.1'], DEBUG=True): middleware.process_request(request) - self.assertFalse(isinstance(request.urlconf, basestring)) + self.assertFalse(isinstance(request.urlconf, six.string_types)) def _resolve_stats(self, path): # takes stats from RequestVars panel From 3aff519190c98fa176bb02a12b7027f491192843 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Tue, 19 Mar 2013 15:08:11 -0700 Subject: [PATCH 07/14] Use force_text, smart_bytes, and six.iterkeys --- debug_toolbar/panels/request_vars.py | 3 ++- debug_toolbar/utils/tracking/db.py | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py index ade23f342..fdef263ae 100644 --- a/debug_toolbar/panels/request_vars.py +++ b/debug_toolbar/panels/request_vars.py @@ -1,5 +1,6 @@ from django.core.urlresolvers import resolve from django.http import Http404 +from django.utils import six from django.utils.translation import ugettext_lazy as _ from debug_toolbar.panels import DebugPanel @@ -53,5 +54,5 @@ def process_response(self, request, response): if hasattr(self.request, 'session'): self.record_stats({ 'session': [(k, self.request.session.get(k)) - for k in self.request.session.iterkeys()] + for k in six.iterkeys(self.request.session)] }) diff --git a/debug_toolbar/utils/tracking/db.py b/debug_toolbar/utils/tracking/db.py index 0ff33591b..01b928abf 100644 --- a/debug_toolbar/utils/tracking/db.py +++ b/debug_toolbar/utils/tracking/db.py @@ -5,7 +5,11 @@ from django.conf import settings from django.template import Node -from django.utils.encoding import force_unicode, smart_str +try: + from django.utils.encoding import force_text, smart_bytes +except ImportError: # django <= 1.4 + from django.utils.encoding import force_unicode as force_text, \ + smart_str as smart_bytes from debug_toolbar.utils import ms_from_timedelta, tidy_stacktrace, \ get_template_info, get_stack @@ -93,7 +97,7 @@ def _quote_params(self, params): def _decode(self, param): try: - return force_unicode(param, strings_only=True) + return force_text(param, strings_only=True) except UnicodeDecodeError: return '(encoded string)' @@ -155,7 +159,7 @@ def execute(self, sql, params=()): 'raw_sql': sql, 'params': _params, 'hash': sha1(settings.SECRET_KEY \ - + smart_str(sql) \ + + smart_bytes(sql) \ + _params).hexdigest(), 'stacktrace': stacktrace, 'start_time': start, From 66205c0a76a5022b87f1f5c36ea4f5969159523a Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Tue, 19 Mar 2013 16:30:40 -0700 Subject: [PATCH 08/14] Passing self.panels as a list to context --- debug_toolbar/toolbar/loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug_toolbar/toolbar/loader.py b/debug_toolbar/toolbar/loader.py index d5e21624e..ccc7bd51a 100644 --- a/debug_toolbar/toolbar/loader.py +++ b/debug_toolbar/toolbar/loader.py @@ -58,7 +58,7 @@ def render_toolbar(self): """ context = self.template_context.copy() context.update({ - 'panels': self.panels, + 'panels': list(self.panels) # [panel for panel in self.panels] }) return render_to_string('debug_toolbar/base.html', context) From 1d13a03e4ba34f8e9ed902e358699b99c3e0a685 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Wed, 20 Mar 2013 15:47:22 -0700 Subject: [PATCH 09/14] Using six everywhere --- debug_toolbar/panels/cache.py | 3 ++- debug_toolbar/panels/profiling.py | 5 +++-- debug_toolbar/panels/sql.py | 3 ++- debug_toolbar/utils/__init__.py | 3 ++- debug_toolbar/utils/sqlparse/__init__.py | 3 ++- debug_toolbar/utils/sqlparse/filters.py | 4 +++- debug_toolbar/utils/sqlparse/lexer.py | 6 ++++-- debug_toolbar/utils/sqlparse/sql.py | 14 ++++++++------ debug_toolbar/utils/tracking/db.py | 5 +++-- 9 files changed, 29 insertions(+), 17 deletions(-) diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py index e25f08b8e..647c93181 100644 --- a/debug_toolbar/panels/cache.py +++ b/debug_toolbar/panels/cache.py @@ -8,6 +8,7 @@ from django.core.cache.backends.base import BaseCache from django.dispatch import Signal from django.template import Node +from django.utils import six from django.utils.datastructures import SortedDict from django.utils.translation import ugettext_lazy as _, ungettext @@ -166,7 +167,7 @@ def _store_call_info(self, sender, name=None, time_taken=0, else: self.hits += 1 elif name == 'get_many': - for key, value in return_value.iteritems(): + for key, value in six.iteritems(return_value): if value is None: self.misses += 1 else: diff --git a/debug_toolbar/panels/profiling.py b/debug_toolbar/panels/profiling.py index f21c34555..c183df424 100644 --- a/debug_toolbar/panels/profiling.py +++ b/debug_toolbar/panels/profiling.py @@ -1,5 +1,6 @@ from __future__ import division +from django.utils import six from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe from debug_toolbar.panels import DebugPanel @@ -23,7 +24,7 @@ class DjangoDebugToolbarStats(Stats): def get_root_func(self): if self.__root is None: - for func, (cc, nc, tt, ct, callers) in self.stats.iteritems(): + for func, (cc, nc, tt, ct, callers) in six.iteritems(self.stats): if len(callers) == 0: self.__root = func break @@ -80,7 +81,7 @@ def subfuncs(self): i = 0 h, s, v = self.hsv count = len(self.statobj.all_callees[self.func]) - for func, stats in self.statobj.all_callees[self.func].iteritems(): + for func, stats in six.iteritems(self.statobj.all_callees[self.func]): i += 1 h1 = h + (i / count) / (self.depth + 1) if stats[3] == 0: diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index a49288863..9d99f0aae 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -2,6 +2,7 @@ import uuid from django.db.backends import BaseDatabaseWrapper +from django.utils import six from django.utils.html import escape from django.utils.translation import ugettext_lazy as _, ungettext_lazy as __ @@ -134,7 +135,7 @@ def process_response(self, request, response): if self._queries: width_ratio_tally = 0 factor = int(256.0 / (len(self._databases) * 2.5)) - for n, db in enumerate(self._databases.itervalues()): + for n, db in enumerate(six.itervalues(self._databases)): rgb = [0, 0, 0] color = n % 3 rgb[color] = 256 - n / 3 * factor diff --git a/debug_toolbar/utils/__init__.py b/debug_toolbar/utils/__init__.py index e511a051a..fcf611a44 100644 --- a/debug_toolbar/utils/__init__.py +++ b/debug_toolbar/utils/__init__.py @@ -9,6 +9,7 @@ from django.conf import settings from django.views.debug import linebreak_iter +from django.utils import six from django.utils.html import escape from django.utils.safestring import mark_safe @@ -59,7 +60,7 @@ def render_stacktrace(trace): stacktrace = [] for frame in trace: params = map(escape, frame[0].rsplit(os.path.sep, 1) + list(frame[1:])) - params_dict = dict((unicode(idx), v) for idx, v in enumerate(params)) + params_dict = dict((six.text_type(idx), v) for idx, v in enumerate(params)) try: stacktrace.append(u'%(0)s/' u'%(1)s' diff --git a/debug_toolbar/utils/sqlparse/__init__.py b/debug_toolbar/utils/sqlparse/__init__.py index 99db30ece..9f5f2622c 100644 --- a/debug_toolbar/utils/sqlparse/__init__.py +++ b/debug_toolbar/utils/sqlparse/__init__.py @@ -14,6 +14,7 @@ class SQLParseError(Exception): # Setup namespace +from django.utils import six from debug_toolbar.utils.sqlparse import engine from debug_toolbar.utils.sqlparse import filters from debug_toolbar.utils.sqlparse import formatter @@ -52,4 +53,4 @@ def split(sql): """ stack = engine.FilterStack() stack.split_statements = True - return [unicode(stmt) for stmt in stack.run(sql)] + return [six.text_type(stmt) for stmt in stack.run(sql)] diff --git a/debug_toolbar/utils/sqlparse/filters.py b/debug_toolbar/utils/sqlparse/filters.py index 897cc9097..1166ad9d6 100644 --- a/debug_toolbar/utils/sqlparse/filters.py +++ b/debug_toolbar/utils/sqlparse/filters.py @@ -2,6 +2,8 @@ import re +from django.utils import six + from debug_toolbar.utils.sqlparse import tokens as T from debug_toolbar.utils.sqlparse import sql @@ -131,7 +133,7 @@ def __init__(self, width=2, char=' ', line_width=None): def _get_offset(self, token): all_ = list(self._curr_stmt.flatten()) idx = all_.index(token) - raw = ''.join(unicode(x) for x in all_[:idx + 1]) + raw = ''.join(six.text_type(x) for x in all_[:idx + 1]) line = raw.splitlines()[-1] # Now take current offset into account and return relative offset. full_offset = len(line) - len(self.char * (self.width * self.indent)) diff --git a/debug_toolbar/utils/sqlparse/lexer.py b/debug_toolbar/utils/sqlparse/lexer.py index b3e37433e..a868414ae 100644 --- a/debug_toolbar/utils/sqlparse/lexer.py +++ b/debug_toolbar/utils/sqlparse/lexer.py @@ -14,6 +14,8 @@ import re +from django.utils import six + from debug_toolbar.utils.sqlparse import tokens from debug_toolbar.utils.sqlparse.keywords import KEYWORDS, KEYWORDS_COMMON @@ -92,7 +94,7 @@ def _process_state(cls, unprocessed, processed, state): new_state = None else: tdef2 = tdef[2] - if isinstance(tdef2, str): + if isinstance(tdef2, bytes): # an existing state if tdef2 == '#pop': new_state = -1 @@ -222,7 +224,7 @@ def get_tokens(self, text, unfiltered=False): Also preprocess the text, i.e. expand tabs and strip it if wanted and applies registered filters. """ - if not isinstance(text, unicode): + if not isinstance(text, six.text_type): if self.encoding == 'guess': try: text = text.decode('utf-8') diff --git a/debug_toolbar/utils/sqlparse/sql.py b/debug_toolbar/utils/sqlparse/sql.py index 5f4df2b3e..f7073c1ad 100644 --- a/debug_toolbar/utils/sqlparse/sql.py +++ b/debug_toolbar/utils/sqlparse/sql.py @@ -4,6 +4,8 @@ import re +from django.utils import six + from debug_toolbar.utils.sqlparse import tokens as T @@ -23,7 +25,7 @@ def __init__(self, ttype, value): self.parent = None def __str__(self): - return unicode(self).encode('utf-8') + return six.text_type(self).encode('utf-8') def __repr__(self): short = self._get_repr_value() @@ -35,13 +37,13 @@ def __unicode__(self): def to_unicode(self): """Returns a unicode representation of this object.""" - return unicode(self) + return six.text_type(self) def _get_repr_name(self): return str(self.ttype).split('.')[-1] def _get_repr_value(self): - raw = unicode(self) + raw = six.text_type(self) if len(raw) > 7: short = raw[:6] + u'...' else: @@ -67,7 +69,7 @@ def match(self, ttype, values, regex=False): type_matched = self.ttype is ttype if not type_matched or values is None: return type_matched - if isinstance(values, basestring): + if isinstance(values, six.string_types): values = set([values]) if regex: if self.ttype is T.Keyword: @@ -136,10 +138,10 @@ def __init__(self, tokens=None): Token.__init__(self, None, None) def __unicode__(self): - return ''.join(unicode(x) for x in self.flatten()) + return ''.join(six.text_type(x) for x in self.flatten()) def __str__(self): - return unicode(self).encode('utf-8') + return six.text_type(self).encode('utf-8') def _get_repr_name(self): return self.__class__.__name__ diff --git a/debug_toolbar/utils/tracking/db.py b/debug_toolbar/utils/tracking/db.py index 01b928abf..c62f8229f 100644 --- a/debug_toolbar/utils/tracking/db.py +++ b/debug_toolbar/utils/tracking/db.py @@ -10,6 +10,7 @@ except ImportError: # django <= 1.4 from django.utils.encoding import force_unicode as force_text, \ smart_str as smart_bytes +from django.utils import six from debug_toolbar.utils import ms_from_timedelta, tidy_stacktrace, \ get_template_info, get_stack @@ -83,7 +84,7 @@ def __init__(self, cursor, db, logger): self.logger = logger def _quote_expr(self, element): - if isinstance(element, basestring): + if isinstance(element, six.string_types): element = element.replace("'", "''") return "'%s'" % element else: @@ -92,7 +93,7 @@ def _quote_expr(self, element): def _quote_params(self, params): if isinstance(params, dict): return dict((key, self._quote_expr(value)) - for key, value in params.iteritems()) + for key, value in six.iteritems(params)) return map(self._quote_expr, params) def _decode(self, param): From 208d02addb6b18e70b7bec9533cb587dc731379a Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Thu, 21 Mar 2013 15:53:30 -0700 Subject: [PATCH 10/14] Updating headers.html template to loop calling headers.items --- debug_toolbar/templates/debug_toolbar/panels/headers.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug_toolbar/templates/debug_toolbar/panels/headers.html b/debug_toolbar/templates/debug_toolbar/panels/headers.html index f25105602..981b8479b 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/headers.html +++ b/debug_toolbar/templates/debug_toolbar/panels/headers.html @@ -7,7 +7,7 @@ - {% for key, value in headers.iteritems %} + {% for key, value in headers.items %} {{ key|escape }} {{ value|escape }} From cf6081336fbfc03e39d1f87cea406e43d787abdf Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Sat, 23 Mar 2013 16:00:55 -0700 Subject: [PATCH 11/14] Using .items in templates.html and version.html --- debug_toolbar/templates/debug_toolbar/panels/templates.html | 2 +- debug_toolbar/templates/debug_toolbar/panels/versions.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debug_toolbar/templates/debug_toolbar/panels/templates.html b/debug_toolbar/templates/debug_toolbar/panels/templates.html index bde09a951..7e44a460e 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/templates.html +++ b/debug_toolbar/templates/debug_toolbar/panels/templates.html @@ -31,7 +31,7 @@

{% blocktrans count templates|length as template_count %}Template{% plural %

{% blocktrans count context_processors|length as context_processors_count %}Context processor{% plural %}Context processors{% endblocktrans %}

{% if context_processors %}
-{% for key, value in context_processors.iteritems %} +{% for key, value in context_processors.items %}
{{ key|escape }}
diff --git a/debug_toolbar/templates/debug_toolbar/panels/versions.html b/debug_toolbar/templates/debug_toolbar/panels/versions.html index 283d0523f..2c614f11c 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/versions.html +++ b/debug_toolbar/templates/debug_toolbar/panels/versions.html @@ -7,7 +7,7 @@ - {% for package, version in versions.iteritems %} + {% for package, version in versions.items %} {{ package }} {{ version }} From 4bd87fc025fadecf9f0a1e5755c65ea97a2913e2 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 25 Mar 2013 09:00:48 -0700 Subject: [PATCH 12/14] Using _thread from django.utils.six.moves --- debug_toolbar/middleware.py | 5 +++-- debug_toolbar/panels/profiling.py | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index 2adad7133..81a8e490a 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -3,9 +3,10 @@ """ import imp try: - import _thread + from django.utils.six.moves import _thread except ImportError: - import thread as _thread # py3k + from django.utils.six.moves import _dummy_thread as _thread + from django.conf import settings from django.http import HttpResponseRedirect diff --git a/debug_toolbar/panels/profiling.py b/debug_toolbar/panels/profiling.py index c183df424..726138881 100644 --- a/debug_toolbar/panels/profiling.py +++ b/debug_toolbar/panels/profiling.py @@ -11,8 +11,7 @@ except ImportError: DJ_PROFILE_USE_LINE_PROFILER = False - -from cStringIO import StringIO +from django.utils.six.moves import StringIO import cProfile from pstats import Stats from colorsys import hsv_to_rgb From 1d2ce49b5297641702c4026e4dbc2a2847d3e755 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 25 Mar 2013 09:01:30 -0700 Subject: [PATCH 13/14] Using keys and values instead of iterkeys, itervalues --- debug_toolbar/templates/debug_toolbar/panels/cache.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/debug_toolbar/templates/debug_toolbar/panels/cache.html b/debug_toolbar/templates/debug_toolbar/panels/cache.html index 889177a33..95794d518 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/cache.html +++ b/debug_toolbar/templates/debug_toolbar/panels/cache.html @@ -22,14 +22,14 @@

{% trans "Commands" %}

- {% for name in counts.iterkeys %} + {% for name in counts.keys %} {% endfor %} - {% for value in counts.itervalues %} + {% for value in counts.values %} {% endfor %} @@ -66,4 +66,4 @@

{% trans "Calls" %}

{% endfor %}
{{ name }}
{{ value }}
-{% endif %} \ No newline at end of file +{% endif %} From 2853ea76be64c67ee0c4372fcde5feab74ca5991 Mon Sep 17 00:00:00 2001 From: Percy Perez Date: Mon, 25 Mar 2013 10:28:18 -0700 Subject: [PATCH 14/14] Using assertEqual instead of assertEquals --- tests/tests.py | 90 +++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/tests/tests.py b/tests/tests.py index 1966ce91d..4f67a2dec 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -65,7 +65,7 @@ class DebugToolbarTestCase(BaseTestCase): def test_middleware(self): with Settings(INTERNAL_IPS=['127.0.0.1'], DEBUG=True): resp = self.client.get('/execute_sql/') - self.assertEquals(resp.status_code, 200) + self.assertEqual(resp.status_code, 200) def test_show_toolbar_DEBUG(self): request = rf.get('/') @@ -110,7 +110,7 @@ def test_request_urlconf_string(self): self.assertFalse(isinstance(request.urlconf, six.string_types)) self.assertTrue(hasattr(request.urlconf.urlpatterns[1], '_callback_str')) - self.assertEquals(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') + self.assertEqual(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') def test_request_urlconf_string_per_request(self): request = rf.get('/') @@ -125,7 +125,7 @@ def test_request_urlconf_string_per_request(self): self.assertFalse(isinstance(request.urlconf, six.string_types)) self.assertTrue(hasattr(request.urlconf.urlpatterns[1], '_callback_str')) - self.assertEquals(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') + self.assertEqual(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') def test_request_urlconf_module(self): request = rf.get('/') @@ -138,7 +138,7 @@ def test_request_urlconf_module(self): self.assertFalse(isinstance(request.urlconf, six.string_types)) self.assertTrue(hasattr(request.urlconf.urlpatterns[1], '_callback_str')) - self.assertEquals(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') + self.assertEqual(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') def test_tuple_urlconf(self): request = rf.get('/') @@ -161,27 +161,27 @@ def _resolve_stats(self, path): def test_url_resolving_positional(self): stats = self._resolve_stats('/resolving1/a/b/') - self.assertEquals(stats['view_urlname'], 'positional-resolving') # Django >= 1.3 - self.assertEquals(stats['view_func'], 'tests.views.resolving_view') - self.assertEquals(stats['view_args'], ('a', 'b')) - self.assertEquals(stats['view_kwargs'], {}) + self.assertEqual(stats['view_urlname'], 'positional-resolving') # Django >= 1.3 + self.assertEqual(stats['view_func'], 'tests.views.resolving_view') + self.assertEqual(stats['view_args'], ('a', 'b')) + self.assertEqual(stats['view_kwargs'], {}) def test_url_resolving_named(self): stats = self._resolve_stats('/resolving2/a/b/') - self.assertEquals(stats['view_args'], ()) - self.assertEquals(stats['view_kwargs'], {'arg1': 'a', 'arg2': 'b'}) + self.assertEqual(stats['view_args'], ()) + self.assertEqual(stats['view_kwargs'], {'arg1': 'a', 'arg2': 'b'}) def test_url_resolving_mixed(self): stats = self._resolve_stats('/resolving3/a/') - self.assertEquals(stats['view_args'], ('a',)) - self.assertEquals(stats['view_kwargs'], {'arg2': 'default'}) + self.assertEqual(stats['view_args'], ('a',)) + self.assertEqual(stats['view_kwargs'], {'arg2': 'default'}) def test_url_resolving_bad(self): stats = self._resolve_stats('/non-existing-url/') - self.assertEquals(stats['view_urlname'], 'None') - self.assertEquals(stats['view_args'], 'None') - self.assertEquals(stats['view_kwargs'], 'None') - self.assertEquals(stats['view_func'], '') + self.assertEqual(stats['view_urlname'], 'None') + self.assertEqual(stats['view_args'], 'None') + self.assertEqual(stats['view_kwargs'], 'None') + self.assertEqual(stats['view_func'], '') class DebugToolbarNameFromObjectTest(BaseTestCase): @@ -189,30 +189,30 @@ def test_func(self): def x(): return 1 res = get_name_from_obj(x) - self.assertEquals(res, 'tests.tests.x') + self.assertEqual(res, 'tests.tests.x') def test_lambda(self): res = get_name_from_obj(lambda: 1) - self.assertEquals(res, 'tests.tests.') + self.assertEqual(res, 'tests.tests.') def test_class(self): class A: pass res = get_name_from_obj(A) - self.assertEquals(res, 'tests.tests.A') + self.assertEqual(res, 'tests.tests.A') class SQLPanelTestCase(BaseTestCase): def test_recording(self): panel = self.toolbar.get_panel(SQLDebugPanel) - self.assertEquals(len(panel._queries), 0) + self.assertEqual(len(panel._queries), 0) list(User.objects.all()) # ensure query was logged - self.assertEquals(len(panel._queries), 1) + self.assertEqual(len(panel._queries), 1) query = panel._queries[0] - self.assertEquals(query[0], 'default') + self.assertEqual(query[0], 'default') self.assertTrue('sql' in query[1]) self.assertTrue('duration' in query[1]) self.assertTrue('stacktrace' in query[1]) @@ -235,21 +235,21 @@ def test_erroneous_query(self): def test_disable_stacktraces(self): panel = self.toolbar.get_panel(SQLDebugPanel) - self.assertEquals(len(panel._queries), 0) + self.assertEqual(len(panel._queries), 0) with Settings(DEBUG_TOOLBAR_CONFIG={'ENABLE_STACKTRACES': False}): list(User.objects.all()) # ensure query was logged - self.assertEquals(len(panel._queries), 1) + self.assertEqual(len(panel._queries), 1) query = panel._queries[0] - self.assertEquals(query[0], 'default') + self.assertEqual(query[0], 'default') self.assertTrue('sql' in query[1]) self.assertTrue('duration' in query[1]) self.assertTrue('stacktrace' in query[1]) # ensure the stacktrace is empty - self.assertEquals([], query[1]['stacktrace']) + self.assertEqual([], query[1]['stacktrace']) class TemplatePanelTestCase(BaseTestCase): @@ -265,7 +265,7 @@ def test_queryset_hook(self): }) t.render(c) # ensure the query was NOT logged - self.assertEquals(len(sql_panel._queries), 0) + self.assertEqual(len(sql_panel._queries), 0) ctx = template_panel.templates[0]['context'][0] self.assertIn('<>', ctx) self.assertIn('<>', ctx) @@ -293,23 +293,23 @@ def test(**kwargs): foo.update(kwargs) self.assertTrue(hasattr(module_func, '__wrapped__')) - self.assertEquals(len(callbacks['before']), 1) + self.assertEqual(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.assertEqual(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.assertEqual(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') + self.assertEqual(foo['kwargs']['foo'], 'bar') callbacks['before'] = {} @@ -318,23 +318,23 @@ def test(**kwargs): foo.update(kwargs) self.assertTrue(hasattr(TrackingTestCase.class_func, '__wrapped__')) - self.assertEquals(len(callbacks['before']), 1) + self.assertEqual(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.assertEqual(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.assertEqual(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') + self.assertEqual(foo['kwargs']['foo'], 'bar') callbacks['before'] = {} @@ -343,13 +343,13 @@ def test(**kwargs): foo.update(kwargs) self.assertTrue(hasattr(TrackingTestCase.class_method, '__wrapped__')) - self.assertEquals(len(callbacks['before']), 1) + self.assertEqual(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.assertEqual(foo['sender'].__name__, 'class_method') self.assertTrue('start' in foo, foo) self.assertTrue('stop' not in foo, foo) self.assertTrue('args' in foo, foo) @@ -362,24 +362,24 @@ def test(**kwargs): foo.update(kwargs) self.assertTrue(hasattr(module_func, '__wrapped__')) - self.assertEquals(len(callbacks['after']), 1) + self.assertEqual(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.assertEqual(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.assertEqual(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') + self.assertEqual(foo['kwargs']['foo'], 'bar') callbacks['after'] = {} @@ -388,21 +388,21 @@ def test(**kwargs): foo.update(kwargs) self.assertTrue(hasattr(TrackingTestCase.class_func, '__wrapped__')) - self.assertEquals(len(callbacks['after']), 1) + self.assertEqual(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.assertEqual(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.assertEqual(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') + self.assertEqual(foo['kwargs']['foo'], 'bar')