From 4934771b3f0ba69d4882b36389eb3e0b5ab74b43 Mon Sep 17 00:00:00 2001 From: Sven-Hendrik Haase Date: Mon, 30 Mar 2015 17:14:38 +0200 Subject: [PATCH] Fixes #412 and also enable python 3.4 testing with flask --- conftest.py | 6 ++---- raven/contrib/flask.py | 9 ++++++++- tests/contrib/flask/tests.py | 18 +++++++++++++----- tox.ini | 2 +- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/conftest.py b/conftest.py index f333890a..09317ede 100644 --- a/conftest.py +++ b/conftest.py @@ -4,10 +4,8 @@ import sys collect_ignore = [] -if sys.version_info[0] > 2: - collect_ignore.append("tests/contrib/flask") - if sys.version_info[1] == 2: - collect_ignore.append("tests/handlers/logbook") +if sys.version_info[0] > 2 and sys.version_info[1] == 2: + collect_ignore.append("tests/handlers/logbook") try: import gevent diff --git a/raven/contrib/flask.py b/raven/contrib/flask.py index dc5c2685..d0f13001 100644 --- a/raven/contrib/flask.py +++ b/raven/contrib/flask.py @@ -94,7 +94,7 @@ class Sentry(object): # TODO(dcramer): the client isn't using local context and therefore # gets shared by every app that does init on it def __init__(self, app=None, client=None, client_cls=Client, dsn=None, - logging=False, level=logging.NOTSET, wrap_wsgi=True, + logging=False, level=logging.NOTSET, wrap_wsgi=None, register_signal=True): self.dsn = dsn self.logging = logging @@ -205,6 +205,13 @@ class Sentry(object): if wrap_wsgi is not None: self.wrap_wsgi = wrap_wsgi + else: + # Fix https://github.com/getsentry/raven-python/issues/412 + # the gist is that we get errors twice in debug mode if we don't do this + if app and app.debug: + self.wrap_wsgi = False + else: + self.wrap_wsgi = True if register_signal is not None: self.register_signal = register_signal diff --git a/tests/contrib/flask/tests.py b/tests/contrib/flask/tests.py index ea9183cb..d1df979f 100644 --- a/tests/contrib/flask/tests.py +++ b/tests/contrib/flask/tests.py @@ -29,11 +29,12 @@ class User(AnonymousUserMixin): get_id = lambda x: 1 -def create_app(ignore_exceptions=None): +def create_app(ignore_exceptions=None, debug=False): import os app = Flask(__name__) app.config['SECRET_KEY'] = os.urandom(40) + app.debug = debug if ignore_exceptions: app.config['RAVEN_IGNORE_EXCEPTIONS'] = ignore_exceptions @@ -91,7 +92,7 @@ class BaseTest(TestCase): app = create_app(*args, **kwargs) raven = TempStoreClient() Sentry(app, client=raven) - return app.test_client(), raven + return app.test_client(), raven, app class FlaskTest(BaseTest): @@ -203,22 +204,29 @@ class FlaskTest(BaseTest): http = event['request'] self.assertEqual({}, http.get('data')) + def test_wrap_wsgi_status(self): + _, _, app_debug = self.make_client_and_raven(debug=True) + self.assertFalse(app_debug.extensions['sentry'].wrap_wsgi) + + _, _, app_ndebug = self.make_client_and_raven(debug=False) + self.assertTrue(app_ndebug.extensions['sentry'].wrap_wsgi) + def test_error_handler_with_ignored_exception(self): - client, raven = self.make_client_and_raven(ignore_exceptions=[NameError, ValueError]) + client, raven, _ = self.make_client_and_raven(ignore_exceptions=[NameError, ValueError]) response = client.get('/an-error/') self.assertEquals(response.status_code, 500) self.assertEquals(len(raven.events), 0) def test_error_handler_with_exception_not_ignored(self): - client, raven = self.make_client_and_raven(ignore_exceptions=[NameError, KeyError]) + client, raven, _ = self.make_client_and_raven(ignore_exceptions=[NameError, KeyError]) response = client.get('/an-error/') self.assertEquals(response.status_code, 500) self.assertEquals(len(raven.events), 1) def test_error_handler_with_empty_ignore_exceptions_list(self): - client, raven = self.make_client_and_raven(ignore_exceptions=[]) + client, raven, _ = self.make_client_and_raven(ignore_exceptions=[]) response = client.get('/an-error/') self.assertEquals(response.status_code, 500) diff --git a/tox.ini b/tox.ini index f0fa0677..41d42e08 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py26, py27, py30, py31, py32, py33, pypy +envlist = py26, py27, py30, py31, py32, py33, py34, pypy [testenv] commands =