summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Robenolt <matt@ydekproductions.com>2016-07-23 18:37:40 -0700
committerMatt Robenolt <matt@ydekproductions.com>2016-07-23 18:48:57 -0700
commit570d531bf6281282299bf2e45cc11730e93c3afb (patch)
tree633ba41340bb93b62872faadc2621a3a54de9834
parentc3e170312df8d5efd64d33a55b7f66496117a86e (diff)
downloadraven-rm-rf-six.tar.gz
Remove six entirely and unify _compat into utils.compatrm-rf-six
-rw-r--r--raven/_compat.py184
-rw-r--r--raven/base.py2
-rw-r--r--raven/breadcrumbs.py2
-rw-r--r--raven/conf/remote.py2
-rw-r--r--raven/context.py2
-rw-r--r--raven/contrib/bottle/utils.py4
-rw-r--r--raven/contrib/django/client.py2
-rw-r--r--raven/contrib/django/models.py2
-rw-r--r--raven/contrib/django/serializers.py2
-rw-r--r--raven/contrib/django/views.py2
-rw-r--r--raven/contrib/flask.py5
-rw-r--r--raven/exceptions.py2
-rw-r--r--raven/handlers/logbook.py2
-rw-r--r--raven/handlers/logging.py2
-rw-r--r--raven/middleware.py1
-rw-r--r--raven/processors.py2
-rw-r--r--raven/transport/http.py3
-rw-r--r--raven/transport/twisted.py4
-rw-r--r--raven/utils/__init__.py2
-rw-r--r--raven/utils/compat.py171
-rw-r--r--raven/utils/encoding.py2
-rw-r--r--raven/utils/imports.py2
-rw-r--r--raven/utils/serializer/base.py6
-rw-r--r--raven/utils/serializer/manager.py2
-rw-r--r--raven/utils/stacks.py2
-rw-r--r--raven/utils/wsgi.py3
-rw-r--r--raven/versioning.py2
-rwxr-xr-xsetup.py1
-rw-r--r--tests/base/tests.py4
-rw-r--r--tests/contrib/django/tests.py33
-rw-r--r--tests/contrib/tornado/tests.py6
-rw-r--r--tests/handlers/logbook/tests.py6
-rw-r--r--tests/handlers/logging/tests.py10
-rw-r--r--tests/utils/encoding/tests.py66
-rw-r--r--tests/utils/stacks/tests.py7
-rw-r--r--tests/utils/test_imports.py7
-rw-r--r--tests/versioning/tests.py6
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')
diff --git a/setup.py b/setup.py
index f7063ea..f39ca86 100755
--- a/setup.py
+++ b/setup.py
@@ -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)