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():
