diff options
| author | Matt Robenolt <matt@ydekproductions.com> | 2016-07-23 18:37:40 -0700 |
|---|---|---|
| committer | Matt Robenolt <matt@ydekproductions.com> | 2016-07-23 18:48:57 -0700 |
| commit | 570d531bf6281282299bf2e45cc11730e93c3afb (patch) | |
| tree | 633ba41340bb93b62872faadc2621a3a54de9834 | |
| parent | c3e170312df8d5efd64d33a55b7f66496117a86e (diff) | |
| download | raven-rm-rf-six.tar.gz | |
Remove six entirely and unify _compat into utils.compatrm-rf-six
37 files changed, 244 insertions, 319 deletions
diff --git a/raven/_compat.py b/raven/_compat.py deleted file mode 100644 index 3d5e28d..0000000 --- a/raven/_compat.py +++ /dev/null @@ -1,184 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" -# flake8: noqa - -# Copyright (c) 2010-2013 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of -# this software and associated documentation files (the "Software"), to deal in -# the Software without restriction, including without limitation the rights to -# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -# the Software, and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -from __future__ import absolute_import - -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.3.0" - - -PY2 = sys.version_info[0] == 2 - -if not PY2: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -if not PY2: - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" - _iterlists = "lists" -else: - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" - _iterlists = "iterlists" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -def iterkeys(d, **kw): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)(**kw)) - - -def itervalues(d, **kw): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)(**kw)) - - -def iteritems(d, **kw): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)(**kw)) - - -def iterlists(d, **kw): - """Return an iterator over the (key, [values]) pairs of a dictionary.""" - return iter(getattr(d, _iterlists)(**kw)) - - -if not PY2: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") - import io - StringIO = io.StringIO - BytesIO = io.BytesIO -else: - def b(s): # NOQA - return s - - def u(s): # NOQA - return unicode(s, "unicode_escape") - int2byte = chr - import StringIO - StringIO = BytesIO = StringIO.StringIO - - -if not PY2: - import builtins - exec_ = getattr(builtins, "exec") - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - del builtins - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - -def with_metaclass(meta, base=object): - """Create a base class with a metaclass.""" - return meta("NewBase", (base,), {}) - - -def get_code(func): - rv = getattr(func, '__code__', getattr(func, 'func_code', None)) - if rv is None: - raise TypeError('Could not get code from %r' % type(func).__name__) - return rv diff --git a/raven/base.py b/raven/base.py index bae7584..da8d1fb 100644 --- a/raven/base.py +++ b/raven/base.py @@ -34,7 +34,7 @@ from raven.conf import defaults from raven.conf.remote import RemoteConfig from raven.exceptions import APIError, RateLimited from raven.utils import json, get_versions, get_auth_header, merge_dicts -from raven._compat import text_type, iteritems +from raven.utils.compat import text_type, iteritems from raven.utils.encoding import to_unicode from raven.utils.serializer import transform from raven.utils.stacks import get_stack_info, iter_stack_frames, get_culprit diff --git a/raven/breadcrumbs.py b/raven/breadcrumbs.py index 96d33ef..2739637 100644 --- a/raven/breadcrumbs.py +++ b/raven/breadcrumbs.py @@ -4,7 +4,7 @@ import time import logging from types import FunctionType -from raven._compat import iteritems, get_code, text_type, string_types +from raven.utils.compat import iteritems, get_code, text_type, string_types from raven.utils import once diff --git a/raven/conf/remote.py b/raven/conf/remote.py index f091831..3c62690 100644 --- a/raven/conf/remote.py +++ b/raven/conf/remote.py @@ -2,7 +2,7 @@ from __future__ import absolute_import import warnings -from raven._compat import PY2, text_type +from raven.utils.compat import PY2, text_type from raven.exceptions import InvalidDsn from raven.transport.threaded import ThreadedHTTPTransport from raven.utils.encoding import to_string diff --git a/raven/context.py b/raven/context.py index d4a64b9..272259a 100644 --- a/raven/context.py +++ b/raven/context.py @@ -11,7 +11,7 @@ from collections import Mapping, Iterable from threading import local from weakref import ref as weakref -from raven._compat import iteritems +from raven.utils.compat import iteritems try: from thread import get_ident as get_thread_ident diff --git a/raven/contrib/bottle/utils.py b/raven/contrib/bottle/utils.py index d19903b..fe7b189 100644 --- a/raven/contrib/bottle/utils.py +++ b/raven/contrib/bottle/utils.py @@ -8,7 +8,7 @@ raven.contrib.bottle.utils from __future__ import absolute_import import logging -from raven.utils.compat import _urlparse +from raven.utils.compat import urlparse from raven.utils.wsgi import get_headers, get_environ @@ -16,7 +16,7 @@ logger = logging.getLogger(__name__) def get_data_from_request(request): - urlparts = _urlparse.urlsplit(request.url) + urlparts = urlparse.urlsplit(request.url) try: form_dict = request.forms.dict diff --git a/raven/contrib/django/client.py b/raven/contrib/django/client.py index ad2f6e4..653b164 100644 --- a/raven/contrib/django/client.py +++ b/raven/contrib/django/client.py @@ -30,7 +30,7 @@ from raven.contrib.django.middleware import SentryLogMiddleware from raven.utils.wsgi import get_headers, get_environ from raven.utils import once from raven import breadcrumbs -from raven._compat import string_types, binary_type +from raven.utils.compat import string_types, binary_type __all__ = ('DjangoClient',) diff --git a/raven/contrib/django/models.py b/raven/contrib/django/models.py index 490978a..b1319f4 100644 --- a/raven/contrib/django/models.py +++ b/raven/contrib/django/models.py @@ -19,7 +19,7 @@ import warnings from django.conf import settings from hashlib import md5 -from raven._compat import PY2, binary_type, text_type, string_types +from raven.utils.compat import PY2, binary_type, text_type, string_types from raven.utils.imports import import_string from raven.contrib.django.management import patch_cli_runner diff --git a/raven/contrib/django/serializers.py b/raven/contrib/django/serializers.py index 50c0236..8965e1b 100644 --- a/raven/contrib/django/serializers.py +++ b/raven/contrib/django/serializers.py @@ -12,7 +12,7 @@ from django.conf import settings from django.http import HttpRequest from django.utils.functional import Promise from raven.utils.serializer import Serializer, register -from raven._compat import text_type +from raven.utils.compat import text_type __all__ = ('PromiseSerializer',) diff --git a/raven/contrib/django/views.py b/raven/contrib/django/views.py index aabbd71..2e7dd6d 100644 --- a/raven/contrib/django/views.py +++ b/raven/contrib/django/views.py @@ -15,7 +15,7 @@ from django.views.decorators.cache import never_cache from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_http_methods -from raven._compat import string_types +from raven.utils.compat import string_types from raven.contrib.django.models import client from raven.utils import json diff --git a/raven/contrib/flask.py b/raven/contrib/flask.py index c23b92b..dd18c3c 100644 --- a/raven/contrib/flask.py +++ b/raven/contrib/flask.py @@ -23,12 +23,11 @@ from flask import request, current_app, g from flask.signals import got_request_exception, request_finished from werkzeug.exceptions import ClientDisconnected -from raven._compat import string_types +from raven.utils.compat import string_types, urlparse from raven.conf import setup_logging from raven.base import Client from raven.middleware import Sentry as SentryMiddleware from raven.handlers.logging import SentryHandler -from raven.utils.compat import _urlparse from raven.utils.encoding import to_unicode from raven.utils.imports import import_string from raven.utils.wsgi import get_headers, get_environ @@ -209,7 +208,7 @@ class Sentry(object): if retriever is None: retriever = self.get_form_data - urlparts = _urlparse.urlsplit(request.url) + urlparts = urlparse.urlsplit(request.url) try: data = retriever(request) diff --git a/raven/exceptions.py b/raven/exceptions.py index ddf5f60..505c23e 100644 --- a/raven/exceptions.py +++ b/raven/exceptions.py @@ -1,6 +1,6 @@ from __future__ import absolute_import -from raven._compat import text_type +from raven.utils.compat import text_type class APIError(Exception): diff --git a/raven/handlers/logbook.py b/raven/handlers/logbook.py index 1edd2de..cd9ae94 100644 --- a/raven/handlers/logbook.py +++ b/raven/handlers/logbook.py @@ -13,7 +13,7 @@ import logbook import sys import traceback -from raven._compat import string_types +from raven.utils.compat import string_types from raven.base import Client from raven.utils.encoding import to_string diff --git a/raven/handlers/logging.py b/raven/handlers/logging.py index cc82550..60a82f4 100644 --- a/raven/handlers/logging.py +++ b/raven/handlers/logging.py @@ -14,7 +14,7 @@ import logging import sys import traceback -from raven._compat import string_types, iteritems, text_type +from raven.utils.compat import string_types, iteritems, text_type from raven.base import Client from raven.utils.encoding import to_string from raven.utils.stacks import iter_stack_frames, label_from_frame diff --git a/raven/middleware.py b/raven/middleware.py index 4607489..2dad6c2 100644 --- a/raven/middleware.py +++ b/raven/middleware.py @@ -7,6 +7,7 @@ raven.middleware """ from __future__ import absolute_import +from raven.utils.compat import callable from raven.utils.wsgi import ( get_current_url, get_headers, get_environ) diff --git a/raven/processors.py b/raven/processors.py index 9df2a04..7180ab4 100644 --- a/raven/processors.py +++ b/raven/processors.py @@ -9,7 +9,7 @@ from __future__ import absolute_import import re -from raven._compat import string_types, text_type +from raven.utils.compat import string_types, text_type from raven.utils import varmap diff --git a/raven/transport/http.py b/raven/transport/http.py index fd84056..38b92de 100644 --- a/raven/transport/http.py +++ b/raven/transport/http.py @@ -7,12 +7,11 @@ raven.transport.http """ from __future__ import absolute_import -from raven._compat import string_types +from raven.utils.compat import string_types, urllib2 from raven.conf import defaults from raven.exceptions import APIError, RateLimited from raven.transport.base import Transport from raven.utils.http import urlopen -from raven.utils.compat import urllib2 class HTTPTransport(Transport): diff --git a/raven/transport/twisted.py b/raven/transport/twisted.py index c087718..a0e5e9f 100644 --- a/raven/transport/twisted.py +++ b/raven/transport/twisted.py @@ -7,8 +7,8 @@ raven.transport.twisted """ from __future__ import absolute_import -import io +from raven.utils.compat import BytesIO from raven.transport.base import AsyncTransport from raven.transport.http import HTTPTransport @@ -41,7 +41,7 @@ class TwistedHTTPTransport(AsyncTransport, HTTPTransport): def async_send(self, data, headers, success_cb, failure_cb): d = self._agent.request( b"POST", self._url, - bodyProducer=FileBodyProducer(io.BytesIO(data)), + bodyProducer=FileBodyProducer(BytesIO(data)), headers=Headers(dict((k, [v]) for k, v in headers.items())) ) diff --git a/raven/utils/__init__.py b/raven/utils/__init__.py index c22f0bc..62b29fd 100644 --- a/raven/utils/__init__.py +++ b/raven/utils/__init__.py @@ -7,7 +7,7 @@ raven.utils """ from __future__ import absolute_import -from raven._compat import iteritems, string_types +from raven.utils.compat import iteritems, string_types import logging import threading from functools import update_wrapper diff --git a/raven/utils/compat.py b/raven/utils/compat.py index 5b31a8e..ef8e170 100644 --- a/raven/utils/compat.py +++ b/raven/utils/compat.py @@ -2,50 +2,165 @@ raven.utils.compat ~~~~~~~~~~~~~~~~~~ -:copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details. +:copyright: (c) 2010-2016 by the Sentry Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. + +Utilities for writing code that runs on Python 2 and 3 """ +# flake8: noqa + +# Copyright (c) 2010-2013 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from __future__ import absolute_import +import operator +import sys +import types -try: - from urllib.error import HTTPError -except ImportError: - from urllib2 import HTTPError # NOQA +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 -try: - import httplib # NOQA -except ImportError: - from http import client as httplib # NOQA +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str -try: - import urllib.request as urllib2 -except ImportError: - import urllib2 - -Request = urllib2.Request -urlopen = urllib2.urlopen try: - from urllib import quote as urllib_quote -except ImportError: - from urllib.parse import quote as urllib_quote # NOQA + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + import io + StringIO = io.StringIO + BytesIO = io.BytesIO +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + import StringIO + StringIO = BytesIO = StringIO.StringIO + + +if PY3: + exec_ = getattr(__import__('builtins'), 'exec') + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") -try: +if PY3: + from urllib.error import HTTPError + from http import client as httplib + import urllib.request as urllib2 from queue import Queue -except ImportError: - from Queue import Queue # NOQA - + from urllib.parse import quote as urllib_quote + from urllib import parse as urlparse +else: + from urllib2 import HTTPError + import httplib + import urllib2 + from Queue import Queue + from urllib import quote as urllib_quote + import urlparse -try: - import urlparse as _urlparse -except ImportError: - from urllib import parse as _urlparse # NOQA -urlparse = _urlparse +def get_code(func): + rv = getattr(func, '__code__', getattr(func, 'func_code', None)) + if rv is None: + raise TypeError('Could not get code from %r' % type(func).__name__) + return rv def check_threads(): diff --git a/raven/utils/encoding.py b/raven/utils/encoding.py index cf8bca5..44fe567 100644 --- a/raven/utils/encoding.py +++ b/raven/utils/encoding.py @@ -9,7 +9,7 @@ from __future__ import absolute_import, unicode_literals import warnings -from raven._compat import integer_types, text_type, binary_type, \ +from raven.utils.compat import integer_types, text_type, binary_type, \ string_types, PY2 diff --git a/raven/utils/imports.py b/raven/utils/imports.py index 8086fc3..fc0dce9 100644 --- a/raven/utils/imports.py +++ b/raven/utils/imports.py @@ -1,6 +1,6 @@ from __future__ import absolute_import -from raven._compat import PY2 +from raven.utils.compat import PY2 def import_string(key): diff --git a/raven/utils/serializer/base.py b/raven/utils/serializer/base.py index 1a5f32e..06753b2 100644 --- a/raven/utils/serializer/base.py +++ b/raven/utils/serializer/base.py @@ -11,8 +11,8 @@ from __future__ import absolute_import import itertools import types -from raven._compat import text_type, binary_type, string_types, iteritems, \ - class_types, PY2 +from raven.utils.compat import text_type, binary_type, string_types, iteritems, \ + class_types, PY2, PY3 from raven.utils.encoding import to_unicode from .manager import manager as serialization_manager @@ -113,7 +113,7 @@ class StringSerializer(Serializer): def serialize(self, value, **kwargs): string_max_length = kwargs.get('string_max_length', None) - if not PY2: + if PY3: return repr(value[:string_max_length]) try: diff --git a/raven/utils/serializer/manager.py b/raven/utils/serializer/manager.py index 7343111..bf22cc8 100644 --- a/raven/utils/serializer/manager.py +++ b/raven/utils/serializer/manager.py @@ -9,7 +9,7 @@ from __future__ import absolute_import import logging from contextlib import closing -from raven._compat import text_type +from raven.utils.compat import text_type __all__ = ('register', 'transform') diff --git a/raven/utils/stacks.py b/raven/utils/stacks.py index 6c17cad..779ff08 100644 --- a/raven/utils/stacks.py +++ b/raven/utils/stacks.py @@ -14,7 +14,7 @@ import sys import warnings from raven.utils.serializer import transform -from raven._compat import iteritems +from raven.utils.compat import iteritems _coding_re = re.compile(r'coding[:=]\s*([-\w.]+)') diff --git a/raven/utils/wsgi.py b/raven/utils/wsgi.py index 24a8e81..f68bd5e 100644 --- a/raven/utils/wsgi.py +++ b/raven/utils/wsgi.py @@ -6,8 +6,7 @@ This module implements WSGI related helpers adapted from ``werkzeug.wsgi`` """ from __future__ import absolute_import -from raven._compat import iteritems -from raven.utils.compat import urllib_quote +from raven.utils.compat import iteritems, urllib_quote # `get_headers` comes from `werkzeug.datastructures.EnvironHeaders` diff --git a/raven/versioning.py b/raven/versioning.py index 993a238..6684851 100644 --- a/raven/versioning.py +++ b/raven/versioning.py @@ -8,7 +8,7 @@ except ImportError: # pkg_resource is not available on Google App Engine pkg_resources = None -from raven._compat import text_type +from raven.utils.compat import text_type from .exceptions import InvalidGitRepository __all__ = ('fetch_git_sha', 'fetch_package_version') @@ -53,7 +53,6 @@ if sys.version_info[0] == 3: install_requires.remove('contextlib2') tests_require = [ - 'six', 'bottle', 'celery>=2.5', 'Django>=1.4', diff --git a/tests/base/tests.py b/tests/base/tests.py index 83a1242..9686690 100644 --- a/tests/base/tests.py +++ b/tests/base/tests.py @@ -5,9 +5,9 @@ import inspect import mock import raven import time -import six import os +from raven.utils.compat import PY3 from raven.base import Client, ClientState from raven.exceptions import RateLimited from raven.transport import AsyncTransport @@ -505,7 +505,7 @@ class ClientTest(TestCase): self.assertEquals(len(self.client.events), 1) event = self.client.events.pop(0) - if six.PY3: + if PY3: expected = {'logger': "'test'", 'foo': "'bar'"} else: expected = {'logger': "u'test'", 'foo': "u'bar'"} diff --git a/tests/contrib/django/tests.py b/tests/contrib/django/tests.py index 8d96ec1..e0c4fa9 100644 --- a/tests/contrib/django/tests.py +++ b/tests/contrib/django/tests.py @@ -9,10 +9,8 @@ import logging import mock import pytest import re -import six import sys # NOQA from exam import fixture -from six import StringIO from django.conf import settings from django.contrib.auth.models import User @@ -26,6 +24,7 @@ from django.test import TestCase from django.utils.translation import gettext_lazy from raven.base import Client +from raven.utils.compat import StringIO, iteritems, PY3, string_types, text_type from raven.contrib.django.client import DjangoClient from raven.contrib.django.celery import CeleryClient from raven.contrib.django.handlers import SentryHandler @@ -99,12 +98,12 @@ class Settings(object): self._orig = {} def __enter__(self): - for k, v in six.iteritems(self.overrides): + for k, v in 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 six.iteritems(self._orig): + for k, v in iteritems(self._orig): if v is self.NotDefined: delattr(settings, k) else: @@ -338,7 +337,7 @@ class DjangoClientTest(TestCase): # assert event['data']['META']['REMOTE_ADDR'] == '127.0.0.1' # TODO: Python bug #10805 - @pytest.mark.skipif(str('six.PY3')) + @pytest.mark.skipif(str('PY3')) def test_record_none_exc_info(self): # sys.exc_info can return (None, None, None) if no exception is being # handled anywhere on the stack. See: @@ -694,9 +693,9 @@ class PromiseSerializerTestCase(TestCase): def test_basic(self): from django.utils.functional import lazy - obj = lazy(lambda: 'bar', six.text_type)() + obj = lazy(lambda: 'bar', text_type)() res = transform(obj) - expected = "'bar'" if six.PY3 else "u'bar'" + expected = "'bar'" if PY3 else "u'bar'" assert res == expected def test_handles_gettext_lazy(self): @@ -705,17 +704,17 @@ class PromiseSerializerTestCase(TestCase): def fake_gettext(to_translate): return 'Igpay Atinlay' - fake_gettext_lazy = lazy(fake_gettext, six.text_type) + fake_gettext_lazy = lazy(fake_gettext, text_type) result = transform(fake_gettext_lazy("something")) - assert isinstance(result, six.string_types) - expected = "'Igpay Atinlay'" if six.PY3 else "u'Igpay Atinlay'" + assert isinstance(result, string_types) + expected = "'Igpay Atinlay'" if PY3 else "u'Igpay Atinlay'" assert result == expected def test_real_gettext_lazy(self): - d = {six.text_type('lazy_translation'): gettext_lazy(six.text_type('testing'))} - key = "'lazy_translation'" if six.PY3 else "u'lazy_translation'" - value = "'testing'" if six.PY3 else "u'testing'" + d = {text_type('lazy_translation'): gettext_lazy(text_type('testing'))} + key = "'lazy_translation'" if PY3 else "u'lazy_translation'" + value = "'testing'" if PY3 else "u'testing'" assert transform(d) == {key: value} @@ -724,7 +723,7 @@ class ModelInstanceSerializerTestCase(TestCase): instance = TestModel() result = transform(instance) - assert isinstance(result, six.string_types) + assert isinstance(result, string_types) assert result == '<TestModel: TestModel object>' @@ -734,7 +733,7 @@ class QuerySetSerializerTestCase(TestCase): obj = QuerySet(model=TestModel) result = transform(obj) - assert isinstance(result, six.string_types) + assert isinstance(result, string_types) assert result == '<QuerySet: model=TestModel>' @@ -772,7 +771,7 @@ class SentryExceptionHandlerTest(TestCase): def test_ignore_exceptions_with_expression_match(self, get_option, exc_info, captureException): exc_info.return_value = self.exc_info get_option.return_value = ['builtins.*'] - if not six.PY3: + if not PY3: get_option.return_value = ['exceptions.*'] sentry_exception_handler(request=self.request) @@ -785,7 +784,7 @@ class SentryExceptionHandlerTest(TestCase): def test_ignore_exceptions_with_module_match(self, get_option, exc_info, captureException): exc_info.return_value = self.exc_info get_option.return_value = ['builtins.ValueError'] - if not six.PY3: + if not PY3: get_option.return_value = ['exceptions.ValueError'] sentry_exception_handler(request=self.request) diff --git a/tests/contrib/tornado/tests.py b/tests/contrib/tornado/tests.py index d50253b..fe7977c 100644 --- a/tests/contrib/tornado/tests.py +++ b/tests/contrib/tornado/tests.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -import six from mock import patch from tornado import web, gen, testing from tornado.concurrent import Future from tornado.httpclient import HTTPError +from raven.utils import compat from raven.contrib.tornado import SentryMixin, AsyncSentryClient @@ -125,7 +125,7 @@ class TornadoAsyncClientTestCase(testing.AsyncHTTPTestCase): self.assertEqual(user_data['is_authenticated'], False) assert 'extra_data' in kwargs['extra'] - if six.PY3: + if compat.PY3: expected = "'extra custom non-dict data'" else: expected = "u'extra custom non-dict data'" @@ -153,7 +153,7 @@ class TornadoAsyncClientTestCase(testing.AsyncHTTPTestCase): self.assertEqual(user_data['is_authenticated'], False) assert 'extra_data' in kwargs['extra'] - if six.PY3: + if compat.PY3: expected = "'extra custom dict data'" else: expected = "u'extra custom dict data'" diff --git a/tests/handlers/logbook/tests.py b/tests/handlers/logbook/tests.py index c381017..dd0740f 100644 --- a/tests/handlers/logbook/tests.py +++ b/tests/handlers/logbook/tests.py @@ -1,8 +1,8 @@ from __future__ import with_statement from __future__ import unicode_literals -import six import logbook +from raven.utils import compat from raven.utils.testutils import TestCase from raven.base import Client from raven.handlers.logbook import SentryHandler @@ -60,7 +60,7 @@ class LogbookHandlerTest(TestCase): )) self.assertEquals(len(client.events), 1) event = client.events.pop(0) - if six.PY3: + if compat.PY3: expected = "'http://example.com'" else: expected = "u'http://example.com'" @@ -98,7 +98,7 @@ class LogbookHandlerTest(TestCase): self.assertTrue('sentry.interfaces.Message' in event) msg = event['sentry.interfaces.Message'] self.assertEquals(msg['message'], 'This is a test of {0}') - expected = ("'args'",) if six.PY3 else ("u'args'",) + expected = ("'args'",) if compat.PY3 else ("u'args'",) self.assertEquals(msg['params'], expected) def test_client_arg(self): diff --git a/tests/handlers/logging/tests.py b/tests/handlers/logging/tests.py index 76b24e2..90b2813 100644 --- a/tests/handlers/logging/tests.py +++ b/tests/handlers/logging/tests.py @@ -3,8 +3,8 @@ from __future__ import unicode_literals import logging import sys import mock -import six +from raven.utils import compat from raven.base import Client from raven.handlers.logging import SentryHandler from raven.utils.stacks import iter_stack_frames @@ -31,7 +31,7 @@ class LoggingIntegrationTest(TestCase): def make_record(self, msg, args=(), level=logging.INFO, extra=None, exc_info=None, name='root', pathname=__file__): record = logging.LogRecord(name, level, pathname, 27, msg, args, exc_info, 'make_record') if extra: - for key, value in six.iteritems(extra): + for key, value in compat.iteritems(extra): record.__dict__[key] = value return record @@ -96,7 +96,7 @@ class LoggingIntegrationTest(TestCase): self.assertEqual(len(self.client.events), 1) event = self.client.events.pop(0) - if six.PY3: + if compat.PY3: expected = "'http://example.com'" else: expected = "u'http://example.com'" @@ -134,7 +134,7 @@ class LoggingIntegrationTest(TestCase): self.assertEqual(event['message'], 'This is a test of args') msg = event['sentry.interfaces.Message'] self.assertEqual(msg['message'], 'This is a test of %s') - expected = ("'args'",) if six.PY3 else ("u'args'",) + expected = ("'args'",) if compat.PY3 else ("u'args'",) self.assertEqual(msg['params'], expected) def test_record_stack(self): @@ -193,7 +193,7 @@ class LoggingIntegrationTest(TestCase): self.assertEqual(len(self.client.events), 1) event = self.client.events.pop(0) - expected = "'foo'" if six.PY3 else "u'foo'" + expected = "'foo'" if compat.PY3 else "u'foo'" self.assertEqual(event['extra']['data'], expected) def test_tags(self): diff --git a/tests/utils/encoding/tests.py b/tests/utils/encoding/tests.py index 2b063a7..50c186a 100644 --- a/tests/utils/encoding/tests.py +++ b/tests/utils/encoding/tests.py @@ -1,67 +1,67 @@ # -*- coding: utf-8 -*- import pytest import uuid -import six +from raven.utils import compat from raven.utils import json from raven.utils.testutils import TestCase from raven.utils.serializer import transform class TransformTest(TestCase): - @pytest.mark.skipif('six.PY3') + @pytest.mark.skipif('compat.PY3') def test_incorrect_unicode(self): - x = six.b('רונית מגן') + x = compat.b('רונית מגן') result = transform(x) - assert result == six.b("'רונית מגן'") + assert result == compat.b("'רונית מגן'") - @pytest.mark.skipif('six.PY3') + @pytest.mark.skipif('compat.PY3') def test_truncating_unicode(self): # 'רונית מגן' - x = six.u('\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df') + x = compat.u('\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df') result = transform(x, string_max_length=5) - assert result == six.u("u'\u05e8\u05d5\u05e0\u05d9\u05ea'") + assert result == compat.u("u'\u05e8\u05d5\u05e0\u05d9\u05ea'") - @pytest.mark.skipif('not six.PY3') + @pytest.mark.skipif('not compat.PY3') def test_unicode_in_python3(self): # 'רונית מגן' - x = six.u('\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df') + x = compat.u('\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df') result = transform(x) - assert result == six.u("'\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df'") + assert result == compat.u("'\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df'") - @pytest.mark.skipif('six.PY3') + @pytest.mark.skipif('compat.PY3') def test_unicode_in_python2(self): # 'רונית מגן' - x = six.u('\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df') + x = compat.u('\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df') result = transform(x) - assert result == six.u("u'\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df'") + assert result == compat.u("u'\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df'") - @pytest.mark.skipif('not six.PY3') + @pytest.mark.skipif('not compat.PY3') def test_string_in_python3(self): # 'רונית מגן' - x = six.b('hello world') + x = compat.b('hello world') result = transform(x) assert result == "b'hello world'" - @pytest.mark.skipif('six.PY3') + @pytest.mark.skipif('compat.PY3') def test_string_in_python2(self): # 'רונית מגן' - x = six.b('hello world') + x = compat.b('hello world') result = transform(x) assert result == "'hello world'" - @pytest.mark.skipif('six.PY3') + @pytest.mark.skipif('compat.PY3') def test_bad_string(self): - x = six.b('The following character causes problems: \xd4') + x = compat.b('The following character causes problems: \xd4') result = transform(x) - assert result == six.b("'The following character causes problems: \\xd4'") + assert result == compat.b("'The following character causes problems: \\xd4'") def test_float(self): result = transform(13.0) @@ -91,7 +91,7 @@ class TransformTest(TestCase): self.assertTrue(type(keys[0]), str) self.assertEqual(keys[0], "'foo'") - @pytest.mark.skipif('six.PY3') + @pytest.mark.skipif('compat.PY3') def test_dict_keys_utf8_as_str(self): x = {'רונית מגן': 'bar'} @@ -103,14 +103,14 @@ class TransformTest(TestCase): def test_dict_keys_utf8_as_unicode(self): x = { - six.text_type('\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df'): 'bar' + compat.text_type('\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df'): 'bar' } result = transform(x) assert type(result) is dict keys = list(result.keys()) assert len(keys) == 1 - if six.PY3: + if compat.PY3: expected = "'\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df'" else: expected = "u'\u05e8\u05d5\u05e0\u05d9\u05ea \u05de\u05d2\u05df'" @@ -121,15 +121,15 @@ class TransformTest(TestCase): result = transform(x) assert result == repr(x) - @pytest.mark.skipif('six.PY3') + @pytest.mark.skipif('compat.PY3') def test_recurse_exception(self): class NonAsciiRepr(object): def __repr__(self): - return six.b('中文') + return compat.b('中文') x = [NonAsciiRepr()] result = transform(x, max_depth=1) - self.assertEqual(json.dumps(result), six.b('["<class \'tests.utils.encoding.tests.NonAsciiRepr\'>"]')) + self.assertEqual(json.dumps(result), compat.b('["<class \'tests.utils.encoding.tests.NonAsciiRepr\'>"]')) def test_recursive(self): x = [] @@ -141,12 +141,12 @@ class TransformTest(TestCase): def test_custom_repr(self): class Foo(object): def __sentry__(self): - return six.u('example') + return compat.u('example') x = Foo() result = transform(x) - if six.PY3: + if compat.PY3: expected = "'example'" else: expected = "u'example'" @@ -167,7 +167,7 @@ class TransformTest(TestCase): def test_recursion_max_depth(self): x = [[[[1]]]] result = transform(x, max_depth=3) - if six.PY3: + if compat.PY3: expected = ((("'[1]'",),),) else: expected = ((("u'[1]'",),),) @@ -185,15 +185,15 @@ class TransformTest(TestCase): self.assertEqual(len(result), 3) def test_string_max_length(self): - x = six.u('1234') + x = compat.u('1234') result = transform(x, string_max_length=3) - expected = "'123'" if six.PY3 else "u'123'" + expected = "'123'" if compat.PY3 else "u'123'" self.assertEqual(result, expected) def test_bytes_max_length(self): - x = six.b('\xd7\xd7\xd7\xd7\xd7\xd7') + x = compat.b('\xd7\xd7\xd7\xd7\xd7\xd7') result = transform(x, string_max_length=1) - if six.PY3: + if compat.PY3: assert result == "b'\\xd7'" else: assert result == "'\\xd7'" diff --git a/tests/utils/stacks/tests.py b/tests/utils/stacks/tests.py index 4d1bc36..8f59c27 100644 --- a/tests/utils/stacks/tests.py +++ b/tests/utils/stacks/tests.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -import six from mock import Mock +from raven.utils.compat import iterkeys, PY3 from raven.utils.testutils import TestCase - from raven.utils.stacks import get_culprit, get_stack_info, get_lines_from_file @@ -15,7 +14,7 @@ class Context(object): __getitem__ = lambda s, *a: s.dict.__getitem__(*a) __setitem__ = lambda s, *a: s.dict.__setitem__(*a) - iterkeys = lambda s, *a: six.iterkeys(s.dict, *a) + iterkeys = lambda s, *a: iterkeys(s.dict, *a) class GetCulpritTest(TestCase): @@ -62,7 +61,7 @@ class GetStackInfoTest(TestCase): assert len(results['frames']) == 1 result = results['frames'][0] assert 'vars' in result - if six.PY3: + if PY3: expected = { "foo": "'bar'", "biz": "'baz'", diff --git a/tests/utils/test_imports.py b/tests/utils/test_imports.py index 12d9dc9..f239606 100644 --- a/tests/utils/test_imports.py +++ b/tests/utils/test_imports.py @@ -1,9 +1,8 @@ from __future__ import absolute_import -import six - import raven +from raven.utils import compat from raven.utils.imports import import_string @@ -12,12 +11,12 @@ def test_import_string(): assert new_raven is raven # this will test unicode on python2 - new_raven = import_string(six.text_type('raven')) + new_raven = import_string(compat.text_type('raven')) assert new_raven is raven new_client = import_string('raven.Client') assert new_client is raven.Client # this will test unicode on python2 - new_client = import_string(six.text_type('raven.Client')) + new_client = import_string(compat.text_type('raven.Client')) assert new_client is raven.Client diff --git a/tests/versioning/tests.py b/tests/versioning/tests.py index b3b49cb..73999ca 100644 --- a/tests/versioning/tests.py +++ b/tests/versioning/tests.py @@ -3,10 +3,10 @@ from __future__ import absolute_import import os.path import pytest import subprocess -import six from django.conf import settings +from raven.utils import compat from raven.versioning import fetch_git_sha, fetch_package_version @@ -28,7 +28,7 @@ def test_fetch_git_sha(): result = fetch_git_sha(settings.PROJECT_ROOT) assert result is not None assert len(result) == 40 - assert isinstance(result, six.string_types) + assert isinstance(result, compat.string_types) assert result == check_output( 'git rev-parse --verify HEAD', shell=True, cwd=settings.PROJECT_ROOT ).decode('latin1').strip() @@ -37,4 +37,4 @@ def test_fetch_git_sha(): def test_fetch_package_version(): result = fetch_package_version('raven') assert result is not None - assert isinstance(result, six.string_types) + assert isinstance(result, compat.string_types) |
