Hello community, here is the log from the commit of package python-rollbar for openSUSE:Factory checked in at 2020-04-16 23:04:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-rollbar (Old) and /work/SRC/openSUSE:Factory/.python-rollbar.new.2738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-rollbar" Thu Apr 16 23:04:22 2020 rev:3 rq:794513 version:0.15.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-rollbar/python-rollbar.changes 2019-03-28 22:48:37.967055327 +0100 +++ /work/SRC/openSUSE:Factory/.python-rollbar.new.2738/python-rollbar.changes 2020-04-16 23:04:24.743736680 +0200 @@ -1,0 +2,8 @@ +Wed Apr 15 16:06:40 UTC 2020 - Marketa Calabkova <[email protected]> + +- update to 0.15.0 + * Prevent recursive re-raising + * Correctly apply logger formatting + * Fix deprecation warnings + +------------------------------------------------------------------- Old: ---- v0.14.7.tar.gz New: ---- v0.15.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-rollbar.spec ++++++ --- /var/tmp/diff_new_pack.gJA47E/_old 2020-04-16 23:04:25.279737157 +0200 +++ /var/tmp/diff_new_pack.gJA47E/_new 2020-04-16 23:04:25.283737160 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-rollbar # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,24 +17,27 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} +%bcond_without python2 Name: python-rollbar -Version: 0.14.7 +Version: 0.15.0 Release: 0 Summary: Python notifier for reporting exceptions, errors, and log messages to Rollbar License: MIT Group: Development/Languages/Python -Url: https://github.com/rollbar/pyrollbar +URL: https://github.com/rollbar/pyrollbar Source: https://github.com/rollbar/pyrollbar/archive/v%{version}.tar.gz BuildRequires: %{python_module WebOb} BuildRequires: %{python_module blinker} -BuildRequires: %{python_module mock} BuildRequires: %{python_module requests >= 0.12.1} BuildRequires: %{python_module setuptools} BuildRequires: %{python_module six >= 1.9.0} BuildRequires: %{python_module unittest2} BuildRequires: fdupes BuildRequires: python-rpm-macros +%if %{with python2} BuildRequires: python2-enum34 +BuildRequires: python2-mock +%endif Requires: python-requests >= 0.12.1 Requires: python-setuptools Requires: python-six >= 1.9.0 ++++++ v0.14.7.tar.gz -> v0.15.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/.gitignore new/pyrollbar-0.15.0/.gitignore --- old/pyrollbar-0.14.7/.gitignore 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/.gitignore 2020-04-04 02:08:37.000000000 +0200 @@ -10,3 +10,4 @@ Pipfile Pipfile.lock .pytest_cache/ +.python-version diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/.travis.yml new/pyrollbar-0.15.0/.travis.yml --- old/pyrollbar-0.14.7/.travis.yml 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/.travis.yml 2020-04-04 02:08:37.000000000 +0200 @@ -9,31 +9,45 @@ - python: "2.7" env: FLASK_VERSION=0.11.1 - python: "2.7" - env: FLASK_VERSION=0.12.2 + env: FLASK_VERSION=0.12.4 + - python: "2.7" + env: FLASK_VERSION=1.0.2 - python: "3.3" + dist: trusty env: FLASK_VERSION=0.10.1 - python: "3.3" + dist: trusty env: FLASK_VERSION=0.11.1 - python: "3.3" - env: FLASK_VERSION=0.12.2 + dist: trusty + env: FLASK_VERSION=0.12.4 + - python: "3.3" + dist: trusty + env: FLASK_VERSION=1.0.2 - python: "3.4" env: FLASK_VERSION=0.10.1 - python: "3.4" env: FLASK_VERSION=0.11.1 - python: "3.4" - env: FLASK_VERSION=0.12.2 + env: FLASK_VERSION=0.12.4 + - python: "3.4" + env: FLASK_VERSION=1.0.2 - python: "3.5" env: FLASK_VERSION=0.10.1 - python: "3.5" env: FLASK_VERSION=0.11.1 - - python: "3.4" - env: FLASK_VERSION=0.12.2 + - python: "3.5" + env: FLASK_VERSION=0.12.4 + - python: "3.5" + env: FLASK_VERSION=1.0.2 - python: "3.6" env: FLASK_VERSION=0.10.1 - python: "3.6" env: FLASK_VERSION=0.11.1 - python: "3.6" - env: FLASK_VERSION=0.12.2 + env: FLASK_VERSION=0.12.4 + - python: "3.6" + env: FLASK_VERSION=1.0.2 - python: "2.7" env: TWISTED_VERSION=15.5.0 @@ -57,46 +71,70 @@ - python: "2.7" env: DJANGO_VERSION=1.7.11 - python: "2.7" - env: DJANGO_VERSION=1.8.18 + env: DJANGO_VERSION=1.8.19 - python: "2.7" env: DJANGO_VERSION=1.9.13 - python: "2.7" - env: DJANGO_VERSION=1.10.7 + env: DJANGO_VERSION=1.10.8 - python: "2.7" - env: DJANGO_VERSION=1.11.1 + env: DJANGO_VERSION=1.11.20 - python: "3.3" + dist: trusty env: DJANGO_VERSION=1.6.11 - python: "3.3" - env: DJANGO_VERSION=1.8.18 + dist: trusty + env: DJANGO_VERSION=1.8.19 - python: "3.4" env: DJANGO_VERSION=1.7.11 - python: "3.4" - env: DJANGO_VERSION=1.8.18 + env: DJANGO_VERSION=1.8.19 - python: "3.4" env: DJANGO_VERSION=1.9.13 - python: "3.4" - env: DJANGO_VERSION=1.10.7 + env: DJANGO_VERSION=1.10.8 - python: "3.4" - env: DJANGO_VERSION=1.11.1 + env: DJANGO_VERSION=1.11.20 + - python: "3.4" + env: DJANGO_VERSION=2.0.13 - python: "3.5" - env: DJANGO_VERSION=1.8.18 + env: DJANGO_VERSION=1.8.19 - python: "3.5" env: DJANGO_VERSION=1.9.13 - python: "3.5" - env: DJANGO_VERSION=1.10.7 + env: DJANGO_VERSION=1.10.8 + - python: "3.5" + env: DJANGO_VERSION=1.11.20 + - python: "3.5" + env: DJANGO_VERSION=2.0.13 - python: "3.5" - env: DJANGO_VERSION=1.11.1 + env: DJANGO_VERSION=2.1.7 - python: "3.6" - env: DJANGO_VERSION=1.11.1 + env: DJANGO_VERSION=1.11.20 + - python: "3.6" + env: DJANGO_VERSION=2.0.13 + - python: "3.6" + env: DJANGO_VERSION=2.1.7 + + - python: "3.7" + env: DJANGO_VERSION=1.11.20 + dist: xenial + - python: "3.7" + env: DJANGO_VERSION=2.0.13 + dist: xenial + - python: "3.7" + env: DJANGO_VERSION=2.1.7 + dist: xenial - python: "3.6" env: PYRAMID_VERSION=1.9.2 install: + - pip install setuptools==39.2.0 --force-reinstall + - if [ $TRAVIS_PYTHON_VERSION == 3.3 ]; then pip install Werkzeug==0.14.1 --force-reinstall; fi - if [ -v FLASK_VERSION ]; then pip install Flask==$FLASK_VERSION; fi - if [ -v TWISTED_VERSION ]; then pip install Twisted==$TWISTED_VERSION treq; fi - if [ -v DJANGO_VERSION ]; then pip install Django==$DJANGO_VERSION; fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/__init__.py new/pyrollbar-0.15.0/rollbar/__init__.py --- old/pyrollbar-0.14.7/rollbar/__init__.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/__init__.py 2020-04-04 02:08:37.000000000 +0200 @@ -25,7 +25,7 @@ from rollbar.lib import events, filters, dict_merge, parse_qs, text, transport, urljoin, iteritems, defaultJSONEncode -__version__ = '0.14.7' +__version__ = '0.15.0' __log_name__ = 'rollbar' log = logging.getLogger(__log_name__) @@ -265,6 +265,9 @@ 'http_proxy_user': None, 'http_proxy_password': None, 'include_request_body': False, + 'request_pool_connections': None, + 'request_pool_maxsize': None, + 'request_max_retries': None, } _CURRENT_LAMBDA_CONTEXT = None @@ -319,6 +322,7 @@ SETTINGS['access_token'] = access_token SETTINGS['environment'] = environment + _configure_transport(**SETTINGS) if SETTINGS.get('allow_logging_basic_config'): logging.basicConfig() @@ -370,6 +374,20 @@ _initialized = True +def _configure_transport(**kw): + configuration = _requests_configuration(**kw) + transport.configure_pool(**configuration) + + +def _requests_configuration(**kw): + keys = { + 'request_pool_connections': 'pool_connections', + 'request_pool_maxsize': 'pool_maxsize', + 'request_max_retries': 'max_retries', + } + return {keys[k]: kw.get(k, None) for k in keys} + + def lambda_function(f): """ Decorator for making error handling on AWS Lambda easier @@ -696,11 +714,16 @@ def _walk_trace_chain(cls, exc, trace): trace_chain = [_trace_data(cls, exc, trace)] + seen_exceptions = {exc} + while True: exc = getattr(exc, '__cause__', None) or getattr(exc, '__context__', None) if not exc: break trace_chain.append(_trace_data(type(exc), exc, getattr(exc, '__traceback__', None))) + if exc in seen_exceptions: + break + seen_exceptions.add(exc) return trace_chain @@ -826,11 +849,7 @@ """ if hasattr(request, 'rollbar_person'): rollbar_person_prop = request.rollbar_person - try: - person = rollbar_person_prop() - except TypeError: - person = rollbar_person_prop - + person = rollbar_person_prop() if callable(rollbar_person_prop) else rollbar_person_prop if person and isinstance(person, dict): return person else: @@ -838,11 +857,7 @@ if hasattr(request, 'user'): user_prop = request.user - try: - user = user_prop() - except TypeError: - user = user_prop - + user = user_prop() if callable(user_prop) else user_prop if not user: return None elif isinstance(user, dict): @@ -866,11 +881,7 @@ if hasattr(request, 'user_id'): user_id_prop = request.user_id - try: - user_id = user_id_prop() - except TypeError: - user_id = user_id_prop - + user_id = user_id_prop() if callable(user_id_prop) else user_id_prop if not user_id: return None return {'id': text(user_id)} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/contrib/django/middleware.py new/pyrollbar-0.15.0/rollbar/contrib/django/middleware.py --- old/pyrollbar-0.14.7/rollbar/contrib/django/middleware.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/contrib/django/middleware.py 2020-04-04 02:08:37.000000000 +0200 @@ -1,4 +1,4 @@ -""" +r""" django-rollbar middleware There are two options for installing the Rollbar middleware. Both options @@ -36,7 +36,7 @@ ROLLBAR = { 'access_token': 'YOUR_TOKEN', 'ignorable_404_urls': ( - re.compile('/index\.php'), + re.compile(r'/index\.php'), re.compile('/foobar'), ), } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/lib/transport.py new/pyrollbar-0.15.0/rollbar/lib/transport.py --- old/pyrollbar-0.14.7/rollbar/lib/transport.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/lib/transport.py 2020-04-04 02:08:37.000000000 +0200 @@ -28,6 +28,17 @@ } +def configure_pool(**kw): + keys = ['pool_connections', 'pool_maxsize', 'max_retries'] + args = {k: kw[k] for k in keys if kw.get(k, None) is not None} + if len(args) == 0: + return + https_adapter = requests.adapters.HTTPAdapter(**args) + http_adapter = requests.adapters.HTTPAdapter(**args) + _session().mount('https://', https_adapter) + _session().mount('http://', http_adapter) + + def post(*args, **kw): proxies = _get_proxy_cfg(kw) return _session().post(*args, proxies=proxies, **kw) @@ -38,4 +49,4 @@ return _session().get(*args, proxies=proxies, **kw) -__all__ = ['post', 'get'] +__all__ = ['post', 'get', 'configure_pool'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/logger.py new/pyrollbar-0.15.0/rollbar/logger.py --- old/pyrollbar-0.14.7/rollbar/logger.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/logger.py 2020-04-04 02:08:37.000000000 +0200 @@ -139,7 +139,7 @@ extra_data=extra_data, payload_data=payload_data) else: - uuid = rollbar.report_message(record.msg, + uuid = rollbar.report_message(record.getMessage(), level=level, request=request, extra_data=extra_data, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/test/flask_tests/test_flask.py new/pyrollbar-0.15.0/rollbar/test/flask_tests/test_flask.py --- old/pyrollbar-0.14.7/rollbar/test/flask_tests/test_flask.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/test/flask_tests/test_flask.py 2020-04-04 02:08:37.000000000 +0200 @@ -6,7 +6,11 @@ import sys import os -import mock +try: + from unittest import mock +except ImportError: + import mock + import rollbar from rollbar.test import BaseTest @@ -98,7 +102,15 @@ self.assertIn('request', data) self.assertEqual(data['request']['url'], 'http://localhost/cause_error?foo=bar') - self.assertDictEqual(data['request']['GET'], {'foo': ['bar']}) + + # The behavior of implicitly converting werkzeug.ImmutableMultiDict + # using dict() changes starting in Python 3.6. + # See _build_werkzeug_request_data() + if sys.version_info >= (3, 6): + self.assertDictEqual(data['request']['GET'], {'foo': 'bar'}) + else: + self.assertDictEqual(data['request']['GET'], {'foo': ['bar']}) + self.assertEqual(data['request']['user_ip'], '1.2.3.4') self.assertEqual(data['request']['method'], 'GET') self.assertEqual(data['request']['headers']['User-Agent'], 'Flask Test') @@ -153,7 +165,15 @@ self.assertIn('request', data) self.assertEqual(data['request']['url'], 'http://localhost/cause_error?foo=bar') - self.assertDictEqual(data['request']['GET'], {'foo': ['bar']}) + + # The behavior of implicitly converting werkzeug.ImmutableMultiDict + # using dict() changes starting in Python 3.6. + # See _build_werkzeug_request_data() + if sys.version_info >= (3, 6): + self.assertDictEqual(data['request']['GET'], {'foo': 'bar'}) + else: + self.assertDictEqual(data['request']['GET'], {'foo': ['bar']}) + self.assertEqual(data['request']['user_ip'], '1.2.3.4') self.assertEqual(data['request']['method'], 'GET') self.assertEqual(data['request']['headers']['User-Agent'], 'Flask Test') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/test/test_loghandler.py new/pyrollbar-0.15.0/rollbar/test/test_loghandler.py --- old/pyrollbar-0.14.7/rollbar/test/test_loghandler.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/test/test_loghandler.py 2020-04-04 02:08:37.000000000 +0200 @@ -4,9 +4,13 @@ import copy import json import logging -import mock import sys +try: + from unittest import mock +except ImportError: + import mock + import rollbar from rollbar.logger import RollbarHandler @@ -38,13 +42,13 @@ return logger @mock.patch('rollbar.send_payload') - def test_message_stays_unformatted(self, send_payload): + def test_message_gets_formatted(self, send_payload): logger = self._create_logger() logger.warning("Hello %d %s", 1, 'world') payload = send_payload.call_args[0][0] - self.assertEqual(payload['data']['body']['message']['body'], "Hello %d %s") + self.assertEqual(payload['data']['body']['message']['body'], "Hello 1 world") self.assertEqual(payload['data']['body']['message']['args'], (1, 'world')) self.assertEqual(payload['data']['body']['message']['record']['name'], __name__) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/test/test_pyramid.py new/pyrollbar-0.15.0/rollbar/test/test_pyramid.py --- old/pyrollbar-0.14.7/rollbar/test/test_pyramid.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/test/test_pyramid.py 2020-04-04 02:08:37.000000000 +0200 @@ -1,4 +1,7 @@ -import mock +try: + from unittest import mock +except ImportError: + import mock from rollbar.test import BaseTest diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/test/test_rollbar.py new/pyrollbar-0.15.0/rollbar/test/test_rollbar.py --- old/pyrollbar-0.14.7/rollbar/test/test_rollbar.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/test/test_rollbar.py 2020-04-04 02:08:37.000000000 +0200 @@ -1,13 +1,18 @@ import base64 import copy import json -import mock import socket +import threading import uuid import sys try: + from unittest import mock +except ImportError: + import mock + +try: from StringIO import StringIO except ImportError: from io import StringIO @@ -281,6 +286,67 @@ self.assertEqual(payload['data']['body']['trace_chain'][1]['frames'][-1]['locals']['bar_local'], 'bar') @mock.patch('rollbar.send_payload') + def test_report_exception_with_same_exception_as_cause(self, send_payload): + cause_exc = CauseException('bar') + + def _raise_cause(): + bar_local = 'bar' + raise cause_exc + + def _raise_ex(): + try: + _raise_cause() + except CauseException as cause: + # python2 won't automatically assign this traceback... + exc_info = sys.exc_info() + setattr(cause, '__traceback__', exc_info[2]) + + try: + foo_local = 'foo' + # in python3 this would normally be expressed as + # raise cause from cause + setattr(cause, '__cause__', cause) # PEP-3134 + raise cause + except: + rollbar.report_exc_info() + + ex_raiser = threading.Thread(target=_raise_ex) + ex_raiser.daemon = True + ex_raiser.start() + # 0.5 seconds ought be enough for any modern computer to get into the + # cyclical parts of the code, but not so long as to collect a lot of + # objects in memory + ex_raiser.join(timeout=0.5) + + if ex_raiser.is_alive(): + # This breaks the circular reference, allowing thread to exit and + # to be joined + cause_exc.__cause__ = None + ex_raiser.join() + self.fail('Cyclic reference in rollbar._walk_trace_chain()') + + self.assertEqual(send_payload.called, True) + + payload = send_payload.call_args[0][0] + + self.assertEqual(payload['access_token'], _test_access_token) + self.assertIn('body', payload['data']) + self.assertNotIn('trace', payload['data']['body']) + self.assertIn('trace_chain', payload['data']['body']) + self.assertEqual(2, len(payload['data']['body']['trace_chain'])) + + self.assertIn('exception', payload['data']['body']['trace_chain'][0]) + self.assertEqual(payload['data']['body']['trace_chain'][0]['exception']['message'], 'bar') + self.assertEqual(payload['data']['body']['trace_chain'][0]['exception']['class'], 'CauseException') + frames = payload['data']['body']['trace_chain'][0]['frames'] + self.assertEqual(payload['data']['body']['trace_chain'][0]['frames'][0]['locals']['foo_local'], 'foo') + + self.assertIn('exception', payload['data']['body']['trace_chain'][1]) + self.assertEqual(payload['data']['body']['trace_chain'][1]['exception']['message'], 'bar') + self.assertEqual(payload['data']['body']['trace_chain'][1]['exception']['class'], 'CauseException') + self.assertEqual(payload['data']['body']['trace_chain'][1]['frames'][-1]['locals']['bar_local'], 'bar') + + @mock.patch('rollbar.send_payload') def test_report_exception_with_context(self, send_payload): def _raise_context(): bar_local = 'bar' @@ -620,7 +686,7 @@ varargs = payload['data']['body']['trace']['frames'][-1]['varargspec'] self.assertEqual(1, len(payload['data']['body']['trace']['frames'][-1]['locals'][varargs])) - self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals'][varargs][0], '\*+') + self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals'][varargs][0], r'\*+') @mock.patch('rollbar.send_payload') def test_args_lambda_with_star_args_and_args(self, send_payload): @@ -647,8 +713,8 @@ self.assertEqual('arg1-value', payload['data']['body']['trace']['frames'][-1]['locals']['arg1']) self.assertEqual(2, len(payload['data']['body']['trace']['frames'][-1]['locals'][varargs])) - self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals'][varargs][0], '\*+') - self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals'][varargs][1], '\*+') + self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals'][varargs][0], r'\*+') + self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals'][varargs][1], r'\*+') @mock.patch('rollbar.send_payload') def test_args_lambda_with_kwargs(self, send_payload): @@ -811,7 +877,7 @@ self.assertEqual(2, len(payload['data']['body']['trace']['frames'][-1]['argspec'])) self.assertEqual('password', payload['data']['body']['trace']['frames'][-1]['argspec'][0]) - self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals']['password'], '\*+') + self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals']['password'], r'\*+') self.assertEqual('clear', payload['data']['body']['trace']['frames'][-1]['argspec'][1]) self.assertEqual('text', payload['data']['body']['trace']['frames'][-1]['locals']['clear']) @@ -865,7 +931,7 @@ self.assertEqual(2, len(payload['data']['body']['trace']['frames'][-1]['locals'][keywords])) self.assertIn('password', payload['data']['body']['trace']['frames'][-1]['locals'][keywords]) - self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals'][keywords]['password'], '\*+') + self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals'][keywords]['password'], r'\*+') self.assertIn('clear', payload['data']['body']['trace']['frames'][-1]['locals'][keywords]) self.assertEqual('text', payload['data']['body']['trace']['frames'][-1]['locals'][keywords]['clear']) @@ -896,8 +962,8 @@ payload = send_payload.call_args[0][0] - self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals']['password'], '\*+') - self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals']['Password'], '\*+') + self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals']['password'], r'\*+') + self.assertRegex(payload['data']['body']['trace']['frames'][-1]['locals']['Password'], r'\*+') self.assertIn('_invalid', payload['data']['body']['trace']['frames'][-1]['locals']) binary_type_name = 'str' if python_major_version() < 3 else 'bytes' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/rollbar/test/twisted_tests/test_twisted.py new/pyrollbar-0.15.0/rollbar/test/twisted_tests/test_twisted.py --- old/pyrollbar-0.14.7/rollbar/test/twisted_tests/test_twisted.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/rollbar/test/twisted_tests/test_twisted.py 2020-04-04 02:08:37.000000000 +0200 @@ -5,7 +5,11 @@ import json import sys -import mock +try: + from unittest import mock +except ImportError: + import mock + import rollbar # access token for https://rollbar.com/rollbar/pyrollbar diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pyrollbar-0.14.7/setup.py new/pyrollbar-0.15.0/setup.py --- old/pyrollbar-0.14.7/setup.py 2019-03-01 22:55:46.000000000 +0100 +++ new/pyrollbar-0.15.0/setup.py 2020-04-04 02:08:37.000000000 +0200 @@ -18,7 +18,6 @@ VERSION = re.search(r"^__version__ = ['\"]([^'\"]+)['\"]", INIT_DATA, re.MULTILINE).group(1) tests_require = [ - 'mock', 'webob', 'blinker', 'unittest2' @@ -26,6 +25,7 @@ version = sys.version_info if version[0] == 2 or (version[0] == 3 and version[1] < 4): + tests_require.append('mock<=3.0.5') # mock > 3.0.5 requires python >= 3.5 tests_require.append('enum34') setup( @@ -55,6 +55,8 @@ "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Development Status :: 5 - Production/Stable",
