Hello community,

here is the log from the commit of package python3-raven for openSUSE:Factory 
checked in at 2015-10-14 16:44:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-raven (Old)
 and      /work/SRC/openSUSE:Factory/.python3-raven.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python3-raven"

Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-raven/python3-raven.changes      
2015-09-30 05:49:30.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python3-raven.new/python3-raven.changes 
2015-10-14 16:44:14.000000000 +0200
@@ -1,0 +2,26 @@
+Tue Oct  6 03:10:59 UTC 2015 - [email protected]
+
+- update to version 5.7.2:
+  * Handle passing "fingerprint" through logging handler.
+
+- changes from version 5.7.1:
+  * Correctly handle SHAs in .git/HEAD.
+  * Fixed several cases of invalid Python3 syntax.
+
+- changes from version 5.7.0:
+  * Reverted changes to Celery which incorrectly caused some configurations
+    to log unwanted messages.
+  * Improved behavior in "fetch_git_sha".
+  * Removed "is_authenticated" property from most integrations.
+  * Better error handling for errors within Flask context.
+  * Support for new versions of Flask-Login.
+  * Update Tornado support for modern versions.
+  * Update stacktrace truncation code to match current versions of Sentry 
server.
+
+- changes from version 5.6.0:
+  * Content is no longer base64-encoded.
+  * "fingerprint" is now correctly supported.
+  * Django: 1.9 compatibility.
+  * Celery: Filter "celery.redirect" logger.
+
+-------------------------------------------------------------------

Old:
----
  raven-5.5.0.tar.gz

New:
----
  raven-5.7.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python3-raven.spec ++++++
--- /var/tmp/diff_new_pack.HTI8SN/_old  2015-10-14 16:44:15.000000000 +0200
+++ /var/tmp/diff_new_pack.HTI8SN/_new  2015-10-14 16:44:15.000000000 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           python3-raven
-Version:        5.5.0
+Version:        5.7.2
 Release:        0
 Url:            https://pypi.python.org/pypi/raven
 Summary:        A client for Sentry

++++++ raven-5.5.0.tar.gz -> raven-5.7.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/PKG-INFO new/raven-5.7.2/PKG-INFO
--- old/raven-5.5.0/PKG-INFO    2015-07-22 17:02:21.000000000 +0200
+++ new/raven-5.7.2/PKG-INFO    2015-09-19 01:06:56.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: raven
-Version: 5.5.0
+Version: 5.7.2
 Summary: Raven is a client for Sentry (https://www.getsentry.com)
 Home-page: https://github.com/getsentry/raven-python
 Author: David Cramer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/base.py 
new/raven-5.7.2/raven/base.py
--- old/raven-5.5.0/raven/base.py       2015-07-16 08:09:12.000000000 +0200
+++ new/raven-5.7.2/raven/base.py       2015-09-19 00:36:47.000000000 +0200
@@ -8,7 +8,6 @@
 
 from __future__ import absolute_import
 
-import base64
 import zlib
 import logging
 import os
@@ -274,7 +273,7 @@
 
     def build_msg(self, event_type, data=None, date=None,
                   time_spent=None, extra=None, stack=None, public_key=None,
-                  tags=None, **kwargs):
+                  tags=None, fingerprint=None, **kwargs):
         """
         Captures, processes and serializes an event into a dict object
 
@@ -376,6 +375,9 @@
         if culprit:
             data['culprit'] = culprit
 
+        if fingerprint:
+            data['fingerprint'] = fingerprint
+
         # Run the data through processors
         for processor in self.get_processors():
             data.update(processor.process(data))
@@ -626,6 +628,7 @@
         headers = {
             'User-Agent': client_string,
             'X-Sentry-Auth': auth_header,
+            'Content-Encoding': self.get_content_encoding(),
             'Content-Type': 'application/octet-stream',
         }
 
@@ -636,17 +639,20 @@
             **kwargs
         )
 
+    def get_content_encoding(self):
+        return 'deflate'
+
     def encode(self, data):
         """
         Serializes ``data`` into a raw string.
         """
-        return base64.b64encode(zlib.compress(json.dumps(data).encode('utf8')))
+        return zlib.compress(json.dumps(data).encode('utf8'))
 
     def decode(self, data):
         """
         Unserializes a string, ``data``.
         """
-        return 
json.loads(zlib.decompress(base64.b64decode(data)).decode('utf8'))
+        return json.loads(zlib.decompress(data).decode('utf8'))
 
     def captureMessage(self, message, **kwargs):
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/contrib/django/client.py 
new/raven-5.7.2/raven/contrib/django/client.py
--- old/raven-5.5.0/raven/contrib/django/client.py      2015-05-22 
02:57:56.000000000 +0200
+++ new/raven-5.7.2/raven/contrib/django/client.py      2015-09-19 
00:36:47.000000000 +0200
@@ -14,7 +14,13 @@
 from django.core.exceptions import SuspiciousOperation
 from django.http import HttpRequest
 from django.template import TemplateSyntaxError
-from django.template.loader import LoaderOrigin
+
+try:
+    # support Django 1.9
+    from django.template.base import Origin
+except ImportError:
+    # backward compatibility
+    from django.template.loader import LoaderOrigin as Origin
 
 from raven.base import Client
 from raven.contrib.django.utils import get_data_from_template, get_host
@@ -29,11 +35,10 @@
 
     def get_user_info(self, user):
         if not user.is_authenticated():
-            return {'is_authenticated': False}
+            return {}
 
         user_info = {
             'id': user.pk,
-            'is_authenticated': True,
         }
 
         if hasattr(user, 'email'):
@@ -148,7 +153,7 @@
             # As of r16833 (Django) all exceptions may contain a 
``django_template_source`` attribute (rather than the
             # legacy ``TemplateSyntaxError.source`` check) which describes 
template information.
             if hasattr(exc_value, 'django_template_source') or 
((isinstance(exc_value, TemplateSyntaxError) and
-               isinstance(getattr(exc_value, 'source', None), (tuple, list)) 
and isinstance(exc_value.source[0], LoaderOrigin))):
+               isinstance(getattr(exc_value, 'source', None), (tuple, list)) 
and isinstance(exc_value.source[0], Origin))):
                 source = getattr(exc_value, 'django_template_source', 
getattr(exc_value, 'source', None))
                 if source is None:
                     self.logger.info('Unable to get template source from 
exception')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/contrib/flask.py 
new/raven-5.7.2/raven/contrib/flask.py
--- old/raven-5.5.0/raven/contrib/flask.py      2015-07-22 16:57:31.000000000 
+0200
+++ new/raven-5.7.2/raven/contrib/flask.py      2015-09-19 00:36:47.000000000 
+0200
@@ -29,6 +29,7 @@
 from raven.handlers.logging import SentryHandler
 from raven.utils import six
 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
 
@@ -149,31 +150,27 @@
             return
 
         try:
-            is_authenticated = current_user.is_authenticated()
+            is_authenticated = current_user.is_authenticated
         except AttributeError:
             # HACK: catch the attribute error thrown by flask-login is not 
attached
             # >   current_user = LocalProxy(lambda: 
_request_ctx_stack.top.user)
             # E   AttributeError: 'RequestContext' object has no attribute 
'user'
             return {}
 
-        if is_authenticated:
-            user_info = {
-                'is_authenticated': True,
-                'is_anonymous': current_user.is_anonymous(),
-                'id': current_user.get_id(),
-            }
-
-            if 'SENTRY_USER_ATTRS' in current_app.config:
-                for attr in current_app.config['SENTRY_USER_ATTRS']:
-                    if hasattr(current_user, attr):
-                        user_info[attr] = getattr(current_user, attr)
-        else:
-            user_info = {
-                'is_authenticated': False,
-                'is_anonymous': current_user.is_anonymous(),
-            }
+        if callable(is_authenticated):
+            is_authenticated = is_authenticated()
+
+        if not is_authenticated:
+            return {}
 
-        return user_info
+        user_info = {
+            'id': current_user.get_id(),
+        }
+
+        if 'SENTRY_USER_ATTRS' in current_app.config:
+            for attr in current_app.config['SENTRY_USER_ATTRS']:
+                if hasattr(current_user, attr):
+                    user_info[attr] = getattr(current_user, attr)
 
     def get_http_info(self, request):
         """
@@ -219,11 +216,18 @@
 
     def before_request(self, *args, **kwargs):
         self.last_event_id = None
-        self.client.http_context(self.get_http_info(request))
-        self.client.user_context(self.get_user_info(request))
+        try:
+            self.client.http_context(self.get_http_info(request))
+        except Exception as e:
+            self.client.logger.exception(to_unicode(e))
+        try:
+            self.client.user_context(self.get_user_info(request))
+        except Exception as e:
+            self.client.logger.exception(to_unicode(e))
 
     def after_request(self, sender, response, *args, **kwargs):
-        response.headers['X-Sentry-ID'] = self.last_event_id
+        if self.last_event_id:
+            response.headers['X-Sentry-ID'] = self.last_event_id
         self.client.context.clear()
         return response
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/contrib/tornado/__init__.py 
new/raven-5.7.2/raven/contrib/tornado/__init__.py
--- old/raven-5.5.0/raven/contrib/tornado/__init__.py   2015-05-22 
02:57:56.000000000 +0200
+++ new/raven-5.7.2/raven/contrib/tornado/__init__.py   2015-09-19 
00:36:47.000000000 +0200
@@ -7,6 +7,9 @@
 """
 from __future__ import absolute_import
 
+from functools import partial
+
+from tornado import ioloop
 from tornado.httpclient import AsyncHTTPClient, HTTPError
 
 from raven.base import Client
@@ -27,7 +30,7 @@
         and extracts the keyword argument callback which will be called on
         asynchronous sending of the request
 
-        :return: a 32-length string identifying this event and checksum
+        :return: a 32-length string identifying this event
         """
         if not self.is_enabled():
             return
@@ -51,30 +54,25 @@
             headers = {}
 
         if not self.state.should_try():
-            message = self._get_log_message(data)
-            self.error_logger.error(message)
+            data = self.decode(data)
+            self._log_failed_submission(data)
             return
 
+        future = self._send_remote(
+            url=url, data=data, headers=headers, callback=callback
+        )
+        ioloop.IOLoop.current().add_future(future, 
partial(self._handle_result, url, data))
+        return future
+
+    def _handle_result(self, url, data, future):
         try:
-            self._send_remote(
-                url=url, data=data, headers=headers, callback=callback
-            )
+            future.result()
         except HTTPError as e:
-            body = e.response.body
-            self.error_logger.error(
-                'Unable to reach Sentry log server: %s '
-                '(url: %%s, body: %%s)' % (e,),
-                url, body, exc_info=True,
-                extra={'data': {'body': body, 'remote_url': url}}
-            )
+            data = self.decode(data)
+            self._failed_send(e, url, data)
         except Exception as e:
-            self.error_logger.error(
-                'Unable to reach Sentry log server: %s (url: %%s)' % (e,),
-                url, exc_info=True, extra={'data': {'remote_url': url}}
-            )
-            message = self._get_log_message(data)
-            self.error_logger.error('Failed to submit message: %r', message)
-            self.state.set_fail()
+            data = self.decode(data)
+            self._failed_send(e, url, data)
         else:
             self.state.set_success()
 
@@ -169,9 +167,13 @@
         `tornado.web.RequestHandler.get_current_user` tests postitively for on
         Truth calue testing
         """
+        try:
+            user = self.get_current_user()
+        except Exception:
+            return {}
         return {
             'user': {
-                'is_authenticated': True if self.get_current_user() else False
+                'is_authenticated': True if user else False
             }
         }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/contrib/zope/__init__.py 
new/raven-5.7.2/raven/contrib/zope/__init__.py
--- old/raven-5.5.0/raven/contrib/zope/__init__.py      2015-03-25 
00:29:49.000000000 +0100
+++ new/raven-5.7.2/raven/contrib/zope/__init__.py      2015-09-19 
00:36:47.000000000 +0200
@@ -96,11 +96,12 @@
                     setattr(record, 'request', http)
                     user = request.get('AUTHENTICATED_USER', None)
                     if user is not None and user != nobody:
-                        user_dict = dict(id=user.getId(),
-                                         is_authenticated=True,
-                                         email=user.getProperty('email') or '')
+                        user_dict = {
+                            'id': user.getId(),
+                            'email': user.getProperty('email') or '',
+                        }
                     else:
-                        user_dict = {'is_authenticated': False}
+                        user_dict = {}
                     setattr(record, 'user', user_dict)
                 except (AttributeError, KeyError):
                     logger.warning('Could not extract data from request', 
exc_info=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/handlers/logging.py 
new/raven-5.7.2/raven/handlers/logging.py
--- old/raven-5.5.0/raven/handlers/logging.py   2015-07-16 08:10:05.000000000 
+0200
+++ new/raven-5.7.2/raven/handlers/logging.py   2015-09-19 01:03:52.000000000 
+0200
@@ -116,7 +116,7 @@
                 continue
             if k.startswith('_'):
                 continue
-            if '.' not in k and k not in ('culprit', 'server_name'):
+            if '.' not in k and k not in ('culprit', 'server_name', 
'fingerprint'):
                 extra[k] = v
             else:
                 data[k] = v
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/transport/eventlet.py 
new/raven-5.7.2/raven/transport/eventlet.py
--- old/raven-5.5.0/raven/transport/eventlet.py 2015-01-09 21:53:49.000000000 
+0100
+++ new/raven-5.7.2/raven/transport/eventlet.py 2015-08-01 20:49:08.000000000 
+0200
@@ -13,7 +13,10 @@
 
 try:
     import eventlet
-    from eventlet.green import urllib2 as eventlet_urllib2
+    try:
+        from eventlet.green import urllib2 as eventlet_urllib2
+    except ImportError:
+        from eventlet.green.urllib import request as eventlet_urllib2
     has_eventlet = True
 except:
     has_eventlet = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/transport/tornado.py 
new/raven-5.7.2/raven/transport/tornado.py
--- old/raven-5.5.0/raven/transport/tornado.py  2015-05-14 01:30:13.000000000 
+0200
+++ new/raven-5.7.2/raven/transport/tornado.py  2015-09-19 00:36:47.000000000 
+0200
@@ -7,6 +7,9 @@
 """
 from __future__ import absolute_import
 
+from functools import partial
+
+from raven.transport.base import AsyncTransport
 from raven.transport.http import HTTPTransport
 
 try:
@@ -17,7 +20,7 @@
     has_tornado = False
 
 
-class TornadoHTTPTransport(HTTPTransport):
+class TornadoHTTPTransport(AsyncTransport, HTTPTransport):
 
     scheme = ['tornado+http', 'tornado+https']
 
@@ -27,7 +30,7 @@
 
         super(TornadoHTTPTransport, self).__init__(parsed_url, *args, **kwargs)
 
-    def send(self, data, headers):
+    def async_send(self, data, headers, success_cb, failure_cb):
         kwargs = dict(method='POST', headers=headers, body=data)
         kwargs["validate_cert"] = self.verify_ssl
         kwargs["connect_timeout"] = self.timeout
@@ -37,7 +40,21 @@
         if ioloop.IOLoop.initialized():
             client = AsyncHTTPClient()
             kwargs['callback'] = None
+
+            future = client.fetch(self._url, **kwargs)
+            ioloop.IOLoop.current().add_future(future, partial(self.handler, 
success_cb, failure_cb))
         else:
             client = HTTPClient()
-
-        client.fetch(self._url, **kwargs)
+            try:
+                client.fetch(self._url, **kwargs)
+                success_cb()
+            except Exception as e:
+                failure_cb(e)
+
+    @staticmethod
+    def handler(success, error, future):
+        try:
+            future.result()
+            success()
+        except Exception as e:
+            error(e)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/utils/__init__.py 
new/raven-5.7.2/raven/utils/__init__.py
--- old/raven-5.5.0/raven/utils/__init__.py     2015-01-09 21:53:49.000000000 
+0100
+++ new/raven-5.7.2/raven/utils/__init__.py     2015-09-19 00:36:47.000000000 
+0200
@@ -56,26 +56,30 @@
 
 
 def get_version_from_app(module_name, app):
+    version = None
     if hasattr(app, 'get_version'):
-        get_version = app.get_version
-        if callable(get_version):
-            version = get_version()
-        else:
-            version = get_version
+        version = app.get_version
     elif hasattr(app, '__version__'):
         version = app.__version__
     elif hasattr(app, 'VERSION'):
         version = app.VERSION
     elif hasattr(app, 'version'):
         version = app.version
-    elif pkg_resources:
+
+    if callable(version):
+        version = version()
+
+    if not isinstance(version, (six.string_types, list, tuple)):
+        version = None
+
+    if version is None:
+        if pkg_resources is None:
+            return None
         # pull version from pkg_resources if distro exists
         try:
             version = pkg_resources.get_distribution(module_name).version
         except pkg_resources.DistributionNotFound:
             return None
-    else:
-        return None
 
     if isinstance(version, (list, tuple)):
         version = '.'.join(map(str, version))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/utils/serializer/base.py 
new/raven-5.7.2/raven/utils/serializer/base.py
--- old/raven-5.5.0/raven/utils/serializer/base.py      2015-01-09 
21:53:49.000000000 +0100
+++ new/raven-5.7.2/raven/utils/serializer/base.py      2015-09-19 
00:36:47.000000000 +0200
@@ -50,10 +50,12 @@
         Given ``value``, recurse (using the parent serializer) to handle
         coercing of newly defined values.
         """
+        string_max_length = kwargs.get('string_max_length', None)
+
         _depth += 1
         if _depth >= max_depth:
             try:
-                value = six.text_type(repr(value))
+                value = six.text_type(repr(value))[:string_max_length]
             except Exception as e:
                 import traceback
                 traceback.print_exc()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/utils/stacks.py 
new/raven-5.7.2/raven/utils/stacks.py
--- old/raven-5.5.0/raven/utils/stacks.py       2015-01-09 21:53:49.000000000 
+0100
+++ new/raven-5.7.2/raven/utils/stacks.py       2015-09-19 00:36:47.000000000 
+0200
@@ -175,8 +175,54 @@
         yield frame, lineno
 
 
+def get_frame_locals(frame, transformer=transform, max_var_size=4096):
+    f_locals = getattr(frame, 'f_locals', None)
+    if not f_locals:
+        return None
+
+    if not isinstance(f_locals, dict):
+        # XXX: Genshi (and maybe others) have broken implementations of
+        # f_locals that are not actually dictionaries
+        try:
+            f_locals = to_dict(f_locals)
+        except Exception:
+            return None
+
+    f_vars = {}
+    f_size = 0
+    for k, v in six.iteritems(f_locals):
+        v = transformer(v)
+        v_size = len(repr(v))
+        if v_size + f_size < 4096:
+            f_vars[k] = v
+            f_size += v_size
+    return f_vars
+
+
+def slim_frame_data(frames, frame_allowance=25):
+    """
+    Removes various excess metadata from middle frames which go beyond
+    ``frame_allowance``.
+
+    Returns ``frames``.
+    """
+    frames_len = len(frames)
+
+    if frames_len <= frame_allowance:
+        return frames
+
+    half_max = int(frame_allowance / 2)
+
+    for n in range(half_max, frames_len - half_max):
+        # remove heavy components
+        frames[n].pop('vars', None)
+        frames[n].pop('pre_context', None)
+        frames[n].pop('post_context', None)
+    return frames
+
+
 def get_stack_info(frames, transformer=transform, capture_locals=True,
-                   max_frames=50):
+                   frame_allowance=25):
     """
     Given a list of frames, returns a list of stack information
     dictionary objects that are JSON-ready.
@@ -187,14 +233,8 @@
     """
     __traceback_hide__ = True  # NOQA
 
-    half_max = max_frames / 2
-
-    top_results = []
-    bottom_results = []
-
-    total_frames = 0
-
-    for frame_no, frame_info in enumerate(frames):
+    result = []
+    for frame_info in frames:
         # Old, terrible API
         if isinstance(frame_info, (list, tuple)):
             frame, lineno = frame_info
@@ -240,14 +280,6 @@
         if not filename:
             filename = abs_path
 
-        if capture_locals and not isinstance(f_locals, dict):
-            # XXX: Genshi (and maybe others) have broken implementations of
-            # f_locals that are not actually dictionaries
-            try:
-                f_locals = to_dict(f_locals)
-            except Exception:
-                capture_locals = False
-
         frame_result = {
             'abs_path': abs_path,
             'filename': filename,
@@ -256,10 +288,9 @@
             'lineno': lineno + 1,
         }
         if capture_locals:
-            frame_result['vars'] = dict(
-                (k, transformer(v))
-                for k, v in six.iteritems(f_locals)
-            )
+            f_vars = get_frame_locals(frame, transformer=transformer)
+            if f_vars:
+                frame_result['vars'] = f_vars
 
         if context_line is not None:
             frame_result.update({
@@ -267,19 +298,10 @@
                 'context_line': context_line,
                 'post_context': post_context,
             })
-
-        if frame_no >= half_max:
-            while len(bottom_results) > half_max - 1:
-                bottom_results.pop(0)
-            bottom_results.append(frame_result)
-        else:
-            top_results.append(frame_result)
-        total_frames += 1
+        result.append(frame_result)
 
     stackinfo = {
-        'frames': top_results + bottom_results,
+        'frames': slim_frame_data(result, frame_allowance=frame_allowance),
     }
-    if total_frames > max_frames:
-        stackinfo['frames_omitted'] = (half_max + 1, total_frames - half_max + 
1)
 
     return stackinfo
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven/versioning.py 
new/raven-5.7.2/raven/versioning.py
--- old/raven-5.5.0/raven/versioning.py 2015-02-19 18:56:34.000000000 +0100
+++ new/raven-5.7.2/raven/versioning.py 2015-09-19 00:36:47.000000000 +0200
@@ -1,22 +1,41 @@
 from __future__ import absolute_import
 
 import os.path
+
 try:
     import pkg_resources
 except ImportError:
     # pkg_resource is not available on Google App Engine
     pkg_resources = None
 
+from raven.utils import six
+
 from .exceptions import InvalidGitRepository
 
 __all__ = ('fetch_git_sha', 'fetch_package_version')
 
 
-def fetch_git_sha(path, head='master'):
+def fetch_git_sha(path, head=None):
     """
     >>> fetch_git_sha(os.path.dirname(__file__))
     """
-    revision_file = os.path.join(path, '.git', 'refs', 'heads', head)
+    if not head:
+        head_path = os.path.join(path, '.git', 'HEAD')
+        if not os.path.exists(head_path):
+            raise InvalidGitRepository('Cannot identify HEAD for git 
repository at %s' % (path,))
+
+        with open(head_path, 'r') as fp:
+            head = six.text_type(fp.read()).strip()
+
+        if head.startswith('ref: '):
+            revision_file = os.path.join(
+                path, '.git', *head.rsplit(' ', 1)[-1].split('/')
+            )
+        else:
+            revision_file = os.path.join(path, '.git', head)
+    else:
+        revision_file = os.path.join(path, '.git', 'refs', 'heads', head)
+
     if not os.path.exists(revision_file):
         if not os.path.exists(os.path.join(path, '.git')):
             raise InvalidGitRepository('%s does not seem to be the root of a 
git repository' % (path,))
@@ -24,7 +43,7 @@
 
     fh = open(revision_file, 'r')
     try:
-        return fh.read().strip()
+        return six.text_type(fh.read()).strip()
     finally:
         fh.close()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven.egg-info/PKG-INFO 
new/raven-5.7.2/raven.egg-info/PKG-INFO
--- old/raven-5.5.0/raven.egg-info/PKG-INFO     2015-07-22 17:02:20.000000000 
+0200
+++ new/raven-5.7.2/raven.egg-info/PKG-INFO     2015-09-19 01:06:55.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: raven
-Version: 5.5.0
+Version: 5.7.2
 Summary: Raven is a client for Sentry (https://www.getsentry.com)
 Home-page: https://github.com/getsentry/raven-python
 Author: David Cramer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven.egg-info/SOURCES.txt 
new/raven-5.7.2/raven.egg-info/SOURCES.txt
--- old/raven-5.5.0/raven.egg-info/SOURCES.txt  2015-07-22 17:02:21.000000000 
+0200
+++ new/raven-5.7.2/raven.egg-info/SOURCES.txt  2015-09-19 01:06:56.000000000 
+0200
@@ -17,6 +17,7 @@
 raven.egg-info/dependency_links.txt
 raven.egg-info/entry_points.txt
 raven.egg-info/not-zip-safe
+raven.egg-info/pbr.json
 raven.egg-info/requires.txt
 raven.egg-info/top_level.txt
 raven/conf/__init__.py
@@ -100,71 +101,134 @@
 raven/utils/serializer/base.py
 raven/utils/serializer/manager.py
 tests/__init__.py
+tests/__init__.pyc
 tests/base/__init__.py
+tests/base/__init__.pyc
 tests/base/tests.py
+tests/base/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/conf/__init__.py
+tests/conf/__init__.pyc
 tests/conf/tests.py
+tests/conf/__pycache__/tests.cpython-27-PYTEST.pyc
+tests/config/__init__.pyc
+tests/config/tests.pyc
 tests/context/__init__.py
+tests/context/__init__.pyc
 tests/context/tests.py
+tests/context/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/contrib/__init__.py
+tests/contrib/__init__.pyc
 tests/contrib/async/__init__.py
+tests/contrib/async/__init__.pyc
 tests/contrib/async/tests.py
+tests/contrib/async/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/contrib/bottle/__init__.py
+tests/contrib/bottle/__init__.pyc
 tests/contrib/bottle/tests.py
+tests/contrib/bottle/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/contrib/django/__init__.py
+tests/contrib/django/__init__.pyc
 tests/contrib/django/middleware.py
+tests/contrib/django/middleware.pyc
 tests/contrib/django/models.py
+tests/contrib/django/models.pyc
 tests/contrib/django/tests.py
 tests/contrib/django/urls.py
+tests/contrib/django/urls.pyc
 tests/contrib/django/views.py
+tests/contrib/django/views.pyc
+tests/contrib/django/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/contrib/django/templates/404.html
 tests/contrib/django/templates/__init__.py
 tests/contrib/django/templates/error.html
 tests/contrib/flask/__init__.py
+tests/contrib/flask/__init__.pyc
 tests/contrib/flask/tests.py
+tests/contrib/flask/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/contrib/pylons/__init__.py
+tests/contrib/pylons/__init__.pyc
 tests/contrib/pylons/tests.py
+tests/contrib/pylons/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/contrib/tornado/__init__.py
+tests/contrib/tornado/__init__.pyc
 tests/contrib/tornado/tests.py
+tests/contrib/tornado/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/contrib/webpy/__init__.py
+tests/contrib/webpy/__init__.pyc
 tests/contrib/webpy/tests.py
+tests/contrib/webpy/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/contrib/zerorpc/__init__.py
+tests/contrib/zerorpc/__init__.pyc
 tests/contrib/zerorpc/tests.py
+tests/contrib/zerorpc/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/events/__init__.py
 tests/functional/__init__.py
+tests/functional/__init__.pyc
 tests/functional/tests.py
+tests/functional/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/handlers/__init__.py
+tests/handlers/__init__.pyc
 tests/handlers/logbook/__init__.py
+tests/handlers/logbook/__init__.pyc
 tests/handlers/logbook/tests.py
+tests/handlers/logbook/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/handlers/logging/__init__.py
+tests/handlers/logging/__init__.pyc
 tests/handlers/logging/tests.py
+tests/handlers/logging/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/middleware/__init__.py
+tests/middleware/__init__.pyc
 tests/middleware/tests.py
+tests/middleware/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/processors/__init__.py
+tests/processors/__init__.pyc
 tests/processors/tests.py
+tests/processors/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/templates/sentry-tests/error.html
 tests/transport/__init__.py
+tests/transport/__init__.pyc
 tests/transport/tests.py
+tests/transport/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/transport/gevent/__init__.py
 tests/transport/gevent/tests.py
 tests/transport/requests/__init__.py
+tests/transport/requests/__init__.pyc
 tests/transport/requests/test_threaded_requests.py
 tests/transport/requests/tests.py
+tests/transport/requests/__pycache__/test_threaded_requests.cpython-27-PYTEST.pyc
+tests/transport/requests/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/transport/threaded/__init__.py
+tests/transport/threaded/__init__.pyc
 tests/transport/threaded/tests.py
+tests/transport/threaded/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/transport/tornado/__init__.py
+tests/transport/tornado/__init__.pyc
 tests/transport/tornado/tests.py
+tests/transport/tornado/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/utils/__init__.py
+tests/utils/__init__.pyc
 tests/utils/test_imports.py
 tests/utils/tests.py
+tests/utils/__pycache__/test_imports.cpython-27-PYTEST.pyc
+tests/utils/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/utils/encoding/__init__.py
+tests/utils/encoding/__init__.pyc
 tests/utils/encoding/tests.py
+tests/utils/encoding/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/utils/json/__init__.py
+tests/utils/json/__init__.pyc
 tests/utils/json/tests.py
+tests/utils/json/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/utils/stacks/__init__.py
+tests/utils/stacks/__init__.pyc
 tests/utils/stacks/tests.py
 tests/utils/stacks/utf8_file.txt
+tests/utils/stacks/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/utils/wsgi/__init__.py
+tests/utils/wsgi/__init__.pyc
 tests/utils/wsgi/tests.py
+tests/utils/wsgi/__pycache__/tests.cpython-27-PYTEST.pyc
 tests/versioning/__init__.py
-tests/versioning/tests.py
\ No newline at end of file
+tests/versioning/__init__.pyc
+tests/versioning/tests.py
+tests/versioning/__pycache__/tests.cpython-27-PYTEST.pyc
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven.egg-info/pbr.json 
new/raven-5.7.2/raven.egg-info/pbr.json
--- old/raven-5.5.0/raven.egg-info/pbr.json     1970-01-01 01:00:00.000000000 
+0100
+++ new/raven-5.7.2/raven.egg-info/pbr.json     2015-08-03 00:57:28.000000000 
+0200
@@ -0,0 +1 @@
+{"is_release": false, "git_version": "676c2ba"}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/raven.egg-info/requires.txt 
new/raven-5.7.2/raven.egg-info/requires.txt
--- old/raven-5.5.0/raven.egg-info/requires.txt 2015-07-22 17:02:20.000000000 
+0200
+++ new/raven-5.7.2/raven.egg-info/requires.txt 2015-09-19 01:06:55.000000000 
+0200
@@ -19,7 +19,8 @@
 pytz
 pytest>=2.7.0,<2.8.0
 pytest-cov>=1.4
-pytest-django>=2.8.0,<2.7.0
+pytest-django>=2.7.0,<2.8.0
+pytest-timeout==0.4
 requests
 tornado
 webob
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/setup.py new/raven-5.7.2/setup.py
--- old/raven-5.5.0/setup.py    2015-07-22 17:00:04.000000000 +0200
+++ new/raven-5.7.2/setup.py    2015-09-19 01:04:27.000000000 +0200
@@ -65,7 +65,8 @@
     'pytz',
     'pytest>=2.7.0,<2.8.0',
     'pytest-cov>=1.4',
-    'pytest-django>=2.8.0,<2.7.0',
+    'pytest-django>=2.7.0,<2.8.0',
+    'pytest-timeout==0.4',
     'requests',
     'tornado',
     'webob',
@@ -95,7 +96,7 @@
 
 setup(
     name='raven',
-    version='5.5.0',
+    version='5.7.2',
     author='David Cramer',
     author_email='[email protected]',
     url='https://github.com/getsentry/raven-python',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/test-requirements.txt 
new/raven-5.7.2/test-requirements.txt
--- old/raven-5.5.0/test-requirements.txt       2015-01-27 20:44:33.000000000 
+0100
+++ new/raven-5.7.2/test-requirements.txt       2015-08-04 02:16:37.000000000 
+0200
@@ -1,2 +1,3 @@
 pytest-django
+pytest-timeout
 -e .[dev,tests]
Files old/raven-5.5.0/tests/__init__.pyc and new/raven-5.7.2/tests/__init__.pyc 
differ
Files old/raven-5.5.0/tests/base/__init__.pyc and 
new/raven-5.7.2/tests/base/__init__.pyc differ
Files old/raven-5.5.0/tests/base/__pycache__/tests.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/base/__pycache__/tests.cpython-27-PYTEST.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/base/tests.py 
new/raven-5.7.2/tests/base/tests.py
--- old/raven-5.5.0/tests/base/tests.py 2015-07-16 08:13:04.000000000 +0200
+++ new/raven-5.7.2/tests/base/tests.py 2015-09-19 00:36:47.000000000 +0200
@@ -175,10 +175,11 @@
         })
         send_remote.assert_called_once_with(
             url='http://example.com/api/1/store/',
-            data=six.b('eJyrVkrLz1eyUlBKSixSqgUAIJgEVA=='),
+            data=client.encode({'foo': 'bar'}),
             headers={
                 'User-Agent': 'raven-python/%s' % (raven.VERSION,),
                 'Content-Type': 'application/octet-stream',
+                'Content-Encoding': client.get_content_encoding(),
                 'X-Sentry-Auth': (
                     'Sentry sentry_timestamp=1328055286.51, '
                     'sentry_client=raven-python/%s, sentry_version=6, '
@@ -199,11 +200,12 @@
         })
         send_remote.assert_called_once_with(
             url='http://example.com/api/1/store/',
-            data=six.b('eJyrVkrLz1eyUlBKSixSqgUAIJgEVA=='),
+            data=client.encode({'foo': 'bar'}),
             headers={
                 'User-Agent': 'raven-python/%s' % (raven.VERSION,),
                 'Content-Type': 'application/octet-stream',
-                'X-Sentry-Auth': 'foo'
+                'Content-Encoding': client.get_content_encoding(),
+                'X-Sentry-Auth': 'foo',
             },
         )
 
@@ -348,6 +350,16 @@
         assert 'stacktrace' not in event
         self.assertTrue('timestamp' in event)
 
+    def test_fingerprint(self):
+        self.client.captureMessage(
+            message='test',
+            fingerprint=['{{ default }}', 'foobar'],
+        )
+
+        assert len(self.client.events) == 1
+        event = self.client.events.pop(0)
+        assert event['fingerprint'] == ['{{ default }}', 'foobar']
+
     def test_context(self):
         self.client.context.merge({
             'tags': {'foo': 'bar'},
Files old/raven-5.5.0/tests/conf/__init__.pyc and 
new/raven-5.7.2/tests/conf/__init__.pyc differ
Files old/raven-5.5.0/tests/conf/__pycache__/tests.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/conf/__pycache__/tests.cpython-27-PYTEST.pyc differ
Files old/raven-5.5.0/tests/config/__init__.pyc and 
new/raven-5.7.2/tests/config/__init__.pyc differ
Files old/raven-5.5.0/tests/config/tests.pyc and 
new/raven-5.7.2/tests/config/tests.pyc differ
Files old/raven-5.5.0/tests/context/__init__.pyc and 
new/raven-5.7.2/tests/context/__init__.pyc differ
Files old/raven-5.5.0/tests/context/__pycache__/tests.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/context/__pycache__/tests.cpython-27-PYTEST.pyc differ
Files old/raven-5.5.0/tests/contrib/__init__.pyc and 
new/raven-5.7.2/tests/contrib/__init__.pyc differ
Files old/raven-5.5.0/tests/contrib/async/__init__.pyc and 
new/raven-5.7.2/tests/contrib/async/__init__.pyc differ
Files 
old/raven-5.5.0/tests/contrib/async/__pycache__/tests.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/contrib/async/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/contrib/bottle/__init__.pyc and 
new/raven-5.7.2/tests/contrib/bottle/__init__.pyc differ
Files 
old/raven-5.5.0/tests/contrib/bottle/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/contrib/bottle/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/contrib/django/__init__.pyc and 
new/raven-5.7.2/tests/contrib/django/__init__.pyc differ
Files 
old/raven-5.5.0/tests/contrib/django/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/contrib/django/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/contrib/django/middleware.pyc and 
new/raven-5.7.2/tests/contrib/django/middleware.pyc differ
Files old/raven-5.5.0/tests/contrib/django/models.pyc and 
new/raven-5.7.2/tests/contrib/django/models.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/contrib/django/tests.py 
new/raven-5.7.2/tests/contrib/django/tests.py
--- old/raven-5.5.0/tests/contrib/django/tests.py       2015-07-13 
01:57:54.000000000 +0200
+++ new/raven-5.7.2/tests/contrib/django/tests.py       2015-09-19 
00:36:47.000000000 +0200
@@ -193,7 +193,6 @@
             assert 'user' in event
             user_info = event['user']
             assert user_info == {
-                'is_authenticated': True,
                 'username': user.username,
                 'id': user.id,
                 'email': user.email,
@@ -217,7 +216,6 @@
         )
         user_info = self.raven.get_user_info(user)
         assert user_info == {
-            'is_authenticated': True,
             'username': user.username,
             'id': user.id,
             'email': user.email,
Files old/raven-5.5.0/tests/contrib/django/urls.pyc and 
new/raven-5.7.2/tests/contrib/django/urls.pyc differ
Files old/raven-5.5.0/tests/contrib/django/views.pyc and 
new/raven-5.7.2/tests/contrib/django/views.pyc differ
Files old/raven-5.5.0/tests/contrib/flask/__init__.pyc and 
new/raven-5.7.2/tests/contrib/flask/__init__.pyc differ
Files 
old/raven-5.5.0/tests/contrib/flask/__pycache__/tests.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/contrib/flask/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/contrib/pylons/__init__.pyc and 
new/raven-5.7.2/tests/contrib/pylons/__init__.pyc differ
Files 
old/raven-5.5.0/tests/contrib/pylons/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/contrib/pylons/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/contrib/tornado/__init__.pyc and 
new/raven-5.7.2/tests/contrib/tornado/__init__.pyc differ
Files 
old/raven-5.5.0/tests/contrib/tornado/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/contrib/tornado/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/contrib/tornado/tests.py 
new/raven-5.7.2/tests/contrib/tornado/tests.py
--- old/raven-5.5.0/tests/contrib/tornado/tests.py      2015-01-09 
21:53:49.000000000 +0100
+++ new/raven-5.7.2/tests/contrib/tornado/tests.py      2015-09-19 
00:36:47.000000000 +0200
@@ -3,6 +3,8 @@
 
 from mock import patch
 from tornado import web, gen, testing
+from tornado.concurrent import Future
+from tornado.httpclient import HTTPError
 from raven.contrib.tornado import SentryMixin, AsyncSentryClient
 from raven.utils import six
 
@@ -212,3 +214,26 @@
 
         user_data = kwargs['user']
         self.assertEqual(user_data['is_authenticated'], False)
+
+    @testing.gen_test
+    def test_sending_to_unresponsive_sentry_server_logs_error(self):
+        client = self.get_app().sentry_client
+        with patch.object(client, '_failed_send') as mock_failed:
+            client.send()
+
+            yield gen.sleep(0.01)  # we need to run after the async send
+            assert mock_failed.called
+
+    @testing.gen_test
+    def test_non_successful_responses_marks_client_as_failed(self):
+        client = self.get_app().sentry_client
+        with patch.object(client, '_failed_send') as mock_failed:
+            with patch.object(client, '_send_remote') as mock_send:
+
+                f = Future()
+                f.set_exception(HTTPError(499, 'error'))
+                mock_send.return_value = f
+                client.send()
+
+                yield gen.sleep(0.01)  # we need to run after the async send
+                assert mock_failed.called
Files old/raven-5.5.0/tests/contrib/webpy/__init__.pyc and 
new/raven-5.7.2/tests/contrib/webpy/__init__.pyc differ
Files 
old/raven-5.5.0/tests/contrib/webpy/__pycache__/tests.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/contrib/webpy/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/contrib/zerorpc/__init__.pyc and 
new/raven-5.7.2/tests/contrib/zerorpc/__init__.pyc differ
Files 
old/raven-5.5.0/tests/contrib/zerorpc/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/contrib/zerorpc/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/contrib/zerorpc/tests.py 
new/raven-5.7.2/tests/contrib/zerorpc/tests.py
--- old/raven-5.5.0/tests/contrib/zerorpc/tests.py      2015-07-16 
08:11:29.000000000 +0200
+++ new/raven-5.7.2/tests/contrib/zerorpc/tests.py      2015-09-19 
00:36:47.000000000 +0200
@@ -65,7 +65,7 @@
 
         self._client.choice([])
 
-        for attempt in xrange(0, 10):
+        for attempt in range(0, 10):
             gevent.sleep(0.1)
             if len(self._sentry.events):
                 exc = self._sentry.events[0]['exception']
Files old/raven-5.5.0/tests/functional/__init__.pyc and 
new/raven-5.7.2/tests/functional/__init__.pyc differ
Files old/raven-5.5.0/tests/functional/__pycache__/tests.cpython-27-PYTEST.pyc 
and new/raven-5.7.2/tests/functional/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/handlers/__init__.pyc and 
new/raven-5.7.2/tests/handlers/__init__.pyc differ
Files old/raven-5.5.0/tests/handlers/logbook/__init__.pyc and 
new/raven-5.7.2/tests/handlers/logbook/__init__.pyc differ
Files 
old/raven-5.5.0/tests/handlers/logbook/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/handlers/logbook/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/handlers/logging/__init__.pyc and 
new/raven-5.7.2/tests/handlers/logging/__init__.pyc differ
Files 
old/raven-5.5.0/tests/handlers/logging/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/handlers/logging/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/handlers/logging/tests.py 
new/raven-5.7.2/tests/handlers/logging/tests.py
--- old/raven-5.5.0/tests/handlers/logging/tests.py     2015-07-16 
08:11:44.000000000 +0200
+++ new/raven-5.7.2/tests/handlers/logging/tests.py     2015-09-19 
01:03:52.000000000 +0200
@@ -215,6 +215,30 @@
         event = self.client.events.pop(0)
         assert event['tags'] == {'foo': 'bar'}
 
+    def test_fingerprint_on_event(self):
+        record = self.make_record('Message', extra={'fingerprint': ['foo']})
+        self.handler.emit(record)
+
+        self.assertEqual(len(self.client.events), 1)
+        event = self.client.events.pop(0)
+        assert event['fingerprint'] == ['foo']
+
+    def test_culprit_on_event(self):
+        record = self.make_record('Message', extra={'culprit': 'foo'})
+        self.handler.emit(record)
+
+        self.assertEqual(len(self.client.events), 1)
+        event = self.client.events.pop(0)
+        assert event['culprit'] == 'foo'
+
+    def test_server_name_on_event(self):
+        record = self.make_record('Message', extra={'server_name': 'foo'})
+        self.handler.emit(record)
+
+        self.assertEqual(len(self.client.events), 1)
+        event = self.client.events.pop(0)
+        assert event['server_name'] == 'foo'
+
 
 class LoggingHandlerTest(TestCase):
     def test_client_arg(self):
Files old/raven-5.5.0/tests/middleware/__init__.pyc and 
new/raven-5.7.2/tests/middleware/__init__.pyc differ
Files old/raven-5.5.0/tests/middleware/__pycache__/tests.cpython-27-PYTEST.pyc 
and new/raven-5.7.2/tests/middleware/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/processors/__init__.pyc and 
new/raven-5.7.2/tests/processors/__init__.pyc differ
Files old/raven-5.5.0/tests/processors/__pycache__/tests.cpython-27-PYTEST.pyc 
and new/raven-5.7.2/tests/processors/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/transport/__init__.pyc and 
new/raven-5.7.2/tests/transport/__init__.pyc differ
Files old/raven-5.5.0/tests/transport/__pycache__/tests.cpython-27-PYTEST.pyc 
and new/raven-5.7.2/tests/transport/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/transport/requests/__init__.pyc and 
new/raven-5.7.2/tests/transport/requests/__init__.pyc differ
Files 
old/raven-5.5.0/tests/transport/requests/__pycache__/test_threaded_requests.cpython-27-PYTEST.pyc
 and 
new/raven-5.7.2/tests/transport/requests/__pycache__/test_threaded_requests.cpython-27-PYTEST.pyc
 differ
Files 
old/raven-5.5.0/tests/transport/requests/__pycache__/tests.cpython-27-PYTEST.pyc
 and 
new/raven-5.7.2/tests/transport/requests/__pycache__/tests.cpython-27-PYTEST.pyc
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/transport/tests.py 
new/raven-5.7.2/tests/transport/tests.py
--- old/raven-5.5.0/tests/transport/tests.py    2015-07-11 17:29:55.000000000 
+0200
+++ new/raven-5.7.2/tests/transport/tests.py    2015-09-19 00:36:47.000000000 
+0200
@@ -14,7 +14,6 @@
 import datetime
 import calendar
 import pytz
-import base64
 import zlib
 
 
@@ -58,8 +57,8 @@
 
         mock_cls = 
c._transport_cache['mock://some_username:some_password@localhost:8143/1'].get_transport()
 
-        expected_message = zlib.decompress(base64.b64decode(c.encode(data)))
-        actual_message = zlib.decompress(base64.b64decode(mock_cls._data))
+        expected_message = zlib.decompress(c.encode(data))
+        actual_message = zlib.decompress(mock_cls._data)
 
         # These loads()/dumps() pairs order the dict keys before comparing the 
string.
         # See GH504
Files old/raven-5.5.0/tests/transport/threaded/__init__.pyc and 
new/raven-5.7.2/tests/transport/threaded/__init__.pyc differ
Files 
old/raven-5.5.0/tests/transport/threaded/__pycache__/tests.cpython-27-PYTEST.pyc
 and 
new/raven-5.7.2/tests/transport/threaded/__pycache__/tests.cpython-27-PYTEST.pyc
 differ
Files old/raven-5.5.0/tests/transport/tornado/__init__.pyc and 
new/raven-5.7.2/tests/transport/tornado/__init__.pyc differ
Files 
old/raven-5.5.0/tests/transport/tornado/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/transport/tornado/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/transport/tornado/tests.py 
new/raven-5.7.2/tests/transport/tornado/tests.py
--- old/raven-5.5.0/tests/transport/tornado/tests.py    2015-01-09 
21:53:49.000000000 +0100
+++ new/raven-5.7.2/tests/transport/tornado/tests.py    2015-09-19 
00:36:47.000000000 +0200
@@ -3,10 +3,16 @@
 import mock
 
 from raven.base import Client
-from raven.utils.testutils import TestCase
+from tornado import gen, testing, httpclient
 
 
-class TornadoTransportTests(TestCase):
+class TornadoTransportTests(testing.AsyncTestCase):
+
+    def get_new_ioloop(self):
+        io_loop = super(TornadoTransportTests, self).get_new_ioloop()
+        io_loop.make_current()
+        return io_loop
+
     @mock.patch("raven.transport.tornado.HTTPClient")
     def test_send(self, fake_client):
         url = "https://user:pass@host:1234/1";
@@ -34,3 +40,24 @@
         self.assertEqual(kwargs["connect_timeout"], timeout)
         self.assertEqual(kwargs["validate_cert"], bool(verify_ssl))
         self.assertEqual(kwargs["ca_certs"], ca_certs)
+
+    @testing.gen_test
+    def test__sending_with_error_calls_error_callback(self):
+        c = Client(dsn='tornado+http://uver:pass@localhost:46754/1')
+
+        with mock.patch.object(Client, '_failed_send') as mock_failed:
+            c.captureMessage(message='test')
+            yield gen.sleep(0.01)  # we need to run after the async send
+
+            assert mock_failed.called
+
+    @testing.gen_test
+    def test__sending_successfully_calls_success_callback(self):
+        c = Client(dsn='tornado+http://uver:pass@localhost:46754/1')
+        with mock.patch.object(Client, '_successful_send') as mock_successful:
+            with mock.patch.object(httpclient.AsyncHTTPClient, 'fetch') as 
mock_fetch:
+                mock_fetch.return_value = gen.maybe_future(True)
+                c.captureMessage(message='test')
+                yield gen.sleep(0.01)  # we need to run after the async send
+
+                assert mock_successful.called
Files old/raven-5.5.0/tests/utils/__init__.pyc and 
new/raven-5.7.2/tests/utils/__init__.pyc differ
Files 
old/raven-5.5.0/tests/utils/__pycache__/test_imports.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/utils/__pycache__/test_imports.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/utils/__pycache__/tests.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/utils/__pycache__/tests.cpython-27-PYTEST.pyc differ
Files old/raven-5.5.0/tests/utils/encoding/__init__.pyc and 
new/raven-5.7.2/tests/utils/encoding/__init__.pyc differ
Files 
old/raven-5.5.0/tests/utils/encoding/__pycache__/tests.cpython-27-PYTEST.pyc 
and 
new/raven-5.7.2/tests/utils/encoding/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/utils/json/__init__.pyc and 
new/raven-5.7.2/tests/utils/json/__init__.pyc differ
Files old/raven-5.5.0/tests/utils/json/__pycache__/tests.cpython-27-PYTEST.pyc 
and new/raven-5.7.2/tests/utils/json/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/utils/stacks/__init__.pyc and 
new/raven-5.7.2/tests/utils/stacks/__init__.pyc differ
Files 
old/raven-5.5.0/tests/utils/stacks/__pycache__/tests.cpython-27-PYTEST.pyc and 
new/raven-5.7.2/tests/utils/stacks/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/utils/stacks/tests.py 
new/raven-5.7.2/tests/utils/stacks/tests.py
--- old/raven-5.5.0/tests/utils/stacks/tests.py 2015-01-09 21:53:49.000000000 
+0100
+++ new/raven-5.7.2/tests/utils/stacks/tests.py 2015-09-19 00:36:47.000000000 
+0200
@@ -73,28 +73,29 @@
             }
         assert result['vars'] == expected
 
-    def test_max_frames(self):
+    def test_frame_allowance(self):
         frames = []
         for x in range(10):
             frame = Mock()
-            frame.f_locals = {}
+            frame.f_locals = {'k': 'v'}
             frame.f_lineno = None
             frame.f_globals = {}
             frame.f_code.co_filename = str(x)
             frame.f_code.co_name = __name__
             frames.append((frame, 1))
 
-        results = get_stack_info(frames, max_frames=4)
-        assert results['frames_omitted'] == (3, 9)
-        assert len(results['frames']) == 4
+        results = get_stack_info(frames, frame_allowance=4)
+        assert len(results['frames']) == 10
         assert results['frames'][0]['filename'] == '0'
         assert results['frames'][1]['filename'] == '1'
-        assert results['frames'][2]['filename'] == '8'
-        assert results['frames'][3]['filename'] == '9'
+        for idx, frame in enumerate(results['frames'][2:8]):
+            assert frame['filename'] == str(idx + 2)
+            assert 'vars' not in frame
+        assert results['frames'][8]['filename'] == '8'
+        assert results['frames'][9]['filename'] == '9'
 
 
 class GetLineFromFileTest(TestCase):
-
     def test_non_ascii_file(self):
         import os.path
         filename = os.path.join(os.path.dirname(__file__), 'utf8_file.txt')
Files old/raven-5.5.0/tests/utils/wsgi/__init__.pyc and 
new/raven-5.7.2/tests/utils/wsgi/__init__.pyc differ
Files old/raven-5.5.0/tests/utils/wsgi/__pycache__/tests.cpython-27-PYTEST.pyc 
and new/raven-5.7.2/tests/utils/wsgi/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
Files old/raven-5.5.0/tests/versioning/__init__.pyc and 
new/raven-5.7.2/tests/versioning/__init__.pyc differ
Files old/raven-5.5.0/tests/versioning/__pycache__/tests.cpython-27-PYTEST.pyc 
and new/raven-5.7.2/tests/versioning/__pycache__/tests.cpython-27-PYTEST.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/raven-5.5.0/tests/versioning/tests.py 
new/raven-5.7.2/tests/versioning/tests.py
--- old/raven-5.5.0/tests/versioning/tests.py   2015-07-10 19:54:18.000000000 
+0200
+++ new/raven-5.7.2/tests/versioning/tests.py   2015-09-19 00:36:47.000000000 
+0200
@@ -2,6 +2,7 @@
 
 import os.path
 import pytest
+import subprocess
 
 from django.conf import settings
 
@@ -19,6 +20,9 @@
     assert result is not None
     assert len(result) == 40
     assert isinstance(result, six.string_types)
+    assert result == subprocess.check_output(
+        'git rev-parse --verify HEAD', shell=True, cwd=settings.PROJECT_ROOT
+    ).decode('latin1').strip()
 
 
 def test_fetch_package_version():


Reply via email to